"use client";

import { useCallback, useEffect, useState } from "react";
import {
  createEquipment,
  deleteEquipment,
  getEquipment,
  getEquipmentById,
  getEquipmentCategories,
  getEquipmentStats,
  updateEquipment,
} from "@/services/equipment-service";
import {
  CreateEquipmentDTO,
  Equipment,
  EquipmentCategory,
  EquipmentFilterParams,
  EquipmentStats,
  EquipmentStatus,
  UpdateEquipmentDTO,
} from "@/types/equipment";

export function useEquipment() {
  const [equipmentList, setEquipmentList] = useState<Equipment[]>([]);
  const [categories, setCategories] = useState<EquipmentCategory[]>([]);
  const [stats, setStats] = useState<EquipmentStats>({
    total: 0,
    available: 0,
    rented: 0,
    maintenance: 0,
    reserved: 0,
    totalAcquisitionValue: 0,
  });

  const [totalItems, setTotalItems] = useState(0);
  const [totalPages, setTotalPages] = useState(1);
  const [currentPage, setCurrentPage] = useState(1);

  const [isLoading, setIsLoading] = useState(true);
  const [isSaving, setIsSaving] = useState(false);
  const [selectedEquipment, setSelectedEquipment] = useState<Equipment | null>(null);
  const [isDetailLoading, setIsDetailLoading] = useState(false);

  const [filters, setFilters] = useState<EquipmentFilterParams>({
    search: "",
    status: "ALL",
    categoryId: "ALL",
    page: 1,
    limit: 10,
  });

  const loadData = useCallback(async () => {
    setIsLoading(true);
    try {
      const [res, statsData, categoriesData] = await Promise.all([
        getEquipment(filters),
        getEquipmentStats(),
        getEquipmentCategories(),
      ]);

      setEquipmentList(res.items);
      setTotalItems(res.total);
      setTotalPages(res.totalPages);
      setCurrentPage(res.page);
      setStats(statsData);
      setCategories(categoriesData);
    } catch (err) {
      console.error("Erro ao carregar equipamentos:", err);
    } finally {
      setIsLoading(false);
    }
  }, [filters]);

  useEffect(() => {
    loadData();
  }, [loadData]);

  const setSearch = (search: string) => {
    setFilters((prev) => ({ ...prev, search, page: 1 }));
  };

  const setStatusFilter = (status: EquipmentStatus | "ALL") => {
    setFilters((prev) => ({ ...prev, status, page: 1 }));
  };

  const setCategoryFilter = (categoryId: string | "ALL") => {
    setFilters((prev) => ({ ...prev, categoryId, page: 1 }));
  };

  const setPage = (page: number) => {
    setFilters((prev) => ({ ...prev, page }));
  };

  const loadEquipmentDetails = async (id: string) => {
    setIsDetailLoading(true);
    try {
      const details = await getEquipmentById(id);
      setSelectedEquipment(details);
    } catch (err) {
      console.error("Erro ao carregar detalhes do equipamento:", err);
    } finally {
      setIsDetailLoading(false);
    }
  };

  const handleCreateEquipment = async (data: CreateEquipmentDTO) => {
    setIsSaving(true);
    try {
      const created = await createEquipment(data);
      await loadData();
      return created;
    } finally {
      setIsSaving(false);
    }
  };

  const handleUpdateEquipment = async (id: string, data: UpdateEquipmentDTO) => {
    setIsSaving(true);
    try {
      const updated = await updateEquipment(id, data);
      await loadData();
      if (selectedEquipment?.id === id) {
        setSelectedEquipment((prev) => (prev ? { ...prev, ...updated } : null));
      }
      return updated;
    } finally {
      setIsSaving(false);
    }
  };

  const handleDeleteEquipment = async (id: string) => {
    try {
      await deleteEquipment(id);
      if (selectedEquipment?.id === id) {
        setSelectedEquipment(null);
      }
      await loadData();
    } catch (err) {
      console.error("Erro ao excluir equipamento:", err);
      throw err;
    }
  };

  const handleToggleStatus = async (id: string, newStatus: EquipmentStatus) => {
    return handleUpdateEquipment(id, { status: newStatus });
  };

  return {
    equipmentList,
    categories,
    stats,
    totalItems,
    totalPages,
    currentPage,
    filters,
    isLoading,
    isSaving,
    selectedEquipment,
    isDetailLoading,
    setSelectedEquipment,
    setSearch,
    setStatusFilter,
    setCategoryFilter,
    setPage,
    loadData,
    loadEquipmentDetails,
    createEquipment: handleCreateEquipment,
    updateEquipment: handleUpdateEquipment,
    deleteEquipment: handleDeleteEquipment,
    toggleStatus: handleToggleStatus,
  };
}
