import React, { useState } from 'react';
import { Head, usePage } from '@inertiajs/react';
import { Button, Card, Col, Container, Form, Row, Spinner } from 'react-bootstrap';
import Swal from 'sweetalert2';
import Layout from '../../../Layouts';
import BreadCrumb from '../../../Components/Common/BreadCrumb';
import { Can } from '../../../Components/Auth/Can';
import { formatCalendarDateEs } from '../../../utils/serverCalendarDate';
import { useActivaciones } from './hooks/useActivaciones';
import ListadoContratosModal from './components/ListadoContratosModal';
import FormularioContrato from './components/FormularioContrato';
import ContratoRapidoModal from './components/ContratoRapidoModal';
import {
    ActivacionesPageProps,
    ContratoActivacion,
    FormularioActivacion,
    TIPO_ELECTRICO,
    comercializadoraNombre,
} from './types';

const ActivacionesIndex = () => {
    const {
        comercializadoras = [],
        productos = [],
        anexos = [],
        tiposPrecio = [],
        tarifasElectricas = [],
        tarifasGas = [],
    } = usePage<ActivacionesPageProps>().props;

    const { busqueda, buscando, guardando, sincronizando, buscar, actualizar, actualizarFechas, contratoRapido } = useActivaciones();
    const [cups, setCups] = useState('');
    const [mostrarListado, setMostrarListado] = useState(false);
    const [mostrarContratoRapido, setMostrarContratoRapido] = useState(false);
    const [seleccionadoId, setSeleccionadoId] = useState<number | null>(null);

    const seleccionado = busqueda?.contratos.find((c) => c.CodProComCup === seleccionadoId) ?? null;

    const comercializadoraDe = (codCom: number | null) =>
        comercializadoras.find((c) => String(c.CodCom) === String(codCom ?? '')) ?? null;

    const consultar = async (event: React.FormEvent) => {
        event.preventDefault();
        setSeleccionadoId(null);
        const resultado = await buscar(cups);
        if (resultado) {
            setMostrarListado(true);
        }
    };

    const seleccionar = (contrato: ContratoActivacion) => {
        setSeleccionadoId(contrato.CodProComCup);
        setMostrarListado(false);
    };

    const sincronizarFechas = async (contrato: ContratoActivacion) => {
        const comercializadora = comercializadoraDe(contrato.CodCom);
        if (!comercializadora) {
            await Swal.fire({
                icon: 'warning',
                title: 'Comercializadora',
                text: 'Este contrato no tiene comercializadora. No se puede consultar el servicio de fechas.',
            });
            return;
        }
        if (!comercializadora.fechas_provider) {
            await Swal.fire({
                icon: 'warning',
                title: 'Sin servicio de fechas',
                text: `${comercializadoraNombre(comercializadora)} no tiene consulta de fechas. Ahora mismo solo ADX y AUDAX.`,
            });
            return;
        }

        const confirmacion = await Swal.fire({
            icon: 'question',
            title: 'Actualizar fechas',
            text: `Se consultará ${comercializadoraNombre(comercializadora)} y se sustituirán la fecha de activación y vencimiento del contrato ${contrato.CodConCom ?? contrato.CodProComCup}.`,
            showCancelButton: true,
            confirmButtonText: 'Actualizar',
            cancelButtonText: 'Cancelar',
        });
        if (!confirmacion.isConfirmed) {
            return;
        }

        const resultado = await actualizarFechas(contrato);
        if (resultado) {
            await Swal.fire({
                icon: 'success',
                title: 'Fechas actualizadas',
                html: `Activación: <b>${formatCalendarDateEs(resultado.contrato.FecActCUPs)}</b><br/>Vencimiento: <b>${formatCalendarDateEs(resultado.contrato.FecVenCUPs)}</b>`,
            });
        }
    };

    const guardar = (form: FormularioActivacion, periodos: number) => {
        if (seleccionado) {
            void actualizar(seleccionado, form, periodos);
        }
    };

    return (
        <React.Fragment>
            <Head title="Activaciones" />
            <div className="page-content">
                <Container fluid>
                    <BreadCrumb title="Activaciones" pageTitle="Gestión comercial" />
                    <Row>
                        <Col lg={12}>
                            <Card>
                                <Card.Header>
                                    <h1 className="card-title mb-0 h4">Activaciones por CUPS</h1>
                                </Card.Header>
                                <Card.Body>
                                    <Form onSubmit={consultar}>
                                        <Row className="g-3 align-items-end">
                                            <Col md={9}>
                                                <Form.Label htmlFor="activaciones-cups" className="fw-semibold">CUPS</Form.Label>
                                                <Form.Control
                                                    id="activaciones-cups"
                                                    value={cups}
                                                    maxLength={30}
                                                    placeholder="ES0021000000029526CZ0P1"
                                                    onChange={(e) => setCups(e.target.value.toUpperCase())}
                                                />
                                            </Col>
                                            <Col md={3}>
                                                <Button type="submit" variant="dark" className="w-100" disabled={buscando}>
                                                    {buscando ? <Spinner size="sm" animation="border" className="me-1" /> : <i className="ri-search-line me-1" aria-hidden />}
                                                    Consultar
                                                </Button>
                                            </Col>
                                        </Row>
                                    </Form>

                                    {busqueda && (
                                        <div className="d-flex flex-wrap align-items-center gap-2 border-top mt-3 pt-3">
                                            <div className="me-auto">
                                                <div className="fw-semibold">
                                                    {busqueda.cups.CUPs}
                                                    <span className="badge bg-light text-dark ms-2">
                                                        {busqueda.cups.TipCups === TIPO_ELECTRICO ? 'Eléctrico' : 'Gas'}
                                                    </span>
                                                </div>
                                                <small className="text-muted">
                                                    {busqueda.cups.RazSocCli ?? 'Sin titular'}
                                                    {busqueda.cups.NumCifCli ? ` · ${busqueda.cups.NumCifCli}` : ''}
                                                    {busqueda.cups.direccion ? ` · ${busqueda.cups.direccion}` : ''}
                                                </small>
                                            </div>
                                            <Button variant="outline-dark" size="sm" onClick={() => setMostrarListado(true)}>
                                                <i className="ri-file-list-3-line me-1" aria-hidden />
                                                Ver contratos ({busqueda.contratos.length})
                                            </Button>
                                            <Can permission="activaciones.quick-contract">
                                                <Button
                                                    variant="primary"
                                                    size="sm"
                                                    disabled={!busqueda.cups.CodCli}
                                                    title={busqueda.cups.CodCli ? undefined : 'El CUPS no tiene un cliente titular accesible'}
                                                    onClick={() => setMostrarContratoRapido(true)}
                                                >
                                                    <i className="ri-flashlight-line me-1" aria-hidden />
                                                    Contrato rápido
                                                </Button>
                                            </Can>
                                        </div>
                                    )}
                                </Card.Body>
                            </Card>

                            {busqueda && seleccionado && (
                                <FormularioContrato
                                    cups={busqueda.cups}
                                    contrato={seleccionado}
                                    comercializadoras={comercializadoras}
                                    productos={productos}
                                    anexos={anexos}
                                    tiposPrecio={tiposPrecio}
                                    tarifasElectricas={tarifasElectricas}
                                    tarifasGas={tarifasGas}
                                    guardando={guardando}
                                    onGuardar={guardar}
                                    onCerrar={() => setSeleccionadoId(null)}
                                />
                            )}
                        </Col>
                    </Row>
                </Container>
            </div>

            <ListadoContratosModal
                show={mostrarListado}
                busqueda={busqueda}
                sincronizando={sincronizando}
                onHide={() => setMostrarListado(false)}
                onSeleccionar={seleccionar}
                onActualizarFechas={sincronizarFechas}
            />

            {busqueda && (
                <ContratoRapidoModal
                    show={mostrarContratoRapido}
                    cups={busqueda.cups}
                    comercializadoraBusqueda={null}
                    comercializadoras={comercializadoras}
                    productos={productos}
                    anexos={anexos}
                    tiposPrecio={tiposPrecio}
                    tarifasElectricas={tarifasElectricas}
                    tarifasGas={tarifasGas}
                    guardando={guardando}
                    onHide={() => setMostrarContratoRapido(false)}
                    onGenerar={contratoRapido}
                />
            )}
        </React.Fragment>
    );
};

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

export default ActivacionesIndex;
