import { useState, useCallback } from 'react';
import { entregasApiService, EntregaBff, EntregasBffParams } from '@/services/entregasApiService';

export interface UseEntregasReturn {
  entregas: EntregaBff[];
  loading: boolean;
  error: string | null;
  totalEntregas: number;
  currentPage: number;
  totalPages: number;
  listarEntregas: (params?: EntregasBffParams) => Promise<void>;
  buscarEntregaPorId: (id: string) => Promise<EntregaBff | null>;
  atualizarStatusEntrega: (id: string, status: EntregaBff['status']) => Promise<EntregaBff | null>;
  setCurrentPage: (page: number) => void;
  limparErro: () => void;
  // Estatísticas por status
  estatisticas: {
    pendentes: number;
    emTransito: number;
    entregues: number;
    canceladas: number;
    total: number;
  };
}

const DEFAULT_PAGE_SIZE = 20;

export const useEntregas = (): UseEntregasReturn => {
  const [entregas, setEntregas] = useState<EntregaBff[]>([]);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState<string | null>(null);
  const [totalEntregas, setTotalEntregas] = useState(0);
  const [currentPage, setCurrentPage] = useState(1);
  const [totalPages, setTotalPages] = useState(0);

  const listarEntregas = useCallback(async (params: EntregasBffParams = {}) => {
    setLoading(true);
    setError(null);

    try {
      // Usar parâmetros fornecidos ou valores padrão
      const requestParams = {
        page: params.page || currentPage,
        limit: params.limit || DEFAULT_PAGE_SIZE,
        search: params.search,
        status: params.status,
      };

      const response = await entregasApiService.listar(requestParams);

      setEntregas(response.items);
      setTotalEntregas(response.total);
      setCurrentPage(response.page);
      setTotalPages(Math.ceil(response.total / response.limit));



    } catch (err) {
      const errorMessage = err instanceof Error ? err.message : 'Erro desconhecido ao carregar entregas';
      setError(errorMessage);
      console.error('❌ Erro no hook useEntregas:', err);

      // Limpar dados em caso de erro
      setEntregas([]);
      setTotalEntregas(0);
      setTotalPages(0);
    } finally {
      setLoading(false);
    }
  }, [currentPage]);

  const buscarEntregaPorId = useCallback(async (id: string): Promise<EntregaBff | null> => {
    try {
      setError(null);
      return await entregasApiService.buscarPorId(id);
    } catch (err) {
      const errorMessage = err instanceof Error ? err.message : 'Erro desconhecido ao buscar entrega';
      setError(errorMessage);
      console.error('❌ Erro ao buscar entrega por ID:', err);
      return null;
    }
  }, []);

  const atualizarStatusEntrega = useCallback(async (id: string, status: EntregaBff['status']): Promise<EntregaBff | null> => {
    try {
      setError(null);
      const entregaAtualizada = await entregasApiService.atualizarStatus(id, status);

      // Atualizar a entrega na lista local
      setEntregas(prevEntregas =>
        prevEntregas.map(entrega =>
          entrega.id === id ? entregaAtualizada : entrega
        )
      );

      return entregaAtualizada;
    } catch (err) {
      const errorMessage = err instanceof Error ? err.message : 'Erro desconhecido ao atualizar status da entrega';
      setError(errorMessage);
      console.error('❌ Erro ao atualizar status da entrega:', err);
      return null;
    }
  }, []);

  const handleSetCurrentPage = useCallback((page: number) => {
    setCurrentPage(page);
  }, []);

  const limparErro = useCallback(() => {
    setError(null);
  }, []);

  // Calcular estatísticas
  const estatisticas = {
    pendentes: entregas.filter(e => e.status === 'pendente').length,
    emTransito: entregas.filter(e => e.status === 'em_transito').length,
    entregues: entregas.filter(e => e.status === 'entregue').length,
    canceladas: entregas.filter(e => e.status === 'cancelado').length,
    total: entregas.length,
  };

  return {
    entregas,
    loading,
    error,
    totalEntregas,
    currentPage,
    totalPages,
    listarEntregas,
    buscarEntregaPorId,
    atualizarStatusEntrega,
    setCurrentPage: handleSetCurrentPage,
    limparErro,
    estatisticas,
  };
};