import React, { useRef, useState, useEffect } from "react";
import {
    Card,
    Col,
    Container,
    Form, Row, Tab, Button, Table, Badge, Accordion, Nav
} from "react-bootstrap";

import BreadCrumb from "../../../../Components/Common/BreadCrumb";
import Swal from "sweetalert2";
import { Head, router, useForm } from "@inertiajs/react";
import Layout from "../../../../Layouts";
import 'react-bootstrap-typeahead/css/Typeahead.css';
import { Printer, Download, FileText, Bolt, Flame, User, Users, MapPin, Zap } from "lucide-react";
import {
  CupsElectrico,
  CupsGas,
  Cliente,
  PuntoSuministro,
  Contacto,
  PropuestaComercialCups,
  PropuestaComercialCliente,
  PropuestaComercial
} from "../Interfaces/Interfaces";
//import { useDocumentosTramitados } from "../hooks/useDocumentosTramitados";
import { DocumentosTramitadosTable } from "../Edicion/components/DocumentosTramitadosTable";
import { useDocumentosTramitados } from "../Edicion/hooks/useDocumentosTramitados";
import { formatCalendarDateEs } from "../../../../utils/serverCalendarDate";

// Interfaces para tipado
// (Eliminar las interfaces locales duplicadas)

const ConsultaContratoMultiClienteMultiPunto = ({datos}: { datos: PropuestaComercial }) => {
  const [activeKey, setActiveKey] = useState<string>("0");
  const [activeMainTab, setActiveMainTab] = useState<'puntos-suministro' | 'electrico' | 'gas' | 'documentos'>('puntos-suministro');
  const printRef = useRef<HTMLDivElement>(null);

  // Hook de documentos tramitados
  const { descargarDocumento } = useDocumentosTramitados();
  // Imprimir datos recibidos para depuración
  useEffect(() => {
    console.log("Datos recibidos en ConsultaContratoMultiClienteMultiPunto:", datos);
    setActiveMainTab('electrico');
  }, [datos]);

  // Validar si tenemos los datos necesarios
  const hasClienteData = datos && datos.propuesta_comercial_cliente && Array.isArray(datos.propuesta_comercial_cliente);

  const handlePrint = () => {
    if (printRef.current) {
      const printContents = printRef.current.innerHTML;
      const originalContents = document.body.innerHTML;

      document.body.innerHTML = `
        <html>
          <head>
            <title>Propuesta Comercial ${datos.RefProCom}</title>
            <style>
              body { font-family: Arial, sans-serif; }
              .print-header { text-align: center; margin-bottom: 20px; }
              table { width: 100%; border-collapse: collapse; margin-bottom: 15px; }
              th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
              th { background-color: #f2f2f2; }
              .section-title { margin-top: 20px; margin-bottom: 10px; font-weight: bold; }
              .subsection { margin-left: 20px; }
              .badge {
                display: inline-block;
                padding: 3px 8px;
                border-radius: 4px;
                font-size: 12px;
                font-weight: bold;
                text-align: center;
              }
              .badge-success { background-color: #d4edda; color: #155724; }
              .badge-warning { background-color: #fff3cd; color: #856404; }
              .badge-danger { background-color: #f8d7da; color: #721c24; }
              .badge-info { background-color: #d1ecf1; color: #0c5460; }
              .page-break { page-break-before: always; }
              @media print {
                .page-break { page-break-before: always; }
              }
            </style>
          </head>
          <body>
            <div class="print-header">
              <h2>Propuesta Comercial: ${datos.RefProCom}</h2>
              <p>Fecha: ${formatCalendarDateEs(datos.FecProCom)}</p>
            </div>
            ${printContents}
          </body>
        </html>
      `;

      window.print();
      document.body.innerHTML = originalContents;
    }
  };

  const handleDownloadPDF = () => {
    // Función para descargar como PDF - Se implementaría con una librería como jsPDF
    Swal.fire({
      title: 'Descargando...',
      text: 'La funcionalidad de descarga PDF será implementada próximamente',
      icon: 'info',
      timer: 2000,
      showConfirmButton: false,
    });
  };

  const getEstadoLabel = (estado: string) => {
    switch (estado) {
      case 'P':
        return <Badge bg="warning">Pendiente</Badge>;
      case 'A':
        return <Badge bg="success">Aprobado</Badge>;
      case 'R':
        return <Badge bg="danger">Rechazado</Badge>;
      default:
        return <Badge bg="info">{estado}</Badge>;
    }
  };

  const getTipoContratoLabel = (tipo: number) => {
    switch (tipo) {
      case 1:
        return "Contrato Simple";
      case 2:
        return "Contrato Multi-Punto";
      case 3:
        return "Contrato Multi-Cliente Multi-Punto";
      default:
        return `Tipo ${tipo}`;
    }
  };

  const formatFecha = (fecha: string | undefined) => {
    if (!fecha) return "-";
    return formatCalendarDateEs(fecha);
  };

  return (
    <React.Fragment>
      <Head title={`Consultando Propuesta Comercial: ${datos.RefProCom}`} />
      <div className="page-content">
        <Container fluid>
          <BreadCrumb title="Consulta" pageTitle="Propuesta Comercial Multi-Cliente Multi-Punto" />
          <Row>
            <Col xl={12}>
              <Card>
                <Card.Header className="d-flex justify-content-between align-items-center bg-light">
                  <h4 className="card-title mb-0">Propuesta Comercial: {datos.RefProCom}</h4>
                  <div className="d-flex gap-2">
                    <Button variant="primary" size="sm" onClick={handlePrint}>
                      <Printer size={16} className="me-1" />
                      Imprimir
                    </Button>
                    <Button variant="success" size="sm" onClick={handleDownloadPDF}>
                      <Download size={16} className="me-1" />
                      Descargar PDF
                    </Button>
                  </div>
                </Card.Header>
                <Card.Body>
                  <div ref={printRef}>
                    {/* Información general de la propuesta */}
                    <div className="mb-4">
                      <h5 className="border-bottom pb-2">Información General</h5>
                      <Row>
                        <Col md={6}>
                          <Table bordered responsive className="table-striped">
                            <tbody>
                              <tr>
                                <th style={{ width: "40%" }}>Número de Referencia</th>
                                <td>{datos.RefProCom}</td>
                              </tr>
                              <tr>
                                <th>Fecha de Propuesta</th>
                                <td>{formatFecha(datos.FecProCom)}</td>
                              </tr>
                              <tr>
                                <th>Tipo de Contrato</th>
                                <td>{getTipoContratoLabel(datos.TipProCom)}</td>
                              </tr>
                              <tr>
                                <th>Estado</th>
                                <td>{getEstadoLabel(datos.EstProCom)}</td>
                              </tr>
                              {datos.ObsProCom && (
                                <tr>
                                  <th>Observaciones</th>
                                  <td>{datos.ObsProCom}</td>
                                </tr>
                              )}
                            </tbody>
                          </Table>
                        </Col>
                      </Row>
                    </div>

                                          {/* Contenido del tab: Información de Clientes */}

                    <Accordion defaultActiveKey={activeKey} onSelect={(k) => setActiveKey(k as string)} className="mt-3">
                        {datos.propuesta_comercial_cliente.map((clienteData, clienteIndex) => (
                        <Accordion.Item key={`cliente-${clienteIndex}`} eventKey={clienteIndex.toString()}>
                            <Accordion.Header>
                            <span className="fw-bold">{clienteData?.contacto?.NomConCli || 'Cliente sin nombre'}</span>
                            <span className="ms-3 text-muted">NIF: {clienteData?.contacto?.NIFConCli || 'N/A'}</span>
                            </Accordion.Header>
                            <Accordion.Body>
                            {/* Datos del cliente */}
                            <div className="mb-4">
                                <Row>
                                <Col md={12}>
                                    <h6 className="fw-bold mt-3 mt-md-0">Información de Contacto</h6>
                                    {clienteData.contacto ? (
                                    <Table bordered responsive className="table-striped">
                                        <tbody>
                                        <tr>
                                            <th style={{ width: "40%" }}>Nombre</th>
                                            <td>{clienteData.contacto.NomConCli}</td>
                                        </tr>
                                        <tr>
                                            <th>NIF</th>
                                            <td>{clienteData.contacto.NIFConCli}</td>
                                        </tr>
                                        <tr>
                                            <th>Teléfono</th>
                                            <td>{clienteData.contacto.TelFijConCli || clienteData.contacto.TelCelConCli || 'N/A'}</td>
                                        </tr>
                                        <tr>
                                            <th>Email</th>
                                            <td>{clienteData.contacto.EmaConCli || 'N/A'}</td>
                                        </tr>
                                        <tr>
                                            <th>Cargo</th>
                                            <td>{clienteData.contacto.CarConCli || 'N/A'}</td>
                                        </tr>
                                        </tbody>
                                    </Table>
                                    ) : (
                                    <p>No hay información de contacto disponible</p>
                                    )}
                                </Col>
                                </Row>
                            </div>
                            </Accordion.Body>
                        </Accordion.Item>
                        ))}
                    </Accordion>

                    {/* Representante legal */}
                    {hasClienteData && datos.propuesta_comercial_cliente[0]?.contacto && (
                      <div className="mb-4">
                        <h6 className="border-bottom pb-2">Información del Representante Legal</h6>
                        <Row>
                          <Col md={6}>
                            <Table bordered responsive className="table-striped">
                              <tbody>
                                <tr>
                                  <th style={{ width: "40%" }}>Nombre</th>
                                  <td>{datos.propuesta_comercial_cliente[0].contacto.NomConCli}</td>
                                </tr>
                                <tr>
                                  <th>NIF</th>
                                  <td>{datos.propuesta_comercial_cliente[0].contacto.NIFConCli}</td>
                                </tr>
                                <tr>
                                  <th>Dirección</th>
                                  <td>{datos.propuesta_comercial_cliente[0].contacto.NomViaDomFis} {datos.propuesta_comercial_cliente[0].contacto.NumViaDomFis}</td>
                                </tr>
                                <tr>
                                  <th>Código Postal</th>
                                  <td>{datos.propuesta_comercial_cliente[0].contacto.CPLocFis}</td>
                                </tr>
                                <tr>
                                  <th>Teléfono</th>
                                  <td>{datos.propuesta_comercial_cliente[0].contacto.TelFijConCli || datos.propuesta_comercial_cliente[0].contacto.TelCelConCli || 'N/A'}</td>
                                </tr>
                                <tr>
                                  <th>Email</th>
                                  <td>{datos.propuesta_comercial_cliente[0].contacto.EmaConCli || 'N/A'}</td>
                                </tr>
                                <tr>
                                  <th>Cargo</th>
                                  <td>{datos.propuesta_comercial_cliente[0].contacto.CarConCli || 'N/A'}</td>
                                </tr>
                              </tbody>
                            </Table>
                          </Col>
                        </Row>
                      </div>
                    )}

                    {/* Clientes y sus puntos de suministro */}
                    <div className="mt-5">

                      {/* Tabs principales con Información de Clientes, CUPS Eléctricos, CUPS Gas y Documentos */}
                      <div className="my-3">
                        <Nav variant="tabs" className="nav-tabs">
                          <Nav.Item className="nav-item">
                            <Nav.Link
                              active={activeMainTab === 'electrico'}
                              onClick={() => setActiveMainTab('electrico')}
                              className="nav-link"
                              style={{ cursor: 'pointer' }}
                            >
                              <Zap size={16} className="me-1" style={{ display: 'inline' }} />
                              CUPS Eléctricos
                            </Nav.Link>
                          </Nav.Item>
                          <Nav.Item className="nav-item">
                            <Nav.Link
                              active={activeMainTab === 'gas'}
                              onClick={() => setActiveMainTab('gas')}
                              className="nav-link"
                              style={{ cursor: 'pointer' }}
                            >
                              <Flame size={16} className="me-1" style={{ display: 'inline' }} />
                              CUPS Gas
                            </Nav.Link>
                          </Nav.Item>
                          <Nav.Item className="nav-item">
                            <Nav.Link
                              active={activeMainTab === 'documentos'}
                              onClick={() => setActiveMainTab('documentos')}
                              className="nav-link"
                              style={{ cursor: 'pointer' }}
                            >
                              <Download size={16} className="me-1" style={{ display: 'inline' }} />
                              Documentos Tramitados
                              {datos.documentos_propuestas.length > 0 && (
                                <Badge bg="info" className="ms-2">{datos.documentos_propuestas.length}</Badge>
                              )}
                            </Nav.Link>
                          </Nav.Item>
                        </Nav>
                      </div>




                      {/* Contenido del tab: CUPS Eléctricos */}
                      {activeMainTab === 'electrico' && (
                        <>
                      {/* Tabla de todos los CUPS Eléctricos agrupados */}
                      {hasClienteData && datos.propuesta_comercial_cliente.some(cliente =>
                        cliente.propuesta_comercial_cups.some(cups => cups.TipCups === 1)
                      ) ? (
                      <div className="mt-4">
                        <h6 className="text-primary fw-bold mb-3">Suministros Eléctricos</h6>
                        <Table bordered hover responsive className="table-striped mb-0">
                          <thead>
                            <tr>
                              <th>CUPS</th>
                              <th>Cliente</th>
                              <th>CIF/NIF</th>
                              <th>Razón Social</th>
                              <th>Dirección</th>
                              <th>Tarifa</th>
                              <th>Consumo Anual</th>
                              <th>Potencias (kW)</th>
                              <th>Comercializadora</th>
                              <th>Producto</th>
                              <th>Anexo</th>
                              <th>Vigencia</th>
                              <th>N° Contrato Comercializadora</th>
                            </tr>
                          </thead>
                          <tbody>
                            {hasClienteData && datos.propuesta_comercial_cliente.map((clienteData, clienteIndex) => (
                              clienteData.propuesta_comercial_cups
                                .filter(cups => cups.TipCups === 1)
                                .map((cups, cupsIndex) => {
                                  // Seguir el mismo patrón que Gas: usar el CUPS eléctrico asociado directamente a la propuesta
                                  const puntoSuministro = cups.punto_suministro;
                                  const cliente = puntoSuministro?.cliente;
                                  // Compatibilidad con distintas formas de exponer la relación desde el backend
                                  const cupEle = (cups as any)?.CupEle ?? (cups as any)?.cups_electrico;

                                  // Si no hay registro de CUPS Eléctrico asociado, no renderizar fila
                                  if (!cupEle) return null;

                                  return (
                                    <tr key={`electrico-${cupEle.CodCupsEle ?? cups.CodProComCup}-${cupsIndex}`}
                                        className={cups.NrContratoAudax == "0" ? 'bg-warning' : 'bg-default'}>
                                      <td>
                                        <div className="d-flex align-items-center">
                                          <Bolt size={16} className="me-1 text-primary" />
                                          <span className="fw-medium">{cupEle.CUPsEle || 'N/A'}</span>
                                        </div>
                                      </td>
                                      <td>
                                        {cliente ? (
                                          <div className="d-flex align-items-center">
                                            <User size={16} className="me-1 text-secondary" />
                                            <span className="fw-medium">{cliente.CodCli}</span>
                                          </div>
                                        ) : 'N/A'}
                                      </td>
                                      <td>
                                        {cliente ? cliente.NumCifCli : 'N/A'}
                                      </td>
                                      <td>
                                        {cliente ? cliente.RazSocCli : 'N/A'}
                                      </td>
                                      <td>
                                        {puntoSuministro ? (
                                          <div className="d-flex align-items-start">
                                            <MapPin size={16} className="me-1 text-secondary mt-1" />
                                            <div>
                                              <div>{puntoSuministro.NomViaPunSum} {puntoSuministro.NumViaPunSum}</div>
                                              <small className="text-muted">
                                                {puntoSuministro.localidad ? `${puntoSuministro.localidad.DesLoc}` : ''}
                                                {puntoSuministro.CPLocSoc ? ` (${puntoSuministro.CPLocSoc})` : ''}
                                              </small>
                                            </div>
                                          </div>
                                        ) : 'N/A'}
                                      </td>
                                      <td>{(cups as any)?.tarifa_electrica?.NomTarEle ?? (cups as any)?.tarifaElectrica?.NomTarEle ?? 'N/A'}</td>
                                      <td>{cupEle.ConAnuCup || (cups as any).ConCup || 'N/A'} kWh</td>
                                      <td>
                                        <div className="d-flex gap-1">
                                          {cups.PotEleConP1 && <small><strong>P1:</strong> {cups.PotEleConP1} kW</small>}
                                          {cups.PotEleConP2 && <small><strong>P2:</strong> {cups.PotEleConP2} kW</small>}
                                          {cups.PotEleConP3 && <small><strong>P3:</strong> {cups.PotEleConP3} kW</small>}
                                          {cups.PotEleConP4 && <small><strong>P4:</strong> {cups.PotEleConP4} kW</small>}
                                          {cups.PotEleConP5 && <small><strong>P5:</strong> {cups.PotEleConP5} kW</small>}
                                          {cups.PotEleConP6 && <small><strong>P6:</strong> {cups.PotEleConP6} kW</small>}
                                          {!cups.PotEleConP1 && !cups.PotEleConP2 && !cups.PotEleConP3 &&
                                            !cups.PotEleConP4 && !cups.PotEleConP5 && !cups.PotEleConP6 && 'N/A'}
                                        </div>
                                      </td>
                                      <td>{cups.comercializadora?.RazSocCom || 'N/A'}</td>
                                      <td>{cups.producto?.DesPro || 'N/A'}</td>
                                      <td>{cups.anexo_producto?.DesAnePro || 'N/A'}</td>
                                      <td>
                                        {formatFecha(cups.FecActCUPs)} - {formatFecha(cups.FecVenCUPs)}
                                      </td>
                                      <td>
                                        <div className="d-flex align-items-center justify-content-center">
                                          <span className="text-black">{cups.NrContratoAudax}</span>
                                        </div>
                                      </td>
                                    </tr>
                                  );
                                })
                            ))}
                          </tbody>
                        </Table>
                      </div>
                      ) : (
                        <div className="mt-4">
                          <div className="alert alert-info">
                            <div className="d-flex align-items-center">
                              <Zap size={24} className="me-2 text-primary" />
                              <div>
                                <h6 className="mb-0">No hay CUPS eléctricos</h6>
                                <small>No se encontraron suministros eléctricos para este cliente</small>
                              </div>
                            </div>
                          </div>
                        </div>
                      )}
                        </>
                      )}

                      {/* Contenido del tab: CUPS Gas */}
                      {activeMainTab === 'gas' && (
                        <>
                      {/* Tabla de todos los CUPS Gas agrupados */}
                      {hasClienteData && datos.propuesta_comercial_cliente.some(cliente =>
                        cliente.propuesta_comercial_cups.some(cups => cups.TipCups === 2)
                      ) ? (
                        <div className="mt-4">
                          <h6 className="text-warning fw-bold mb-3">Suministros de Gas</h6>
                          <Table bordered hover responsive className="table-striped mb-0">
                            <thead>
                              <tr>
                                <th>CUPS</th>
                                <th>Cliente</th>
                                <th>CIF/NIF</th>
                                <th>Razón Social</th>
                                <th>Dirección</th>
                                <th>Tarifa</th>
                                <th>Consumo Anual</th>
                                <th>Comercializadora</th>
                                <th>Producto</th>
                                <th>Anexo</th>
                                <th>Vigencia</th>
                                <th>N° Contrato Comercializadora</th>
                              </tr>
                            </thead>
                            <tbody>
                              {datos.propuesta_comercial_cliente.map((clienteData, clienteIndex) => (
                                clienteData.propuesta_comercial_cups
                                  .filter(cups => cups.TipCups === 2)
                                  .map((cups, cupsIndex) => {
                                    // Obtener el punto de suministro y alias del CUPS de gas
                                    const puntoSuministro = cups.punto_suministro;
                                    const cliente = puntoSuministro?.cliente;
                                    const cupGas = (cups as any)?.CupGas ?? (cups as any)?.cups_gas;

                                    // Si no hay registro de CUPS Gas asociado, no renderizar fila
                                    if (!cupGas) return null;

                                    return (
                                      <tr key={`gas-${cupGas.CodCupsGas ?? cups.CodProComCup}-${cupsIndex}`}
                                          className={cups.NrContratoAudax == "0" ? 'bg-warning' : ''}>
                                        <td>
                                          <div className="d-flex align-items-center">
                                            <Flame size={16} className="me-1 text-warning" />
                                            <span className="fw-medium">{cupGas.CupsGas || 'N/A'}</span>
                                          </div>
                                        </td>
                                        <td>
                                          {cliente ? (
                                            <div className="d-flex align-items-center">
                                              <User size={16} className="me-1 text-secondary" />
                                              <span className="fw-medium">{cliente.CodCli}</span>
                                            </div>
                                          ) : 'N/A'}
                                        </td>
                                        <td>
                                          {cliente ? cliente.NumCifCli : 'N/A'}
                                        </td>
                                        <td>
                                          {cliente ? cliente.RazSocCli : 'N/A'}
                                        </td>
                                        <td>
                                          {puntoSuministro ? (
                                            <div className="d-flex align-items-start">
                                              <MapPin size={16} className="me-1 text-secondary mt-1" />
                                              <div>
                                                <div>{puntoSuministro.NomViaPunSum} {puntoSuministro.NumViaPunSum}</div>
                                                <small className="text-muted">
                                                  {puntoSuministro.localidad ? `${puntoSuministro.localidad.DesLoc}` : ''}
                                                  {puntoSuministro.CPLocSoc ? ` (${puntoSuministro.CPLocSoc})` : ''}
                                                </small>
                                              </div>
                                            </div>
                                          ) : 'N/A'}
                                        </td>
                                        <td>{(cups as any)?.tarifa_gas?.NomTarGas ?? (cups as any)?.tarifa_gas?.DesTarGas ?? (cups as any)?.tarifaGas?.NomTarGas ?? (cups as any)?.tarifaGas?.DesTarGas ?? 'N/A'}</td>
                                        <td>{cupGas.ConAnuCup || cups.ConCup || 'N/A'} m³</td>
                                        <td>{cups.comercializadora?.RazSocCom || 'N/A'}</td>
                                        <td>{cups.producto?.DesPro || 'N/A'}</td>
                                        <td>{cups.anexo_producto?.DesAnePro || 'N/A'}</td>
                                        <td>
                                          {formatFecha(cups.FecActCUPs)} - {formatFecha(cups.FecVenCUPs)}
                                        </td>
                                        <td>
                                          <div className="d-flex align-items-center justify-content-center">
                                            <span className="text-black">{cups.NrContratoAudax}</span>
                                          </div>
                                        </td>
                                      </tr>
                                    );
                                  })
                              ))}
                            </tbody>
                          </Table>
                        </div>
                      ) : (
                        <div className="mt-4">
                          <div className="alert alert-info">
                            <div className="d-flex align-items-center">
                              <Flame size={24} className="me-2 text-warning" />
                              <div>
                                <h6 className="mb-0">No hay CUPS de gas</h6>
                                <small>No se encontraron suministros de gas para este cliente</small>
                              </div>
                            </div>
                          </div>
                        </div>
                      )}
                        </>
                      )}

                      {/* Contenido del tab: Documentos Tramitados */}
                      {activeMainTab === 'documentos' && (
                        <>
                          <div className="mt-3">
                            <h6 className="fw-bold mb-3">
                              <Download size={18} className="me-2" style={{ display: 'inline' }} />
                              Documentos del Contrato
                            </h6>
                            <DocumentosTramitadosTable
                              documentos={datos.documentos_propuestas}
                              onDescargar={descargarDocumento}
                            />
                          </div>
                        </>
                      )}
                    </div>
                  </div>
                </Card.Body>
                <Card.Footer className="text-center">
                  <Button
                    variant="secondary"
                    onClick={() => router.visit(route('contratos.index'))}
                    className="me-2"
                  >
                    <FileText size={16} className="me-1" />
                    Volver a Contratos
                  </Button>
                </Card.Footer>
              </Card>
            </Col>
          </Row>
        </Container>
      </div>
    </React.Fragment>
  );
};

ConsultaContratoMultiClienteMultiPunto.layout = (page: any) => <Layout children={page} />;
export default ConsultaContratoMultiClienteMultiPunto;
