/* eslint-disable react/prop-types */
import { useEffect, useMemo } from "react";
import {
  Autocomplete,
  Box,
  CircularProgress,
  Divider,
  TextField,
  Typography,
} from "@mui/material";
import { Controller } from "react-hook-form";
import { useReferencialesQuery } from "../../../tanstack/ReferencialesStack";

/**
 * Campos de persona reutilizables para transportista, chofer y agente.
 * Aplica la misma lógica de validación que ClienteFormDialog:
 *   - Contribuyente (codigo=1): RUC+DV obligatorios, oculta tipo_documento/nro_documento
 *   - No Contribuyente (codigo=2): tipo_documento+nro_documento obligatorios, oculta RUC/DV
 */
export const PersonaFormFields = ({ control, errors, watch, setValue, forceNoContribuyente = false, forceContribuyente = false, preferNoContribuyente = false, direccionRequerida = false, loadingDnit = false }) => {
  const { data: referenciales } = useReferencialesQuery();

  const naturalezas = referenciales?.naturaleza_receptor || [];
  const tiposDocumento = referenciales?.tipo_documento_identidad || [];
  const tiposContribuyente = referenciales?.tipo_contribuyente || [];

  // Watch para lógica condicional
  const watchNaturaleza = watch("naturaleza_id");
  const watchRuc = watch("ruc");

  const selectedNaturaleza = useMemo(
    () => naturalezas.find((n) => n.id === watchNaturaleza),
    [naturalezas, watchNaturaleza],
  );

  const isContribuyente = selectedNaturaleza?.codigo === 1;
  const isNoContribuyente = selectedNaturaleza?.codigo === 2;

  // Auto-calcular tipo contribuyente por RUC (>= 80000000 = Jurídica)
  const tipoContribuyenteCalculado = useMemo(() => {
    if (!watchRuc || !isContribuyente) return null;
    const rucNum = parseInt(watchRuc, 10);
    if (isNaN(rucNum)) return null;
    const codigoBuscado = rucNum >= 80000000 ? 2 : 1;
    return tiposContribuyente.find((t) => t.codigo === codigoBuscado);
  }, [watchRuc, isContribuyente, tiposContribuyente]);

  // Aplicar tipo contribuyente calculado automáticamente
  useEffect(() => {
    if (tipoContribuyenteCalculado && setValue) {
      setValue("tipo_contribuyente_id", tipoContribuyenteCalculado.id);
    }
  }, [tipoContribuyenteCalculado, setValue]);

  // Defaults según contexto
  useEffect(() => {
    if (!setValue || !naturalezas.length) return;
    if (!watchNaturaleza) {
      const defaultCodigo = forceNoContribuyente || preferNoContribuyente ? 2 : 1;
      const defaultNat = naturalezas.find((n) => n.codigo === defaultCodigo);
      if (defaultNat) setValue("naturaleza_id", defaultNat.id);
    }
    if (forceNoContribuyente && isContribuyente) {
      // Forzar No Contribuyente si alguien lo cambió manualmente
      const noContrib = naturalezas.find((n) => n.codigo === 2);
      if (noContrib) setValue("naturaleza_id", noContrib.id);
    }
    if (forceContribuyente && isNoContribuyente) {
      // Forzar Contribuyente si alguien lo cambió manualmente
      const contrib = naturalezas.find((n) => n.codigo === 1);
      if (contrib) setValue("naturaleza_id", contrib.id);
    }
    const watchTipoContrib = watch("tipo_contribuyente_id");
    if (!watchTipoContrib && isContribuyente && !forceNoContribuyente) {
      const fisicaDefault = tiposContribuyente.find((t) => t.codigo === 1);
      if (fisicaDefault) setValue("tipo_contribuyente_id", fisicaDefault.id);
    }
    // No contribuyente: tipo de documento por defecto = Cédula de Identidad (código 1).
    const watchTipoDoc = watch("tipo_documento_id");
    if (!watchTipoDoc && isNoContribuyente && tiposDocumento.length) {
      const cedula = tiposDocumento.find((t) => Number(t.codigo) === 1);
      if (cedula) setValue("tipo_documento_id", cedula.id);
    }
  }, [naturalezas, tiposContribuyente, tiposDocumento, watchNaturaleza, isContribuyente, isNoContribuyente, forceNoContribuyente, forceContribuyente, preferNoContribuyente, setValue, watch]);

  // Limpiar campos irrelevantes al cambiar naturaleza
  useEffect(() => {
    if (!setValue) return;
    if (isContribuyente) {
      setValue("tipo_documento_id", "");
      setValue("nro_documento", "");
    }
    if (isNoContribuyente) {
      setValue("ruc", "");
      setValue("dv", "");
      setValue("tipo_contribuyente_id", "");
    }
  }, [isContribuyente, isNoContribuyente, setValue]);

  return (
    <>
      <Divider sx={{ mb: 2 }}>
        <Typography variant="caption" color="text.secondary">
          Datos de Persona
        </Typography>
      </Divider>

      <Box sx={{ display: "grid", gridTemplateColumns: { xs: "1fr", md: "1fr 1fr" }, gap: 2, mb: 2 }}>
        {/* DOCUMENTO PRIMERO (igual que el alta de clientes): se tipea el número y
            la consulta a la DNIT completa el resto. */}

        {/* RUC + DV — solo Contribuyente */}
        {isContribuyente && (
          <>
            <Controller
              name="ruc"
              control={control}
              rules={{ required: isContribuyente ? "RUC es obligatorio" : false }}
              render={({ field }) => (
                <TextField
                  {...field}
                  label="RUC *"
                  fullWidth
                  autoFocus={forceContribuyente}
                  error={!!errors.ruc}
                  helperText={errors.ruc?.message || "Se completan razón social y DV al reconocer el RUC en la DNIT"}
                  inputProps={{ maxLength: 8 }}
                  InputProps={{
                    endAdornment: loadingDnit ? (
                      <CircularProgress size={16} />
                    ) : undefined,
                  }}
                />
              )}
            />
            <Controller
              name="dv"
              control={control}
              rules={{ required: isContribuyente ? "DV es obligatorio" : false }}
              render={({ field }) => (
                <TextField
                  {...field}
                  label="DV *"
                  fullWidth
                  type="number"
                  error={!!errors.dv}
                  helperText={errors.dv?.message}
                  inputProps={{ min: 0, max: 9 }}
                />
              )}
            />
          </>
        )}

        {/* Tipo documento + Nro. Documento — solo No Contribuyente */}
        {isNoContribuyente && (
          <>
            <Controller
              name="tipo_documento_id"
              control={control}
              rules={{ required: isNoContribuyente ? "Tipo de documento es obligatorio" : false }}
              render={({ field }) => (
                <Autocomplete
                  options={tiposDocumento}
                  getOptionLabel={(o) => `${o.codigo} - ${o.descripcion}`}
                  value={tiposDocumento.find((t) => t.id === field.value) || null}
                  onChange={(_, v) => field.onChange(v?.id || "")}
                  renderInput={(params) => (
                    <TextField
                      {...params}
                      label="Tipo de documento *"
                      error={!!errors.tipo_documento_id}
                      helperText={errors.tipo_documento_id?.message}
                    />
                  )}
                />
              )}
            />
            <Controller
              name="nro_documento"
              control={control}
              rules={{ required: isNoContribuyente ? "Nro. documento es obligatorio" : false }}
              render={({ field }) => (
                <TextField
                  {...field}
                  label="Nro. Documento (CI) *"
                  fullWidth
                  autoFocus={forceNoContribuyente || preferNoContribuyente}
                  error={!!errors.nro_documento}
                  helperText={errors.nro_documento?.message || "Con cédula, se completa el nombre desde el Padrón (DNIT)"}
                  inputProps={{ maxLength: 20 }}
                  InputProps={{
                    endAdornment: loadingDnit ? (
                      <CircularProgress size={16} />
                    ) : undefined,
                  }}
                />
              )}
            />
          </>
        )}

        {/* Naturaleza (oculta si está forzada; editable) — va después del documento */}
        {!forceNoContribuyente && !forceContribuyente && (
          <Controller
            name="naturaleza_id"
            control={control}
            rules={{ required: "Naturaleza es obligatoria" }}
            render={({ field }) => (
              <Autocomplete
                options={naturalezas}
                getOptionLabel={(o) => `${o.codigo} - ${o.descripcion}`}
                value={naturalezas.find((n) => n.id === field.value) || null}
                onChange={(_, v) => field.onChange(v?.id || "")}
                renderInput={(params) => (
                  <TextField
                    {...params}
                    label="Naturaleza *"
                    error={!!errors.naturaleza_id}
                    helperText={errors.naturaleza_id?.message}
                  />
                )}
              />
            )}
          />
        )}

        {/* Tipo contribuyente (auto-detectado por RUC; editable) — solo Contribuyente */}
        {isContribuyente && (
          <Controller
            name="tipo_contribuyente_id"
            control={control}
            render={({ field }) => (
              <Autocomplete
                options={tiposContribuyente}
                getOptionLabel={(o) => `${o.codigo} - ${o.descripcion}`}
                value={tiposContribuyente.find((t) => t.id === field.value) || null}
                onChange={(_, v) => field.onChange(v?.id || "")}
                disabled={!!tipoContribuyenteCalculado}
                renderInput={(params) => (
                  <TextField
                    {...params}
                    label="Tipo contribuyente"
                    helperText={tipoContribuyenteCalculado ? "Auto-detectado por RUC" : ""}
                  />
                )}
              />
            )}
          />
        )}

        {/* Razón Social / Nombre (se autocompleta desde la DNIT; editable) */}
        <Controller
          name="razon_social"
          control={control}
          rules={{ required: "Campo obligatorio", minLength: { value: 4, message: "Mínimo 4 caracteres" } }}
          render={({ field }) => (
            <TextField
              {...field}
              label={isContribuyente ? "Razón Social *" : "Nombre y Apellido *"}
              fullWidth
              error={!!errors.razon_social}
              helperText={errors.razon_social?.message}
              inputProps={{ maxLength: 255 }}
            />
          )}
        />

        <Controller
          name="celular"
          control={control}
          render={({ field }) => (
            <TextField
              {...field}
              label="Celular"
              fullWidth
              placeholder="5959XXXXXXXX"
              inputProps={{ maxLength: 20 }}
            />
          )}
        />

        <Controller
          name="email"
          control={control}
          render={({ field }) => (
            <TextField
              {...field}
              label="Email"
              fullWidth
              type="email"
              inputProps={{ maxLength: 80 }}
            />
          )}
        />

        <Controller
          name="direccion"
          control={control}
          rules={{ required: direccionRequerida ? "Dirección (domicilio fiscal) es obligatoria" : false }}
          render={({ field }) => (
            <TextField
              {...field}
              label={direccionRequerida ? "Dirección *" : "Dirección"}
              fullWidth
              inputProps={{ maxLength: 255 }}
              error={!!errors?.direccion}
              helperText={errors?.direccion?.message}
            />
          )}
        />
      </Box>
    </>
  );
};
