import { useState, useCallback } from 'react';
import { usuarioApiService, UsuarioBff, UsuariosBffParams } from '@/services/usuarioApiService';

export interface UseUsuariosApiReturn {
  usuarios: UsuarioBff[];
  loading: boolean;
  error: string | null;
  totalUsuarios: number;
  currentPage: number;
  totalPages: number;
  listarUsuarios: (params?: UsuariosBffParams) => Promise<void>;
  buscarUsuarioPorId: (id: string) => Promise<UsuarioBff | null>;
  atualizarUsuario: (id: string, data: Partial<UsuarioBff>) => Promise<UsuarioBff | null>;
  setCurrentPage: (page: number) => void;
  limparErro: () => void;
}

const DEFAULT_PAGE_SIZE = 20;

export const useUsuariosApi = (): UseUsuariosApiReturn => {
  const [usuarios, setUsuarios] = useState<UsuarioBff[]>([]);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState<string | null>(null);
  const [totalUsuarios, setTotalUsuarios] = useState(0);
  const [currentPage, setCurrentPage] = useState(1);
  const [totalPages, setTotalPages] = useState(0);

  const listarUsuarios = useCallback(async (params: UsuariosBffParams = {}) => {
    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,
      };

      const response = await usuarioApiService.listar(requestParams);

      setUsuarios(response.items);
      setTotalUsuarios(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 usuários';
      setError(errorMessage);
      console.error('❌ Erro no hook useUsuariosApi:', err);

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

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

  const atualizarUsuario = useCallback(async (id: string, data: Partial<UsuarioBff>): Promise<UsuarioBff | null> => {
    try {
      setError(null);
      const usuarioAtualizado = await usuarioApiService.atualizar(id, data);

      // Atualizar o usuário na lista local
      setUsuarios(prevUsuarios =>
        prevUsuarios.map(usuario =>
          usuario.id === id ? usuarioAtualizado : usuario
        )
      );

      return usuarioAtualizado;
    } catch (err) {
      const errorMessage = err instanceof Error ? err.message : 'Erro desconhecido ao atualizar usuário';
      setError(errorMessage);
      console.error('❌ Erro ao atualizar usuário:', err);
      return null;
    }
  }, []);

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

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

  return {
    usuarios,
    loading,
    error,
    totalUsuarios,
    currentPage,
    totalPages,
    listarUsuarios,
    buscarUsuarioPorId,
    atualizarUsuario,
    setCurrentPage: handleSetCurrentPage,
    limparErro,
  };
};