import React, { useState } from 'react';
import axios from 'axios';
import { Button } from 'react-bootstrap';
import { Download } from 'lucide-react';
import { SipsResponse } from '../../types';

interface Props {
    result: SipsResponse;
}

const resolveFilename = (contentDisposition?: string): string => {
    const encodedMatch = contentDisposition?.match(/filename\*=UTF-8''([^;]+)/i);
    const plainMatch = contentDisposition?.match(/filename="?([^";]+)"?/i);

    return decodeURIComponent(encodedMatch?.[1] ?? plainMatch?.[1] ?? 'reporte-sips.xlsx');
};

const SipsExcelExportButton: React.FC<Props> = ({ result }) => {
    const [isExporting, setIsExporting] = useState(false);
    const [error, setError] = useState<string | null>(null);

    const handleExport = async () => {
        setIsExporting(true);
        setError(null);

        try {
            // @ts-ignore Ziggy expone route globalmente.
            const response = await axios.post(route('sips.export-excel'), {
                ...result,
                cups: result.cups ?? result.lecturas?.cups ?? result.selectFinal[0]?.CUPS,
            }, {
                responseType: 'blob',
            });

            const url = window.URL.createObjectURL(response.data);
            const link = document.createElement('a');
            link.href = url;
            link.download = resolveFilename(response.headers['content-disposition']);
            document.body.appendChild(link);
            link.click();
            link.remove();
            window.URL.revokeObjectURL(url);
        } catch {
            setError('No se pudo generar el archivo Excel. Inténtelo nuevamente.');
        } finally {
            setIsExporting(false);
        }
    };

    return (
        <div className="d-flex flex-column align-items-end gap-1">
            <Button
                id="sips-exportar-excel"
                type="button"
                variant="success"
                size="sm"
                onClick={handleExport}
                disabled={isExporting}
                aria-busy={isExporting}
            >
                <Download size={16} className="me-1" aria-hidden />
                {isExporting ? 'Generando Excel...' : 'Exportar Excel'}
            </Button>
            {error && <small className="text-danger" role="alert">{error}</small>}
        </div>
    );
};

export default SipsExcelExportButton;
