import React, { useState } from 'react';
import { Card, Col, Container, Row, Button, Form } from 'react-bootstrap';
import { Head, router, useForm } from '@inertiajs/react';
import { FileText } from 'lucide-react';
import BreadCrumb from '../../../../Components/Common/BreadCrumb';
import Layout from '../../../../Layouts';
import Swal from 'sweetalert2';
import { useLoading } from '../../../../LoadingContext';
import estilosFoco from '../../Contratos/Shared/estilosFocoAccesible.module.css';

interface TarifaFormProps {
  tarifa: any;
  tipoTarifa: 'electrica' | 'gas';
  isEdit: boolean;
}

const sugerirNombreAlternoGas = (nomTarGas: string): string => {
  const t = nomTarGas.trim();
  const match = t.match(/^R(\d+)$/i);
  return match ? `RL.${match[1]}` : t;
};

const EditarTarifa = ({ tarifa, tipoTarifa, isEdit }: TarifaFormProps) => {
  const esGas = tipoTarifa === 'gas';
  const { showLoading, hideLoading } = useLoading();
  const [isProcessing, setIsProcessing] = useState(false);

  const { data, setData, post, put, processing, errors } = useForm<any>({
    tipo: tipoTarifa,
    TipTen: tarifa.TipTen ?? '',
    NomTarEle: tarifa.NomTarEle ?? '',
    nombre_alterno: tarifa.nombre_alterno ?? '',
    CanPerTar: tarifa.CanPerTar ?? '',
    MinPotCon: tarifa.MinPotCon ?? '',
    MaxPotCon: tarifa.MaxPotCon ?? '',
    EstTarEle: tarifa.EstTarEle ?? 1,
    NomTarGas: tarifa.NomTarGas ?? '',
    MinConAnu: tarifa.MinConAnu ?? '',
    MaxConAnu: tarifa.MaxConAnu ?? '',
    EstTarGas: tarifa.EstTarGas ?? 1,
  });

  const handleBack = () => {
    showLoading();
    router.visit(route('tarifas.index', { tipo: tipoTarifa }), { onFinish: hideLoading });
  };

  const handleSubmit = (e: React.FormEvent) => {
    e.preventDefault();
    setIsProcessing(true);
    showLoading();

    const onFinish = () => {
      hideLoading();
      setIsProcessing(false);
    };

    if (isEdit && tarifa.id) {
      put(route('tarifas.update', { tipo: tipoTarifa, id: tarifa.id }), {
        preserveScroll: true,
        onFinish,
        onSuccess: () => {
          Swal.fire({ title: 'Tarifa actualizada', icon: 'success', timer: 1500, showConfirmButton: false });
        },
        onError: () => {
          Swal.fire({ title: 'Error al guardar', icon: 'error', confirmButtonText: 'Aceptar' });
        },
      });
    } else {
      post(route('tarifas.store'), {
        preserveScroll: true,
        onFinish,
        onError: () => {
          Swal.fire({ title: 'Error al crear tarifa', icon: 'error', confirmButtonText: 'Aceptar' });
        },
      });
    }
  };

  const titulo = isEdit
    ? `Editar tarifa ${esGas ? 'gas' : 'eléctrica'}`
    : `Nueva tarifa ${esGas ? 'gas' : 'eléctrica'}`;

  return (
    <React.Fragment>
      <Head title={titulo} />
      <div className={`page-content ${estilosFoco.contenedorAccesibleContratos}`}>
        <Container fluid>
          <BreadCrumb title={isEdit ? 'Editar' : 'Crear'} pageTitle="Tarifas" />
          <Row>
            <Col xl={12}>
              <Card>
                <Card.Header className="d-flex justify-content-between align-items-center">
                  <h5 className="card-title mb-0 d-flex align-items-center gap-2">
                    <FileText size={20} aria-hidden="true" />
                    {titulo}
                  </h5>
                  <Button variant="outline-secondary" size="sm" onClick={handleBack}>Volver</Button>
                </Card.Header>
                <Card.Body>
                  <Form onSubmit={handleSubmit}>
                    {esGas ? (
                      <>
                        <Form.Group className="mb-3">
                          <Form.Label>Nombre tarifa gas *</Form.Label>
                          <Form.Control
                            value={data.NomTarGas}
                            onChange={(e) => {
                              const v = e.target.value;
                              setData((prev: any) => ({
                                ...prev,
                                NomTarGas: v,
                                nombre_alterno: prev.nombre_alterno?.trim() && isEdit
                                  ? prev.nombre_alterno
                                  : sugerirNombreAlternoGas(v),
                              }));
                            }}
                            isInvalid={!!errors.NomTarGas}
                            required
                          />
                          <Form.Control.Feedback type="invalid">{errors.NomTarGas}</Form.Control.Feedback>
                        </Form.Group>
                        <Form.Group className="mb-3">
                          <Form.Label>Nombre alterno</Form.Label>
                          <Form.Control
                            value={data.nombre_alterno}
                            onChange={(e) => setData('nombre_alterno', e.target.value)}
                            isInvalid={!!errors.nombre_alterno}
                            placeholder="Ej. RL.1 para R1, o el mismo nombre para B5/A5"
                          />
                          <Form.Text className="text-muted">
                            Tarifas R (R1, R2, R10…) se sugieren como RL.1, RL.2, RL.10. Las demás conservan su nombre.
                          </Form.Text>
                          <Form.Control.Feedback type="invalid">{errors.nombre_alterno}</Form.Control.Feedback>
                        </Form.Group>
                        <Row>
                          <Col md={6}>
                            <Form.Group className="mb-3">
                              <Form.Label>Consumo anual mínimo</Form.Label>
                              <Form.Control type="number" step="0.01" value={data.MinConAnu} onChange={(e) => setData('MinConAnu', e.target.value)} />
                            </Form.Group>
                          </Col>
                          <Col md={6}>
                            <Form.Group className="mb-3">
                              <Form.Label>Consumo anual máximo</Form.Label>
                              <Form.Control type="number" step="0.01" value={data.MaxConAnu} onChange={(e) => setData('MaxConAnu', e.target.value)} />
                            </Form.Group>
                          </Col>
                        </Row>
                        <Form.Group className="mb-3">
                          <Form.Label>Estado</Form.Label>
                          <Form.Select value={data.EstTarGas} onChange={(e) => setData('EstTarGas', Number(e.target.value))}>
                            <option value={1}>Activa</option>
                            <option value={0}>Inactiva</option>
                          </Form.Select>
                        </Form.Group>
                      </>
                    ) : (
                      <>
                        <Form.Group className="mb-3">
                          <Form.Label>Nombre tarifa eléctrica *</Form.Label>
                          <Form.Control
                            value={data.NomTarEle}
                            onChange={(e) => {
                              const v = e.target.value;
                              setData((prev: any) => ({
                                ...prev,
                                NomTarEle: v,
                                nombre_alterno: prev.nombre_alterno?.trim() && isEdit
                                  ? prev.nombre_alterno
                                  : v,
                              }));
                            }}
                            isInvalid={!!errors.NomTarEle}
                            required
                          />
                          <Form.Control.Feedback type="invalid">{errors.NomTarEle}</Form.Control.Feedback>
                        </Form.Group>
                        <Form.Group className="mb-3">
                          <Form.Label>Nombre alterno</Form.Label>
                          <Form.Control
                            value={data.nombre_alterno}
                            onChange={(e) => setData('nombre_alterno', e.target.value)}
                            isInvalid={!!errors.nombre_alterno}
                            placeholder="Por defecto igual al nombre de la tarifa"
                          />
                          <Form.Control.Feedback type="invalid">{errors.nombre_alterno}</Form.Control.Feedback>
                        </Form.Group>
                        <Row>
                          <Col md={6}>
                            <Form.Group className="mb-3">
                              <Form.Label>Tensión</Form.Label>
                              <Form.Control value={data.TipTen} onChange={(e) => setData('TipTen', e.target.value)} />
                            </Form.Group>
                          </Col>
                          <Col md={6}>
                            <Form.Group className="mb-3">
                              <Form.Label>Periodos tarifa</Form.Label>
                              <Form.Control type="number" value={data.CanPerTar} onChange={(e) => setData('CanPerTar', e.target.value)} />
                            </Form.Group>
                          </Col>
                        </Row>
                        <Row>
                          <Col md={6}>
                            <Form.Group className="mb-3">
                              <Form.Label>Potencia mínima (kW)</Form.Label>
                              <Form.Control type="number" step="0.001" value={data.MinPotCon} onChange={(e) => setData('MinPotCon', e.target.value)} />
                            </Form.Group>
                          </Col>
                          <Col md={6}>
                            <Form.Group className="mb-3">
                              <Form.Label>Potencia máxima (kW)</Form.Label>
                              <Form.Control type="number" step="0.001" value={data.MaxPotCon} onChange={(e) => setData('MaxPotCon', e.target.value)} />
                            </Form.Group>
                          </Col>
                        </Row>
                        <Form.Group className="mb-3">
                          <Form.Label>Estado</Form.Label>
                          <Form.Select value={data.EstTarEle} onChange={(e) => setData('EstTarEle', Number(e.target.value))}>
                            <option value={1}>Activa</option>
                            <option value={0}>Inactiva</option>
                          </Form.Select>
                        </Form.Group>
                      </>
                    )}
                    <div className="d-flex gap-2">
                      <Button type="submit" variant="primary" disabled={processing || isProcessing}>
                        {isEdit ? 'Guardar cambios' : 'Crear tarifa'}
                      </Button>
                      <Button type="button" variant="outline-secondary" onClick={handleBack}>Cancelar</Button>
                    </div>
                  </Form>
                </Card.Body>
              </Card>
            </Col>
          </Row>
        </Container>
      </div>
    </React.Fragment>
  );
};

(EditarTarifa as any).layout = (page: React.ReactNode) => <Layout children={page} />;
export default EditarTarifa;
