import React, { useState } from 'react';
import { Head, usePage } from '@inertiajs/react';
import axios from 'axios';
import { Alert, Button, Card, Col, Container, Form, Row } from 'react-bootstrap';
import Swal from 'sweetalert2';
import Layout from '../../../Layouts';
import BreadCrumb from '../../../Components/Common/BreadCrumb';
import { Can } from '../../../Components/Auth/Can';

interface ComercializadoraOption {
    CodCom: number;
    RazSocCom: string | null;
    NomComCom: string | null;
    provider: string | null;
    providerLabel: string | null;
}

interface FechasContrato {
    FechaUltimaRenovacion: string | null;
    FechaActivacion: string | null;
    FechaFinContrato: string | null;
    FechaRenovacion: string | null;
}

interface ConsultaResponse {
    resultado: 'OK' | 'KO';
    Data: FechasContrato | null;
    Error: string | null;
}

interface PageProps {
    comercializadoras: ComercializadoraOption[];
    proveedoresDisponibles: string[];
    [key: string]: unknown;
}

const fechasVacias: FechasContrato = {
    FechaUltimaRenovacion: null,
    FechaActivacion: null,
    FechaFinContrato: null,
    FechaRenovacion: null,
};

const ConsultaFechasIndex = () => {
    const { comercializadoras = [], proveedoresDisponibles = [] } = usePage<PageProps>().props;
    const [codCom, setCodCom] = useState('');
    const [cups, setCups] = useState('');
    const [fechas, setFechas] = useState<FechasContrato>(fechasVacias);
    const [consultando, setConsultando] = useState(false);

    const seleccionada = comercializadoras.find((item) => String(item.CodCom) === codCom) ?? null;

    const mostrarError = (mensaje: string) => {
        setFechas(fechasVacias);
        Swal.fire({
            icon: 'error',
            title: 'Sin fechas',
            text: mensaje,
        });
    };

    const consultar = async () => {
        if (!seleccionada) {
            mostrarError('Seleccione una comercializadora.');
            return;
        }

        if (!seleccionada.provider) {
            mostrarError(
                `Esta comercializadora no tiene consulta de fechas. Disponible para: ${proveedoresDisponibles.join(', ')}.`
            );
            return;
        }

        const cupsLimpio = cups.trim().toUpperCase();
        if (cupsLimpio.length < 8) {
            mostrarError('Indique un CUPS válido.');
            return;
        }

        setConsultando(true);
        try {
            const response = await axios.post<ConsultaResponse>(route('consulta-fechas.consultar'), {
                cod_com: seleccionada.CodCom,
                cups: cupsLimpio,
            });

            if (response.data.resultado === 'OK' && response.data.Data) {
                setFechas(response.data.Data);
                return;
            }

            mostrarError(response.data.Error || 'No se pudieron consultar las fechas.');
        } catch (error) {
            const data = axios.isAxiosError(error) ? error.response?.data as ConsultaResponse | undefined : undefined;
            mostrarError(data?.Error || 'No se pudo consultar el servicio de fechas.');
        } finally {
            setConsultando(false);
        }
    };

    return (
        <React.Fragment>
            <Head title="Consultar fechas" />
            <div className="page-content">
                <Container fluid>
                    <BreadCrumb title="Consultar fechas" pageTitle="Gestión comercial" />
                    <Row>
                        <Col lg={12}>
                            <Card>
                                <Card.Header>
                                    <h1 className="card-title mb-0 h4">Consultar fechas comercializadoras</h1>
                                </Card.Header>
                                <Card.Body>
                                    <Row className="g-3 align-items-end">
                                        <Col md={5}>
                                            <Form.Label className="fw-semibold">Comercializadora</Form.Label>
                                            <Form.Select
                                                aria-label="Comercializadora"
                                                value={codCom}
                                                onChange={(event) => {
                                                    setCodCom(event.target.value);
                                                    setFechas(fechasVacias);
                                                }}
                                            >
                                                <option value="">Seleccionar...</option>
                                                {comercializadoras.map((item) => (
                                                    <option key={item.CodCom} value={item.CodCom}>
                                                        {item.RazSocCom || item.NomComCom || `Comercializadora ${item.CodCom}`}
                                                    </option>
                                                ))}
                                            </Form.Select>
                                        </Col>
                                        <Col md={5}>
                                            <Form.Label className="fw-semibold">CUPS</Form.Label>
                                            <Form.Control
                                                aria-label="CUPS"
                                                value={cups}
                                                maxLength={30}
                                                placeholder="ES0021000000029526CZ0P1"
                                                onChange={(event) => {
                                                    setCups(event.target.value.toUpperCase());
                                                    setFechas(fechasVacias);
                                                }}
                                            />
                                        </Col>
                                        <Col md={2}>
                                            <Can permission="consulta-fechas.query">
                                                <Button
                                                    variant="dark"
                                                    className="w-100"
                                                    disabled={consultando}
                                                    onClick={consultar}
                                                >
                                                    {consultando ? 'Consultando...' : 'Consultar'}
                                                </Button>
                                            </Can>
                                        </Col>
                                    </Row>

                                    {seleccionada && !seleccionada.provider && (
                                        <Alert variant="warning" className="mt-3 mb-0">
                                            {seleccionada.RazSocCom} no dispara el servicio. Ahora mismo solo ADX y AUDAX.
                                        </Alert>
                                    )}

                                    <Row className="g-3 mt-2">
                                        <Col md={6}>
                                            <Form.Label>Fecha última renovación</Form.Label>
                                            <Form.Control readOnly value={fechas.FechaUltimaRenovacion ?? ''} placeholder="DD/MM/YYYY" />
                                        </Col>
                                        <Col md={6}>
                                            <Form.Label>Fecha activación</Form.Label>
                                            <Form.Control readOnly value={fechas.FechaActivacion ?? ''} placeholder="DD/MM/YYYY" />
                                        </Col>
                                        <Col md={6}>
                                            <Form.Label>Fecha fin contrato</Form.Label>
                                            <Form.Control readOnly value={fechas.FechaFinContrato ?? ''} placeholder="DD/MM/YYYY" />
                                        </Col>
                                        <Col md={6}>
                                            <Form.Label>Fecha renovación</Form.Label>
                                            <Form.Control readOnly value={fechas.FechaRenovacion ?? ''} placeholder="DD/MM/YYYY" />
                                        </Col>
                                    </Row>
                                </Card.Body>
                            </Card>
                        </Col>
                    </Row>
                </Container>
            </div>
        </React.Fragment>
    );
};

ConsultaFechasIndex.layout = (page: React.ReactNode) => <Layout children={page} />;

export default ConsultaFechasIndex;
