"use client";

import { useSearchParams } from "next/navigation";
import { useEffect, useState } from "react";
import { useRouter } from "next/navigation";
import axios from "axios";
import Cookies from "js-cookie";
import toast from "react-hot-toast";
import { SO_POR_EQUIPO } from "@/data/so_por_equipo";
import { PROCESADORES_POR_EQUIPO } from "@/data/procesadores";

import "../app/styles/layout/agregarEquipo.scss";
import "./editar.css";

export default function Editar() {
  const searchParams = useSearchParams();
  const inventario = searchParams.get("equipoId");

  const router = useRouter();

  const [formData, setFormData] = useState({
    inventario: "",
    serie: "",
    modelo: "",
    id_tipo_equipo: 0,
    id_marca: 0,
    id_estado: 0,
    id_uso: 0,
    id_adscripcion: 0,
    id_sistema_operativo: 0,
    id_procesador: 0,
    lugar: "",
    observaciones: "",
    responsable: "",
    id_periferico: 0,
    id_laboratorio: 0,
    id_proyecto: 0,
    fechaMovimiento: "",
  });

  interface TipoUso {
    id_uso: number;
    tipo_uso: string;
  }

  interface Estado {
    id_estado: number;
    estado: string;
  }

  interface TipoEquipo {
    id_tipo_de_equipo: number;
    tipo_equipo: string;
  }

  interface SistemaOperativo {
    id_sistema_operativo: number;
    sistema_operativo: string;
  }

  interface Procesador {
    id_procesador: number;
    procesador: string;
  }

  interface Marca {
    id_marca: number;
    marca: string;
  }

  interface Adscripcion {
    id_adscripcion: number;
    adscripcion: string;
  }

  interface Perifericos {
    id_periferico: number;
    periferico: string;
  }

  interface Laboratorio {
    id_laboratorio: number;
    laboratorio: string;
  }

  interface Proyecto {
    id_proyecto: number;
    proyecto: string;
  }

  const [tiposUso, setTiposUso] = useState<TipoUso[]>([]);
  const [marcas, setMarcas] = useState<Marca[]>([]);
  const [estados, setEstados] = useState<Estado[]>([]);
  const [adscripciones, setAdscripciones] = useState<Adscripcion[]>([]);
  const [tiposEquipo, setTiposEquipo] = useState<TipoEquipo[]>([]);
  const [laboratorios, setLaboratorios] = useState<Laboratorio[]>([]);
  const [proyectos, setProyectos] = useState<Proyecto[]>([]);
  const [sistemasOperativos, setSistemasOperativos] = useState<SistemaOperativo[]>([]);
  const [procesadores, setProcesadores] = useState<Procesador[]>([]);
  const [perifericos, setPerifericos] = useState<Perifericos[]>([]);
  const [adscripcionLabel, setAdscripcionLabel] = useState("");
  const [id, setId] = useState(0);

  const [suggestions, setSuggestions] = useState({
    adscripcion: [] as string[],
  });

  const api_url = process.env.NEXT_PUBLIC_API_URL;
  const mostrarCamposComputadora = Number(formData.id_tipo_equipo) !== 9;

  // 🔹 Cargar catálogos
  useEffect(() => {
    const fetchCatalogos = async () => {
      const token = Cookies.get("token");
      const headers = { Authorization: `Bearer ${token}` };

      try {
        const [
          usosRes,
          marcasRes,
          estadosRes,
          adscripcionesRes,
          tiposEquipoRes,
          sistemasOperativosRes,
          procesadoresRes,
          laboratoriosRes,
          proyectosRes,
        ] = await Promise.all([
          axios.get(`${api_url}/equipos/usos`, { headers }),
          axios.get(`${api_url}/equipos/marcas`, { headers }),
          axios.get(`${api_url}/equipos/estados`, { headers }),
          axios.get(`${api_url}/equipos/adscripciones`, { headers }),
          axios.get(`${api_url}/equipos/tipos-equipo`, { headers }),
          axios.get(`${api_url}/equipos/sistemas-operativos`, { headers }),
          axios.get(`${api_url}/equipos/procesadores`, { headers }),
          axios.get(`${api_url}/equipos/laboratorios`, { headers }),
          axios.get(`${api_url}/equipos/proyectos`, { headers }),
        ]);

        setTiposUso(usosRes.data);
        setMarcas(marcasRes.data);
        setEstados(estadosRes.data);
        setAdscripciones(adscripcionesRes.data);
        setTiposEquipo(tiposEquipoRes.data);
        setSistemasOperativos(sistemasOperativosRes.data);
        setProcesadores(procesadoresRes.data);
        setLaboratorios(laboratoriosRes.data);
        setProyectos(proyectosRes.data);
      } catch (error) {
        console.error("Error cargando catálogos:", error);
        toast.error("No se pudieron cargar los catálogos de datos");
      }
    };

    fetchCatalogos();
  }, []);

  useEffect(() => {
    interface UnidadResponsable {
      idUnidadResponsable: number;
      unidadResponsable: string;
      cargo: string;
      titulo: string;
      nombre: string;
      apellidos: string;
      telefono: string;
      correo: string;
      nivel: number;
      idUnidadResponsablePapa: number;
      unidadResponsablePapa: string;
    }

    interface EquipoResponse {
      [key: string]: unknown;
      id_equipo: number;
      inventario: string;
      serie: string;
      lugar: string;
      fechaMovimiento: string;
      antiguedad: string;
      modelo: string;
      estado: { id_estado: number; estado: string };
      adscripcion: { id_adscripcion: number; adscripcion: string };
      sistemaOperativo: {
        id_sistema_operativo: number;
        sistema_operativo: string;
      } | null;
      tipoEquipo: { id_tipo_de_equipo: number; tipo_equipo: string } | null;
      procesador: {
        id_procesador: number;
        procesador: string;
      };
      tipoUso: { id_uso: number; tipo_uso: string };
      marca: { id_marca: number; marca: string };
      periferico: { id_periferico: number; periferico: string };
      observaciones?: string;
      id_laboratorio?: number;
      id_proyecto?: number;
    }

    const fetchEquipo = async () => {
      if (!inventario) return;
      const token = Cookies.get("token");
      const headers = { Authorization: `Bearer ${token}` };

      try {
        const response = await axios.get(
          `${api_url}/equipos/buscar/${inventario}`,
          { headers }
        );

        const equipo = response.data as EquipoResponse;

        const idAdscripcion = equipo.adscripcion?.id_adscripcion;

        const responsables: UnidadResponsable[] = Object.values(equipo).filter(
          (v): v is UnidadResponsable =>
            typeof v === "object" &&
            v !== null &&
            "idUnidadResponsable" in v &&
            "nombre" in v &&
            "apellidos" in v
        );

        const responsableEncontrado = responsables.find(
          (r) => r.idUnidadResponsable === idAdscripcion
        );

        const responsable = responsableEncontrado
          ? `${responsableEncontrado.nombre} ${responsableEncontrado.apellidos}`
          : "";

        setFormData({
          inventario: equipo.inventario || "",
          serie: (equipo.serie || "").toUpperCase(),
          id_marca: equipo.marca?.id_marca || 0,
          modelo: equipo.modelo || "",
          id_tipo_equipo: equipo.tipoEquipo?.id_tipo_de_equipo || 0,
          id_estado: equipo.estado?.id_estado || 0,
          id_sistema_operativo:
            equipo.sistemaOperativo?.id_sistema_operativo || 0,
          id_procesador: equipo.procesador?.id_procesador || 0,
          id_uso: equipo.tipoUso?.id_uso || 0,
          observaciones: equipo.observaciones || "",
          id_adscripcion: equipo.adscripcion?.id_adscripcion || 0,
          lugar: equipo.lugar || "",
          id_periferico: equipo.periferico?.id_periferico || 0,
          id_laboratorio: equipo.id_laboratorio || 0,
          id_proyecto: equipo.id_proyecto || 0,
          fechaMovimiento: equipo.fechaMovimiento || "",
          responsable,
        });

        setAdscripcionLabel(equipo.adscripcion?.adscripcion);
        setId(equipo.id_equipo);
      } catch (error) {
        console.error("Error al obtener el equipo:", error);
        toast.error("No se pudo cargar la información del equipo.");
      }
    };

    fetchEquipo();
  }, [inventario]);

  useEffect(() => {
    const fetchProcesador = async () => {
      const token = Cookies.get("token");
      const headers = { Authorization: `Bearer ${token}` };

      const response = await axios.get(
        `${api_url}/equipos/procesador-tipo-equipos`,
        {
          headers,
        }
      );

      setProcesadores(response.data);
    };
    fetchProcesador();
  }, [tiposEquipo]);

  useEffect(() => {
    const fetchPerifericos = async () => {
      if (Number(formData.id_tipo_equipo) != 9) return;

      const token = Cookies.get("token");
      const headers = { Authorization: `Bearer ${token}` };

      try {
        const response = await axios.get(`${api_url}/equipos/perifericos`, {
          headers,
        });
        setPerifericos(response.data);
      } catch (err) {
        console.error(err);
        toast.error("No se pudieron cargar los periféricos");
      }
    };

    fetchPerifericos();
  }, [formData.id_tipo_equipo]);

  const handleGuardar = async () => {
    if (!formData.inventario) {
      toast.error("Inventario no encontrado");
      return;
    }

    if (!formData.id_marca) {
      toast.error("marca no encontrada");
      return;
    }

    if (!formData.id_tipo_equipo) {
      toast.error("Tipo de equipo no encontrado");
      return;
    }

    if (!formData.id_estado) {
      toast.error("estado no encontrado");
      return;
    }

    if (!formData.id_uso) {
      toast.error("tipo de uso no encontrado");
      return;
    }

    if (!formData.id_adscripcion) {
      toast.error("adscripción no encontrada");
      return;
    }

    {/*if (!formData.id_laboratorio) {
      toast.error("Laboratorio no seleccionado");
      return;
    }

    if (!formData.id_proyecto) {
      toast.error("Proyecto no seleccionado");
      return;
    }*/}

    if (formData.id_tipo_equipo == 9) {
      if (!formData.id_periferico) {
        toast.error("Periférico no encontrado");
        return;
      }
    }

    if (
      formData.id_tipo_equipo != 8 &&
      formData.id_tipo_equipo != 7 &&
      formData.id_tipo_equipo != 9
    ) {
      if (!formData.id_sistema_operativo) {
        toast.error("Sistema operativo no encontrado");
        return;
      }
    }

    if (formData.id_tipo_equipo != 9) {
      if (!formData.id_procesador) {
        toast.error("Procesador no encontrado");
        return;
      }
    }

    const token = Cookies.get("token");
    const headers = { Authorization: `Bearer ${token}` };

    const data = {
      id_procesador: formData.id_procesador,
      id_estado: formData.id_estado,
      id_adscripcion: formData.id_adscripcion,
      id_laboratorio: formData.id_laboratorio,
      id_proyecto: formData.id_proyecto,
      lugar: formData.lugar,
      id_sistema_operativo: formData.id_sistema_operativo,
      id_tipo_uso: formData.id_uso,
      id_periferico:formData.id_periferico,
      serie: formData.serie,
      modelo: formData.modelo,
      id_marca: formData.id_marca,
      observaciones: formData.observaciones,
    };

    try {
      await axios.patch(`${api_url}/equipos/update/${id}`, data, {
        headers,
      });
      toast.success("Equipo actualizado correctamente");
      // router.push("/escaner");
    } catch (error) {
      console.error("Error al guardar:", error);
      toast.error("Hubo un error al guardar el equipo.");
    }
  };

  const handleInputChange = (
    field: string,
    value: string | number | boolean
  ) => {
    if (field === "adscripcionLabel") {
      const textValue = value as string;
      setAdscripcionLabel(textValue);

      const normalize = (str: string) =>
        str
          .normalize("NFD")
          .replace(/[\u0300-\u036f]/g, "")
          .toLowerCase();

      const matches = adscripciones
        .filter((a) => normalize(a.adscripcion).includes(normalize(textValue)))
        .map((a) => a.adscripcion);

      setSuggestions((prev) => ({
        ...prev,
        adscripcion: matches.slice(0, 5),
      }));
      return;
    }

    setFormData((prev) => {
      const newValue =
        field.startsWith("id_") && value !== "" ? Number(value) : value;

      if (field === "id_tipo_equipo") {
        const idTipoEquipo = Number(value);
        const tipoSeleccionado = tiposEquipo.find(
          (t) => t.id_tipo_de_equipo === idTipoEquipo
        );
        const esPeriferico = tipoSeleccionado?.tipo_equipo === "PERIFÉRICO";

        return {
          ...prev,
          id_tipo_equipo: idTipoEquipo,
          isImpresora: esPeriferico,
        };
      }

      return { ...prev, [field]: newValue };
    });
  };

  useEffect(() => {
    const fetchResponsable = async () => {
      if (!formData.id_adscripcion) return;

      try {
        const response = await axios.post(
          "https://venus.acatlan.unam.mx/funcionarios_test/test",
          {
            tipoBusqueda: "area",
            IdUnidadResponsable: formData.id_adscripcion,
          }
        );

        const data = response.data;

        if (Array.isArray(data) && data.length > 0) {
          const first = data[0];
          setFormData((prev) => ({
            ...prev,
            responsable: `${first.nombre ?? ""} ${first.apellidos ?? ""}`.trim(),
          }));
        } else {
          toast.error(
            "No se encontró información de la adscripción seleccionada"
          );
          setFormData((prev) => ({ ...prev, responsable: "" }));
        }
      } catch (err) {
        console.error("Error al obtener responsable:", err);
        toast.error("No se pudo conseguir el responsable");
        setFormData((prev) => ({ ...prev, responsable: "" }));
      }
    };

    fetchResponsable();
  }, [formData.id_adscripcion]);

  const handleCancelar = () => {
    router.push("/escaner");
  };

  return (
    <div className="agregarEquipoContainer">
      <div className="innerContainer">
        <h2 className="information">
          <span>
            {tiposEquipo.find(
              (t) => t.id_tipo_de_equipo === Number(formData.id_tipo_equipo)
            )?.tipo_equipo || "Sin tipo"}
          </span>
          <span>Inventario: {formData.inventario}</span>
          <span>
            Fecha de censo:{" "}
            {formData.fechaMovimiento
              ? new Date(formData.fechaMovimiento).toLocaleDateString("es-MX")
              : "Sin fecha"}
          </span>
        </h2>

        <form className="equipoForm">
          {/* Columna 1 */}
          <div className="column">
            <div className="formGroup">
              <label>Serie</label>
              <input
                type="text"
                value={formData.serie}
                placeholder="Ingresa serie"
                onChange={(e) =>
                  setFormData({
                    ...formData,
                    serie: e.target.value.toUpperCase(),
                  })
                }
              />
            </div>

            <div className="formGroup">
              <label>Marca</label>
              <select
                value={formData.id_marca}
                onChange={(e) =>
                  setFormData({ ...formData, id_marca: Number(e.target.value) })
                }
              >
                <option value="">Selecciona marca</option>
                {marcas.map((m) => (
                  <option key={m.id_marca} value={m.id_marca}>
                    {m.marca}
                  </option>
                ))}
              </select>
            </div>

            <div className="formGroup">
              <label>Modelo</label>
              <input
                type="text"
                value={formData.modelo}
                placeholder="Ingresa modelo"
                onChange={(e) =>
                  setFormData({ ...formData, modelo: e.target.value })
                }
              />
            </div>

            <div className="formGroup">
              <label>Tipo de equipo</label>
              <select
                style={{ background: "#f6f7f9" }}
                disabled
                required
                value={formData.id_tipo_equipo}
                onChange={(e) =>
                  handleInputChange("id_tipo_equipo", e.target.value)
                }
              >
                <option value="">Selecciona tipo de equipo</option>
                {tiposEquipo.map((t) => (
                  <option key={t.id_tipo_de_equipo} value={t.id_tipo_de_equipo}>
                    {t.tipo_equipo}
                  </option>
                ))}
              </select>
            </div>

            <div className="formGroup">
              <label>Estado</label>
              <select
                value={formData.id_estado}
                onChange={(e) =>
                  setFormData({
                    ...formData,
                    id_estado: Number(e.target.value),
                  })
                }
              >
                <option value="">Selecciona estado</option>
                {estados.map((e) => (
                  <option key={e.id_estado} value={e.id_estado}>
                    {e.estado}
                  </option>
                ))}
              </select>
            </div>
            
          </div>
          

          {/* Columna 2 */}
          <div className="column">
            <div className="formGroup">
              <label>Tipo de uso</label>
              <select
                value={formData.id_uso}
                onChange={(e) =>
                  setFormData({ ...formData, id_uso: Number(e.target.value) })
                }
              >
                <option value="">Selecciona uso</option>
                {tiposUso.map((t) => (
                  <option key={t.id_uso} value={t.id_uso}>
                    {t.tipo_uso}
                  </option>
                ))}
              </select>
            </div>
            {mostrarCamposComputadora && (
              <>
                <div className="formGroup">
                  <label>Procesador</label>
                  <select
                    value={formData.id_procesador}
                    onChange={(e) =>
                      handleInputChange("id_procesador", e.target.value)
                    }
                  >
                    <option value="">
                      {formData.id_tipo_equipo
                        ? "Selecciona procesador"
                        : "Selecciona primero el tipo de equipo"}
                    </option>
                    {PROCESADORES_POR_EQUIPO[formData.id_tipo_equipo]?.map(
                      (p) => (
                        <option key={p.id_procesador} value={p.id_procesador}>
                          {p.procesador}
                        </option>
                      )
                    )}
                  </select>
                </div>

                <div className="formGroup">
                  <label>Sistema operativo</label>
                  <select
                    value={formData.id_sistema_operativo}
                    onChange={(e) =>
                      handleInputChange("id_sistema_operativo", e.target.value)
                    }
                  >
                    <option value="">Selecciona sistema operativo</option>
                    {SO_POR_EQUIPO[formData.id_tipo_equipo]?.map((so) => (
                      <option
                        key={so.id_sistema_operativo}
                        value={so.id_sistema_operativo}
                      >
                        {so.sistema_operativo}
                      </option>
                    ))}
                  </select>
                </div>
              </>
            )}

            {!mostrarCamposComputadora && (
              <div className="formGroup">
                <label>Tipos de Periféricos</label>
                <select
                  value={formData.id_periferico || 0}
                  onChange={(e) =>
                    handleInputChange("id_periferico", e.target.value)
                  }
                >
                  <option value="">Selecciona periférico</option>
                  {perifericos.map((p) => (
                    <option key={p.id_periferico} value={p.id_periferico}>
                      {p.periferico}
                    </option>
                  ))}
                </select>
              </div>
            )}

            <div className="formGroup" style={{ position: "relative" }}>
              <label>Adscripción</label>
              <input
                required
                type="text"
                placeholder="Ingresa adscripción"
                value={adscripcionLabel}
                onChange={(e) =>
                  handleInputChange("adscripcionLabel", e.target.value)
                }
                style={{ fontSize: "13px" }}
              />
              {suggestions.adscripcion.length > 0 && (
                <ul className="suggestions">
                  {suggestions.adscripcion.map((s) => (
                    <li
                      key={s}
                      onClick={() => {
                        const selected = adscripciones.find(
                          (a) => a.adscripcion === s
                        );
                        if (selected) {
                          setFormData((prev) => ({
                            ...prev,
                            id_adscripcion: selected.id_adscripcion,
                          }));
                          setAdscripcionLabel(selected.adscripcion);
                          setSuggestions((prev) => ({
                            ...prev,
                            adscripcion: [],
                          }));
                        }
                      }}
                    >
                      {s}
                    </li>
                  ))}
                </ul>
              )}
            </div>

            <div className="formGroup">
              <label>Responsable</label>
              <input
                style={{ background: "#f6f7f9" }}
                type="text"
                value={formData.responsable}
                disabled
                placeholder="Selecciona una Adscripción"
              />
            </div>
            <div className="formGroup">
              <label>Laboratorio</label>
              <select
                value={formData.id_laboratorio}
                onChange={(e) => handleInputChange("id_laboratorio", e.target.value)}
              >
                <option value="">Selecciona laboratorio</option>
                {laboratorios.map((lab) => (
                  <option key={lab.id_laboratorio} value={lab.id_laboratorio}>
                    {lab.laboratorio}
                  </option>
                ))}
              </select>
            </div>
            
          </div>

          {/* Columna 3 */}
          <div className="column">
            <div className="formGroup">
              <label>Proyecto</label>
              <select
                value={formData.id_proyecto}
                onChange={(e) => handleInputChange("id_proyecto", e.target.value)}
              >
                <option value="">Selecciona proyecto</option>
                {proyectos.map((proy) => (
                  <option key={proy.id_proyecto} value={proy.id_proyecto}>
                    {proy.proyecto}
                  </option>
                ))}
              </select>
            </div>
            <div className="formGroup">
              <label>Lugar</label>
              <textarea
                value={formData.lugar}
                onChange={(e) =>
                  setFormData({ ...formData, lugar: e.target.value })
                }
                maxLength={200}
                rows={5}
                className="textAreaLarge"
              />
            </div>

            <div className="formGroup">
              <label>Observaciones</label>
              <textarea
                value={formData.observaciones}
                onChange={(e) =>
                  setFormData({ ...formData, observaciones: e.target.value })
                }
                maxLength={200}
                rows={5}
                className="textAreaLarge"
              />
            </div>

            <div className="formActions">
              <button
                type="button"
                className="btnGuardar"
                onClick={handleGuardar}
              >
                Guardar
              </button>
              <button
                type="button"
                className="btnCancelar"
                onClick={handleCancelar}
              >
                Cancelar
              </button>
            </div>
          </div>
        </form>
      </div>
    </div>
  );
}