import React, { useEffect, useMemo, useState } from 'react';
import { Modal, Button, Form, Row, Col, Spinner } from 'react-bootstrap';
import { Send, FileText } from 'lucide-react';
import axios from 'axios';
import Swal from 'sweetalert2';
import MultiSelectContratos from './MultiSelectContratos';
import { promptComercialCanal } from '../../promptComercialCanal';

interface Comercializadora {
    CodCom: number;
    NomCom: string;
}

interface ContratoAsociado {
    id: number;
    NumCon: string;
    label: string;
    tipo: 'LUZ' | 'GAS';
    CodCups: string;
}

interface DocumentoLike {
    id: number;
    NombreArchivo?: string;
    nombre?: string;
    Comercializadora?: string;
    CodCom?: number;
    cod_com?: number;
}

interface EnviarDocumentoComercializadoraModalProps {
    show: boolean;
    onHide: () => void;
    documento: DocumentoLike | null;
    codProCom: number;
    comercializadorasUnicas: Comercializadora[];
    contratosAsociados: ContratoAsociado[];
    onSuccess?: () => void;
    showLoading: () => void;
    hideLoading: () => void;
}

const EnviarDocumentoComercializadoraModal: React.FC<EnviarDocumentoComercializadoraModalProps> = ({
    show,
    onHide,
    documento,
    codProCom,
    comercializadorasUnicas,
    contratosAsociados,
    onSuccess,
    showLoading,
    hideLoading,
}) => {
    const [codCom, setCodCom] = useState<string>('');
    const [selectedContratos, setSelectedContratos] = useState<ContratoAsociado[]>([]);
    const [isSending, setIsSending] = useState(false);

    const nombreDocumento = useMemo(() => {
        if (!documento) return '';
        return documento.NombreArchivo ?? documento.nombre ?? `Documento #${documento.id}`;
    }, [documento]);

    const defaultCodCom = useMemo(() => {
        if (!documento) return '';
        const byField = documento.CodCom ?? documento.cod_com;
        if (byField) return String(byField);

        const nombreCom = (documento.Comercializadora || '').trim().toLowerCase();
        if (!nombreCom) return '';

        const match = comercializadorasUnicas.find(c => (c.NomCom || '').trim().toLowerCase() === nombreCom)
            ?? comercializadorasUnicas.find(c => (c.NomCom || '').trim().toLowerCase().includes(nombreCom) || nombreCom.includes((c.NomCom || '').trim().toLowerCase()));

        return match ? String(match.CodCom) : '';
    }, [documento, comercializadorasUnicas]);

    useEffect(() => {
        if (show) {
            setCodCom(defaultCodCom);
            setSelectedContratos([]);
        }
    }, [show, defaultCodCom]);

    const handleClose = () => {
        setSelectedContratos([]);
        setCodCom('');
        onHide();
    };

    const handleEnviar = async () => {
        if (!documento) {
            return;
        }

        if (!codCom) {
            Swal.fire({
                icon: 'warning',
                title: 'Comercializadora requerida',
                text: 'Por favor, selecciona una comercializadora',
                timer: 2500,
                showConfirmButton: false,
            });
            return;
        }

        if (selectedContratos.length === 0) {
            Swal.fire({
                icon: 'warning',
                title: 'Contratos requeridos',
                text: 'Selecciona al menos un contrato para asociar el documento',
                timer: 2500,
                showConfirmButton: false,
            });
            return;
        }

        const comercialCanal = await promptComercialCanal();
        if (!comercialCanal) {
            return;
        }

        setIsSending(true);
        showLoading();

        try {
            const documents = selectedContratos.map(contrato => ({
                cod_com: parseInt(codCom, 10),
                documentId: documento.id,
                numeroContrato: String(contrato.NumCon).trim(),
                tipoContrato: contrato.tipo,
                CodProCom: codProCom,
            }));

            const associationResponse = await axios.post(
                route('v1.contracts.documentContract'),
                {
                    documents,
                    comercial: comercialCanal.comercial,
                    canal: comercialCanal.canal,
                },
                {
                    headers: {
                        'Content-Type': 'application/json',
                    },
                    timeout: 120000,
                }
            );

            const payload = associationResponse.data as {
                success?: boolean;
                message?: string;
                data?: {
                    errores?: Array<Record<string, unknown>>;
                    errores_validacion?: Array<Record<string, unknown>>;
                    total_exitosos?: number;
                    total_procesados?: number;
                    numero_proceso?: string;
                    jobs_encolados?: number;
                    tipo_proceso?: number;
                };
            };
            const d = payload?.data;
            const status = associationResponse.status;

            // Quitar el loader global antes de cualquier Swal (si no, "Procesando..." queda encima del diálogo).
            hideLoading();
            setIsSending(false);

            // Cola asíncrona (202): el envío por contrato se procesa en background.
            if (status === 202 && d?.numero_proceso) {
                const n = typeof d.jobs_encolados === 'number' ? d.jobs_encolados : selectedContratos.length;
                const val = Array.isArray(d.errores_validacion) ? d.errores_validacion : [];
                const valHint =
                    val.length > 0
                        ? `\n\nNota: ${val.length} fila(s) con datos incompletos no se encolaron.`
                        : '';
                const body = [
                    payload?.message ?? 'Los envíos se están procesando en segundo plano.',
                    '',
                    `Nº proceso: ${d.numero_proceso}`,
                    `Trabajos encolados: ${n}`,
                    valHint,
                ]
                    .filter(Boolean)
                    .join('\n');
                await Swal.fire({
                    icon: 'info',
                    title: 'Envío en cola',
                    text: body,
                    width: 640,
                    confirmButtonText: 'Aceptar',
                });
            } else {
                const errores: Array<Record<string, unknown>> = Array.isArray(d?.errores) ? d.errores : [];
                const totalOk =
                    typeof d?.total_exitosos === 'number' ? d.total_exitosos : 0;
                const total =
                    typeof d?.total_procesados === 'number'
                        ? d.total_procesados
                        : selectedContratos.length;

                if (errores.length > 0 || payload?.success === false) {
                    const lines = errores.slice(0, 12).map((e) => {
                        const r = e.numeroContrato != null ? String(e.numeroContrato) : '?';
                        const msg = String(e.error ?? e.response ?? 'Error sin detalle').slice(0, 240);
                        return `• Contrato ${r}: ${msg}`;
                    });
                    if (errores.length > 12) {
                        lines.push(`…y ${errores.length - 12} error(es) más (ver respuesta JSON / logs).`);
                    }
                    const detail = [payload?.message, lines.join('\n')].filter(Boolean).join('\n\n');

                    await Swal.fire({
                        icon: totalOk > 0 ? 'warning' : 'error',
                        title: totalOk > 0 ? 'Envío parcial a la API' : 'No se pudo completar el envío',
                        text: `Sincronizados con la API: ${totalOk} de ${total}.\n\n${detail}`,
                        width: 640,
                        confirmButtonText: 'Aceptar',
                    });
                } else {
                    await Swal.fire({
                        icon: 'success',
                        title: '¡Enviado!',
                        text: `Documento asociado a ${selectedContratos.length} contrato(s)`,
                        timer: 2500,
                        showConfirmButton: false,
                    });
                }
            }

            handleClose();
            onSuccess?.();
        } catch (error: any) {
            hideLoading();
            setIsSending(false);
            console.error('Error al enviar documento a comercializadora:', error);
            Swal.fire({
                icon: 'error',
                title: 'Error',
                text: error.response?.data?.message || error.message || 'Error al enviar el documento',
                confirmButtonText: 'Aceptar',
            });
        }
    };

    return (
        <Modal show={show} onHide={handleClose} centered size="xl">
            <Modal.Header closeButton className="border-0 pb-0">
                <Modal.Title className="d-flex align-items-center gap-2">
                    <Send size={22} className="text-primary" />
                    Enviar a Comercializadora
                </Modal.Title>
            </Modal.Header>

            <Modal.Body className="pt-3">
                {!documento ? (
                    <div className="text-center text-muted py-4">
                        <Spinner animation="border" size="sm" className="me-2" />
                        Cargando documento...
                    </div>
                ) : (
                    <Row className="g-4">
                        <Col md={12}>
                            <div className="border rounded p-3" style={{ backgroundColor: '#f8f9fa' }}>
                                <h6 className="fw-bold mb-3 text-primary">
                                    <FileText size={18} className="me-2" style={{ display: 'inline' }} />
                                    Documento
                                </h6>
                                <div className="bg-white rounded border p-2 mb-3">
                                    <small className="text-muted">{nombreDocumento}</small>
                                </div>

                                <Form.Group className="mb-0">
                                    <Form.Label className="fw-semibold">
                                        Comercializadora <span className="text-danger">*</span>
                                    </Form.Label>
                                    <Form.Select
                                        value={codCom}
                                        onChange={(e) => setCodCom(e.target.value)}
                                        disabled={isSending}
                                        required
                                    >
                                        <option value="">Seleccionar comercializadora...</option>
                                        {comercializadorasUnicas.map((com) => (
                                            <option key={com.CodCom} value={com.CodCom}>
                                                {com.NomCom}
                                            </option>
                                        ))}
                                    </Form.Select>
                                </Form.Group>
                            </div>
                        </Col>

                        <Col md={12}>
                            <div className="border rounded p-3" style={{ backgroundColor: '#f8f9fa' }}>
                                <h6 className="fw-bold mb-3 text-primary">
                                    <FileText size={18} className="me-2" style={{ display: 'inline' }} />
                                    Contratos Asociados
                                </h6>

                                {contratosAsociados.length > 0 ? (
                                    <>
                                        <MultiSelectContratos
                                            contratos={contratosAsociados}
                                            onSelectionChange={setSelectedContratos}
                                        />
                                        <Form.Text className="text-muted d-block mt-2">
                                            Selecciona los contratos a los que deseas asociar este documento
                                        </Form.Text>
                                    </>
                                ) : (
                                    <div className="text-center text-muted py-5">
                                        <FileText size={48} className="mb-2 opacity-50" />
                                        <p className="mb-0">No hay contratos asociados a esta propuesta</p>
                                    </div>
                                )}
                            </div>
                        </Col>
                    </Row>
                )}
            </Modal.Body>

            <Modal.Footer className="border-0 pt-0">
                <Button variant="outline-secondary" onClick={handleClose} disabled={isSending}>
                    Cancelar
                </Button>
                <Button
                    variant="primary"
                    onClick={handleEnviar}
                    disabled={isSending || !documento}
                    className="d-flex align-items-center gap-2"
                >
                    <Send size={18} />
                    {isSending ? 'Enviando...' : 'Enviar'}
                </Button>
            </Modal.Footer>
        </Modal>
    );
};

export default EnviarDocumentoComercializadoraModal;
