import api from '@/services/api';
import { handleRequest } from '@/services/serviceUtils';

/**
 * Serviço para gestão de RH.
 * Implementa mapeamento de dados para isolar a estrutura da API.
 */
const ENDPOINTS = {
  AUTH: '/auth_monitoramento',
  COLABORADORES: '/colaboradores',
  DESCONTOS: '/descontos',
  PASSAGEM: '/passagem',
  PROVENTOS: '/proventos',
  BENEFICIOS: '/beneficios',
  CALCULOS: '/calculos',
  RECISAO: '/recisao',
  PAGAMENTO: '/pagamento',
  ANIVERSARIANTES: '/aniversariantes'
};

export const rhService = {
  /**
   * Autenticação do usuário (mesma rota do Prafrota)
   */
  login: (credentials) => handleRequest({
    apiFn: async () => {
      const { data } = await api.post(ENDPOINTS.AUTH, credentials);
      return data;
    }
  }),

  /**
   * Listagem de colaboradores com filtros
   */
  getCollaborators: (params = {}) => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(ENDPOINTS.COLABORADORES, { params });
      return data;
    }
  }),

  /**
   * Buscar colaborador por ID
   */
  getCollaboratorById: (id) => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(`${ENDPOINTS.COLABORADORES}/${id}`);
      return data;
    }
  }),

  /**
   * Criar novo colaborador
   */
  createCollaborator: (payload) => handleRequest({
    apiFn: async () => {
      const { data } = await api.post(`${ENDPOINTS.COLABORADORES}/criar`, payload);
      return data;
    }
  }),

  /**
   * Editar colaborador
   */
  updateCollaborator: (id, payload) => handleRequest({
    apiFn: async () => {
      const { data } = await api.put(`${ENDPOINTS.COLABORADORES}/${id}`, payload);
      return data;
    }
  }),

  /**
   * Inativar colaborador
   */
  inactivateCollaborator: (id) => handleRequest({
    apiFn: async () => {
      const { data } = await api.put(`${ENDPOINTS.COLABORADORES}/${id}/inativar`);
      return data;
    }
  }),

  /**
   * Reativar colaborador
   */
  reactivateCollaborator: (id) => handleRequest({
    apiFn: async () => {
      const { data } = await api.put(`${ENDPOINTS.COLABORADORES}/${id}/reativar`);
      return data;
    }
  }),

  /**
   * Listar valores para filtros por campo
   */
  getFilterValues: (campo) => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(`${ENDPOINTS.COLABORADORES}/filtros/${campo}`);
      return data;
    }
  }),

  /**
   * Buscar estatísticas de colaboradores
   */
  getStatistics: () => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(`${ENDPOINTS.COLABORADORES}/estatisticas`);
      return data;
    }
  }),

  /**
   * Buscar alertas (CNH, Férias, Dados faltantes)
   */
  getAlerts: () => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(`${ENDPOINTS.COLABORADORES}/alertas`);
      return data;
    }
  }),

  /**
   * Chat / Busca Inteligente
   */
  searchChat: (pergunta) => handleRequest({
    apiFn: async () => {
      const { data } = await api.post(`${ENDPOINTS.COLABORADORES}/chat`, { pergunta });
      return data;
    }
  }),

  /**
   * Busca lista de solicitações pendentes (Manter legado se necessário ou mock)
   */
  getPendingRequests: async () => {
    try {
      await new Promise(resolve => setTimeout(resolve, 800));
      const mockData = [
        { id: 1, name: 'Larissa Santos', type: 'Férias', date: '15/01 - 30/01', status: 'Pendente' },
        { id: 2, name: 'Marcos Oliveira', type: 'Ajuste de Ponto', date: '04/01', status: 'Aprovado' },
        { id: 3, name: 'Beatriz Silva', type: 'Reembolso', date: '02/01', status: 'Pendente' },
      ];
      return mockData.map(item => ({ ...item, isUrgent: item.status === 'Pendente' }));
    } catch (error) {
      console.error('Erro ao buscar solicitações de RH:', error);
      throw error;
    }
  },

  /**
   * Busca métricas do dashboard de RH (Mockado por enquanto ou via API de estatísticas)
   */
  getDashboardStats: async () => {
    return [
      { label: 'Total de Colaboradores', value: '482', trend: '+12', color: 'bg-indigo-100 text-indigo-600' },
      { label: 'Performance Média', value: '92%', trend: '+4%', color: 'bg-emerald-100 text-emerald-600' },
      { label: 'Satisfação (eNPS)', value: '78', trend: 'Estável', color: 'bg-rose-100 text-rose-600' },
      { label: 'Vagas Abertas', value: '15', trend: '3 urgentes', negative: true, color: 'bg-blue-100 text-blue-600' },
    ];
  },

  // ==================== DESCONTOS ====================
  /**
   * Criar ou atualizar descontos de um colaborador
   */
  createOrUpdateDescontos: (payload) => handleRequest({
    apiFn: async () => {
      const { data } = await api.post(ENDPOINTS.DESCONTOS, payload);
      return data;
    }
  }),

  /**
   * Buscar descontos por colaborador
   */
  getDescontosByColaborador: (idcolaborador, params = {}) => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(`${ENDPOINTS.DESCONTOS}/colaborador/${idcolaborador}`, { params });
      return data;
    }
  }),

  /**
   * Listar todos os descontos
   */
  getAllDescontos: (params = {}) => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(ENDPOINTS.DESCONTOS, { params });
      return data;
    }
  }),

  // ==================== PASSAGEM ====================
  /**
   * Criar ou atualizar passagem de um colaborador
   */
  createOrUpdatePassagem: (payload) => handleRequest({
    apiFn: async () => {
      const { data } = await api.post(ENDPOINTS.PASSAGEM, payload);
      return data;
    }
  }),

  /**
   * Buscar passagem por colaborador
   */
  getPassagemByColaborador: (idcolaborador, params = {}) => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(`${ENDPOINTS.PASSAGEM}/colaborador/${idcolaborador}`, { params });
      return data;
    }
  }),

  /**
   * Listar todas as passagens
   */
  getAllPassagens: (params = {}) => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(ENDPOINTS.PASSAGEM, { params });
      return data;
    }
  }),

  // ==================== PROVENTOS ====================
  /**
   * Criar ou atualizar proventos de um colaborador
   */
  createOrUpdateProventos: (payload) => handleRequest({
    apiFn: async () => {
      const { data } = await api.post(ENDPOINTS.PROVENTOS, payload);
      return data;
    }
  }),

  /**
   * Buscar proventos por colaborador
   */
  getProventosByColaborador: (idcolaborador, params = {}) => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(`${ENDPOINTS.PROVENTOS}/colaborador/${idcolaborador}`, { params });
      return data;
    }
  }),

  /**
   * Listar todos os proventos
   */
  getAllProventos: (params = {}) => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(ENDPOINTS.PROVENTOS, { params });
      return data;
    }
  }),

  // ==================== BENEFÍCIOS ====================
  /**
   * Criar benefício
   */
  createBeneficio: (payload) => handleRequest({
    apiFn: async () => {
      const { data } = await api.post(ENDPOINTS.BENEFICIOS, payload);
      return data;
    }
  }),

  /**
   * Listar benefícios
   */
  getAllBeneficios: (params = {}) => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(ENDPOINTS.BENEFICIOS, { params });
      return data;
    }
  }),

  /**
   * Buscar benefício por ID
   */
  getBeneficioById: (id) => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(`${ENDPOINTS.BENEFICIOS}/${id}`);
      return data;
    }
  }),

  /**
   * Atualizar benefício
   */
  updateBeneficio: (id, payload) => handleRequest({
    apiFn: async () => {
      const { data } = await api.put(`${ENDPOINTS.BENEFICIOS}/${id}`, payload);
      return data;
    }
  }),

  /**
   * Deletar benefício
   */
  deleteBeneficio: (id) => handleRequest({
    apiFn: async () => {
      const { data } = await api.delete(`${ENDPOINTS.BENEFICIOS}/${id}`);
      return data;
    }
  }),

  /**
   * Calcular desconto do benefício
   */
  calcularBeneficio: (id, payload = {}) => handleRequest({
    apiFn: async () => {
      const { data } = await api.post(`${ENDPOINTS.BENEFICIOS}/${id}/calcular`, payload);
      return data;
    }
  }),

  /**
   * Obter estrutura da tabela de benefícios
   */
  getBeneficiosEstrutura: () => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(`${ENDPOINTS.BENEFICIOS}/estrutura`);
      return data;
    }
  }),

  // ==================== CÁLCULOS TRABALHISTAS ====================
  /**
   * Calcular INSS
   */
  calcularINSS: (payload) => handleRequest({
    apiFn: async () => {
      const { data } = await api.post(`${ENDPOINTS.CALCULOS}/inss`, payload);
      return data;
    }
  }),

  /**
   * Calcular IRRF
   */
  calcularIRRF: (payload) => handleRequest({
    apiFn: async () => {
      const { data } = await api.post(`${ENDPOINTS.CALCULOS}/irrf`, payload);
      return data;
    }
  }),

  /**
   * Calcular FGTS
   */
  calcularFGTS: (payload) => handleRequest({
    apiFn: async () => {
      const { data } = await api.post(`${ENDPOINTS.CALCULOS}/fgts`, payload);
      return data;
    }
  }),

  /**
   * Calcular recisão
   */
  calcularRecisao: (payload) => handleRequest({
    apiFn: async () => {
      const { data } = await api.post(`${ENDPOINTS.CALCULOS}/recisao`, payload);
      return data;
    }
  }),

  /**
   * Calcular completo (INSS, IRRF, FGTS)
   */
  calcularCompleto: (payload) => handleRequest({
    apiFn: async () => {
      const { data } = await api.post(`${ENDPOINTS.CALCULOS}/completo`, payload);
      return data;
    }
  }),

  /**
   * Salvar cálculo no banco
   */
  salvarCalculo: (payload) => handleRequest({
    apiFn: async () => {
      const { data } = await api.post(`${ENDPOINTS.CALCULOS}/salvar`, payload);
      return data;
    }
  }),

  /**
   * Buscar cálculos por colaborador
   */
  getCalculosByColaborador: (idcolaborador, params = {}) => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(`${ENDPOINTS.CALCULOS}/colaborador/${idcolaborador}`, { params });
      return data;
    }
  }),

  /**
   * Listar todos os cálculos
   */
  getAllCalculos: (params = {}) => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(ENDPOINTS.CALCULOS, { params });
      return data;
    }
  }),

  /**
   * Atualizar cálculo
   */
  updateCalculo: (idcalculo, payload) => handleRequest({
    apiFn: async () => {
      const { data } = await api.put(`${ENDPOINTS.CALCULOS}/${idcalculo}`, payload);
      return data;
    }
  }),

  /**
   * Obter tabelas de referência (INSS, IRRF, FGTS)
   */
  getTabelasCalculos: () => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(`${ENDPOINTS.CALCULOS}/tabelas`);
      return data;
    }
  }),

  // ==================== RECISÃO TRABALHISTA ====================
  /**
   * Salvar recisão no banco
   */
  salvarRecisao: (payload) => handleRequest({
    apiFn: async () => {
      const { data } = await api.post(`${ENDPOINTS.RECISAO}/salvar`, payload);
      return data;
    }
  }),

  /**
   * Buscar recisões por colaborador
   */
  getRecisoesByColaborador: (idcolaborador) => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(`${ENDPOINTS.RECISAO}/colaborador/${idcolaborador}`);
      return data;
    }
  }),

  /**
   * Listar todas as recisões
   */
  getAllRecisoes: (params = {}) => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(ENDPOINTS.RECISAO, { params });
      return data;
    }
  }),

  // ==================== APRESENTAÇÃO DE PAGAMENTO ====================
  /**
   * Apresentação de pagamento por colaborador
   */
  getPagamentoByColaborador: (idcolaborador, params = {}) => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(`${ENDPOINTS.PAGAMENTO}/colaborador/${idcolaborador}`, { params });
      return data;
    }
  }),

  /**
   * Apresentação geral de pagamento
   */
  getPagamentoApresentacao: (params = {}) => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(`${ENDPOINTS.PAGAMENTO}/apresentacao`, { params });
      return data;
    }
  }),

  // ==================== GESTÃO ESPECIALIZADA DE TRABALHADORES ====================
  /**
   * Buscar todos os trabalhadores (Parceiros e Colaboradores)
   * Por enquanto retorna dados mock para demonstração
   */
  getTrabalhadores: async (params = {}) => {
    try {
      // TODO: Substituir por chamada real da API quando disponível
      await new Promise(resolve => setTimeout(resolve, 500));
      
      // Dados mock para demonstração
      const mockData = [
        // Colaboradores
        { id: 1, nome: 'João Silva', tipo: 'Colaborador', tipo_trabalhador: 'Colaborador', cpf: '123.456.789-00', cargo: 'Motorista', base: 'SP', empresa: 'PRALOG', status: 'Ativo', data_admissao: '2023-01-15', telefone: '(11) 98765-4321', email: 'joao.silva@pralog.com.br' },
        { id: 2, nome: 'Maria Santos', tipo: 'Colaborador', tipo_trabalhador: 'Colaborador', cpf: '234.567.890-11', cargo: 'Auxiliar Administrativo', base: 'RJ', empresa: 'PRALOG', status: 'Ativo', data_admissao: '2023-03-20', telefone: '(21) 98765-4321', email: 'maria.santos@pralog.com.br' },
        { id: 3, nome: 'Pedro Oliveira', tipo: 'Colaborador', tipo_trabalhador: 'Colaborador', cpf: '345.678.901-22', cargo: 'Supervisor', base: 'MG', empresa: 'PRALOG', status: 'Ativo', data_admissao: '2022-11-10', telefone: '(31) 98765-4321', email: 'pedro.oliveira@pralog.com.br' },
        { id: 4, nome: 'Ana Costa', tipo: 'Colaborador', tipo_trabalhador: 'Colaborador', cpf: '456.789.012-33', cargo: 'Analista RH', base: 'SP', empresa: 'PRALOG', status: 'Ativo', data_admissao: '2023-05-05', telefone: '(11) 98765-4321', email: 'ana.costa@pralog.com.br' },
        { id: 5, nome: 'Carlos Mendes', tipo: 'Colaborador', tipo_trabalhador: 'Colaborador', cpf: '567.890.123-44', cargo: 'Motorista', base: 'RJ', empresa: 'PRALOG', status: 'Férias', data_admissao: '2022-08-15', telefone: '(21) 98765-4321', email: 'carlos.mendes@pralog.com.br' },
        // Parceiros
        { id: 6, nome: 'Transportes ABC Ltda', tipo: 'Parceiro', tipo_trabalhador: 'Parceiro', cpf: '12.345.678/0001-90', cargo: 'Parceiro Logístico', base: 'SP', empresa: 'ABC Transportes', status: 'Ativo', data_admissao: '2023-02-01', telefone: '(11) 3456-7890', email: 'contato@abctransportes.com.br' },
        { id: 7, nome: 'Logística XYZ', tipo: 'Parceiro', tipo_trabalhador: 'Parceiro', cpf: '23.456.789/0001-01', cargo: 'Parceiro Logístico', base: 'MG', empresa: 'XYZ Logística', status: 'Ativo', data_admissao: '2023-04-10', telefone: '(31) 3456-7890', email: 'contato@xyzlogistica.com.br' },
        { id: 8, nome: 'Frete Rápido', tipo: 'Parceiro', tipo_trabalhador: 'Parceiro', cpf: '34.567.890/0001-12', cargo: 'Parceiro Logístico', base: 'RJ', empresa: 'Frete Rápido', status: 'Ativo', data_admissao: '2023-06-20', telefone: '(21) 3456-7890', email: 'contato@freterapido.com.br' },
        { id: 9, nome: 'Express Delivery', tipo: 'Parceiro', tipo_trabalhador: 'Parceiro', cpf: '45.678.901/0001-23', cargo: 'Parceiro Logístico', base: 'SP', empresa: 'Express Delivery', status: 'Inativo', data_admissao: '2022-12-05', telefone: '(11) 3456-7890', email: 'contato@expressdelivery.com.br' },
        { id: 10, nome: 'Logística Sul', tipo: 'Parceiro', tipo_trabalhador: 'Parceiro', cpf: '56.789.012/0001-34', cargo: 'Parceiro Logístico', base: 'RS', empresa: 'Logística Sul', status: 'Ativo', data_admissao: '2023-07-15', telefone: '(51) 3456-7890', email: 'contato@logisticasul.com.br' },
      ];
      
      return mockData;
    } catch (error) {
      console.error('Erro ao buscar trabalhadores:', error);
      throw error;
    }
  },

  /**
   * Buscar vencimentos de contratos de experiência
   * Por enquanto retorna dados mock para demonstração
   */
  getVencimentosContratosExperiencia: async () => {
    try {
      await new Promise(resolve => setTimeout(resolve, 500));
      
      const hoje = new Date();
      const mockData = [
        { id: 1, nome: 'João Silva', cargo: 'Motorista', base: 'SP', empresa: 'PRALOG', data_admissao: '2024-10-15', data_vencimento: '2025-01-15' },
        { id: 2, nome: 'Maria Santos', cargo: 'Auxiliar Administrativo', base: 'RJ', empresa: 'PRALOG', data_admissao: '2024-11-20', data_vencimento: '2025-02-20' },
        { id: 3, nome: 'Pedro Oliveira', cargo: 'Supervisor', base: 'MG', empresa: 'PRALOG', data_admissao: '2024-09-10', data_vencimento: '2025-01-10' },
        { id: 4, nome: 'Ana Costa', cargo: 'Analista RH', base: 'SP', empresa: 'PRALOG', data_admissao: '2024-12-05', data_vencimento: '2025-03-05' },
        { id: 5, nome: 'Carlos Mendes', cargo: 'Motorista', base: 'RJ', empresa: 'PRALOG', data_admissao: '2024-08-15', data_vencimento: '2025-01-15' },
        { id: 6, nome: 'Fernanda Lima', cargo: 'Assistente', base: 'SP', empresa: 'PRALOG', data_admissao: '2024-10-01', data_vencimento: '2025-01-01' },
        { id: 7, nome: 'Roberto Alves', cargo: 'Motorista', base: 'MG', empresa: 'PRALOG', data_admissao: '2024-11-10', data_vencimento: '2025-02-10' },
      ];
      
      return mockData;
    } catch (error) {
      console.error('Erro ao buscar vencimentos:', error);
      throw error;
    }
  },

  // ==================== ANIVERSARIANTES ====================
  /**
   * Buscar todos os aniversariantes
   */
  getAniversariantes: (params = {}) => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(ENDPOINTS.ANIVERSARIANTES, { params });
      return data;
    }
  }),

  /**
   * Buscar quantitativo de aniversariantes
   */
  getAniversariantesQuantitativo: () => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(`${ENDPOINTS.ANIVERSARIANTES}/quantitativo`);
      return data;
    }
  }),

  /**
   * Buscar aniversariantes do mês atual
   */
  getAniversariantesMesAtual: () => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(`${ENDPOINTS.ANIVERSARIANTES}/mes-atual`);
      return data;
    }
  }),

  /**
   * Buscar aniversariantes dos próximos meses
   */
  getAniversariantesProximosMeses: () => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(`${ENDPOINTS.ANIVERSARIANTES}/proximos-meses`);
      return data;
    }
  }),

  /**
   * Buscar aniversariantes de hoje
   */
  getAniversariantesHoje: () => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(`${ENDPOINTS.ANIVERSARIANTES}/hoje`);
      return data;
    }
  }),

  /**
   * Buscar estatísticas de aniversariantes
   */
  getAniversariantesEstatisticas: () => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(`${ENDPOINTS.ANIVERSARIANTES}/estatisticas`);
      return data;
    }
  }),

  /**
   * Buscar gestão de aniversariantes (método legado - mantido para compatibilidade)
   * Agora usa a rota real da API
   */
  getGestaoAniversariantes: (params = {}) => handleRequest({
    apiFn: async () => {
      const { data } = await api.get(ENDPOINTS.ANIVERSARIANTES, { params });
      return data;
    }
  }),

  /**
   * Buscar gestão de faltas, atestados e afastamentos
   * Por enquanto retorna dados mock para demonstração
   */
  getGestaoFaltasAtestados: async () => {
    try {
      await new Promise(resolve => setTimeout(resolve, 500));
      
      const mockData = [
        { id: 1, tipo: 'Falta', nome: 'João Silva', cargo: 'Motorista', base: 'SP', data: '2025-01-10', data_fim: null, tipo_detalhe: 'Falta não justificada', dias: 1, quantidade: 1, status: 'Pendente' },
        { id: 2, tipo: 'Atestado', nome: 'Maria Santos', cargo: 'Auxiliar Administrativo', base: 'RJ', data: '2025-01-12', data_fim: '2025-01-14', tipo_detalhe: 'Atestado Médico', dias: 3, quantidade: 1, status: 'Aprovado' },
        { id: 3, tipo: 'Falta', nome: 'Pedro Oliveira', cargo: 'Supervisor', base: 'MG', data: '2025-01-08', data_fim: null, tipo_detalhe: 'Falta justificada', dias: 1, quantidade: 1, status: 'Justificado' },
        { id: 4, tipo: 'Afastamento', nome: 'Ana Costa', cargo: 'Analista RH', base: 'SP', data: '2025-01-05', data_fim: '2025-01-20', tipo_detalhe: 'Afastamento Médico', dias: 15, quantidade: 1, status: 'Em andamento' },
        { id: 5, tipo: 'Atestado', nome: 'Carlos Mendes', cargo: 'Motorista', base: 'RJ', data: '2025-01-15', data_fim: '2025-01-17', tipo_detalhe: 'Atestado Odontológico', dias: 3, quantidade: 1, status: 'Aprovado' },
        { id: 6, tipo: 'Falta', nome: 'Fernanda Lima', cargo: 'Assistente', base: 'SP', data: '2025-01-11', data_fim: null, tipo_detalhe: 'Falta não justificada', dias: 1, quantidade: 1, status: 'Pendente' },
        { id: 7, tipo: 'Afastamento', nome: 'Roberto Alves', cargo: 'Motorista', base: 'MG', data: '2025-01-01', data_fim: '2025-01-10', tipo_detalhe: 'Afastamento por Acidente', dias: 10, quantidade: 1, status: 'Finalizado' },
      ];
      
      return mockData;
    } catch (error) {
      console.error('Erro ao buscar gestão de faltas/atestados:', error);
      throw error;
    }
  }
};
