// Monitoring Service - Camada de dados para monitoramento
// Flag USE_MOCK permite alternar entre mock data e API real

import { mockRequests, mockStats } from '../mocks/monitoringMock';

const USE_MOCK = true;
const API_URL = import.meta.env.VITE_API_URL || 'http://localhost:3000';

export const monitoringService = {
  /**
   * Lista solicitações com filtros opcionais
   * @param {Object} filters - Filtros (status, operation, etc)
   */
  async getRequests(filters = {}) {
    if (USE_MOCK) {
      await new Promise(resolve => setTimeout(resolve, 400));
      let filtered = [...mockRequests];
      
      if (filters.status) {
        filtered = filtered.filter(r => r.status === filters.status);
      }
      
      if (filters.operation) {
        filtered = filtered.filter(r => r.operation === filters.operation);
      }
      
      return filtered;
    }
    
    const params = new URLSearchParams(filters);
    const response = await fetch(`${API_URL}/api/gr/monitoring/requests?${params}`);
    if (!response.ok) throw new Error('Erro ao buscar solicitações');
    return response.json();
  },

  /**
   * Atende uma solicitação (marca como em análise)
   * @param {string} id - ID da solicitação
   * @param {string} attendedBy - Nome do atendente
   */
  async attendRequest(id, attendedBy) {
    if (USE_MOCK) {
      await new Promise(resolve => setTimeout(resolve, 300));
      const request = mockRequests.find(r => r.id === id);
      if (request) {
        request.processedBy = attendedBy;
        request.processedAt = new Date().toISOString();
      }
      return { success: true, request };
    }
    
    const response = await fetch(`${API_URL}/api/gr/monitoring/request/${id}/attend`, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({ attendedBy })
    });
    if (!response.ok) throw new Error('Erro ao atender solicitação');
    return response.json();
  },

  /**
   * Aprova e libera uma solicitação
   * @param {string} id - ID da solicitação
   * @param {Object} data - Dados de aprovação (cte, ae, etc)
   */
  async approveRequest(id, data) {
    if (USE_MOCK) {
      await new Promise(resolve => setTimeout(resolve, 500));
      const request = mockRequests.find(r => r.id === id);
      if (request) {
        request.status = 'LIBERADO';
        request.approvedBy = data.approvedBy;
        request.approvedAt = new Date().toISOString();
        Object.assign(request, data);
      }
      return { success: true, request };
    }
    
    const response = await fetch(`${API_URL}/api/gr/monitoring/request/${id}/approve`, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(data)
    });
    if (!response.ok) throw new Error('Erro ao aprovar solicitação');
    return response.json();
  },

  /**
   * Retorna estatísticas de solicitações
   */
  async getStats() {
    if (USE_MOCK) {
      await new Promise(resolve => setTimeout(resolve, 200));
      return mockStats;
    }
    
    const response = await fetch(`${API_URL}/api/gr/monitoring/stats`);
    if (!response.ok) throw new Error('Erro ao buscar estatísticas');
    return response.json();
  }
};
