import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';

/**
 * Configuração centralizada da API
 * Todas as chamadas de API devem usar este serviço para garantir
 * autenticação e configuração consistente
 */
class ApiService {
  private axiosInstance: AxiosInstance;
  private apiKey: string;
  private baseURL: string;

  constructor() {
    // Busca configurações das variáveis de ambiente
    this.apiKey = import.meta.env.VITE_API_KEY || '';
    this.baseURL = import.meta.env.VITE_API_BASE_URL || '';

    // Validação das variáveis de ambiente
    if (!this.apiKey) {
      console.error('VITE_API_KEY não configurada no arquivo .env');
    }
    if (!this.baseURL) {
      console.error('VITE_API_BASE_URL não configurada no arquivo .env');
    }

    // Cria instância do Axios com configurações padrão
    this.axiosInstance = axios.create({
      baseURL: this.baseURL,
      timeout: 60000, // 60 segundos para upload de arquivos
      headers: {
        'Content-Type': 'application/json',
      },
    });

    // Interceptor para adicionar API Key em todas as requisições
    this.axiosInstance.interceptors.request.use(
      (config) => {
        // Adiciona a API Key no header de todas as requisições
        if (this.apiKey) {
          config.headers['apikey'] = this.apiKey;
        }
        return config;
      },
      (error) => {
        return Promise.reject(error);
      }
    );

    // Interceptor de resposta para tratamento centralizado de erros
    this.axiosInstance.interceptors.response.use(
      (response) => response,
      (error) => {
        // Log de erro para debug
        console.error('API Error:', {
          message: error.message,
          status: error.response?.status,
          data: error.response?.data,
        });

        // Retorna erro formatado
        return Promise.reject({
          message: error.response?.data?.message || error.message || 'Erro ao comunicar com o servidor',
          status: error.response?.status,
          data: error.response?.data,
        });
      }
    );
  }

  /**
   * Requisição GET
   */
  async get<T = any>(url: string, config?: AxiosRequestConfig): Promise<AxiosResponse<T>> {
    return this.axiosInstance.get<T>(url, config);
  }

  /**
   * Requisição POST
   */
  async post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<AxiosResponse<T>> {
    return this.axiosInstance.post<T>(url, data, config);
  }

  /**
   * Requisição POST com FormData (para upload de arquivos)
   */
  async postFormData<T = any>(url: string, formData: FormData, config?: AxiosRequestConfig): Promise<AxiosResponse<T>> {
    return this.axiosInstance.post<T>(url, formData, {
      ...config,
      headers: {
        ...config?.headers,
        'Content-Type': 'multipart/form-data',
      },
    });
  }

  /**
   * Requisição PUT
   */
  async put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<AxiosResponse<T>> {
    return this.axiosInstance.put<T>(url, data, config);
  }

  /**
   * Requisição DELETE
   */
  async delete<T = any>(url: string, config?: AxiosRequestConfig): Promise<AxiosResponse<T>> {
    return this.axiosInstance.delete<T>(url, config);
  }

  /**
   * Retorna a URL base configurada
   */
  getBaseURL(): string {
    return this.baseURL;
  }

  /**
   * Retorna a instância do Axios (uso avançado)
   */
  getInstance(): AxiosInstance {
    return this.axiosInstance;
  }
}

// Exporta instância única (Singleton)
export const apiService = new ApiService();
