/**
 * Serviço de Médicos (Frontend)
 */

import { apiClient } from "../api/client";
import type {
  Doctor,
  CreateDoctorInput,
  UpdateDoctorInput,
  DoctorFilters,
} from "./types";

class DoctorService {
  /**
   * Lista todos os médicos
   */
  async list(filters?: DoctorFilters): Promise<Doctor[]> {
    try {
      const params = new URLSearchParams();

      if (filters?.crm) {
        params.append("crm", `eq.${filters.crm}`);
      }
      if (filters?.crm_uf) {
        params.append("crm_uf", `eq.${filters.crm_uf}`);
      }
      if (filters?.specialty) {
        params.append("specialty", `ilike.*${filters.specialty}*`);
      }
      if (filters?.active !== undefined) {
        params.append("active", `eq.${filters.active}`);
      }
      if (filters?.full_name) {
        params.append("full_name", `ilike.*${filters.full_name}*`);
      }

      const queryString = params.toString();
      const url = queryString ? `/doctors?${queryString}` : "/doctors";

      const response = await apiClient.get<Doctor[]>(url);
      return response.data;
    } catch (error: any) {
      // Silenciar erro 401 (não autenticado) - é esperado em páginas públicas
      if (error?.response?.status !== 401) {
        console.error("Erro ao listar médicos:", error);
      }
      throw error;
    }
  }

  /**
   * Busca médico por ID
   */
  async getById(id: string): Promise<Doctor> {
    try {
      const response = await apiClient.get<Doctor[]>(`/doctors?id=eq.${id}`);
      if (response.data && response.data.length > 0) {
        return response.data[0];
      }
      throw new Error("Médico não encontrado");
    } catch (error) {
      console.error("Erro ao buscar médico:", error);
      throw error;
    }
  }

  /**
   * Busca médico por user_id (Supabase Auth)
   */
  async getByUserId(userId: string): Promise<Doctor | null> {
    try {
      const response = await apiClient.get<Doctor[]>(
        `/doctors?user_id=eq.${userId}`
      );
      if (response.data && response.data.length > 0) {
        return response.data[0];
      }
      return null;
    } catch (error) {
      console.error("Erro ao buscar médico por user_id:", error);
      return null;
    }
  }

  /**
   * Busca médico por email
   */
  async getByEmail(email: string): Promise<Doctor | null> {
    try {
      const response = await apiClient.get<Doctor[]>(
        `/doctors?email=eq.${email}`
      );
      if (response.data && response.data.length > 0) {
        return response.data[0];
      }
      return null;
    } catch (error) {
      console.error("Erro ao buscar médico por email:", error);
      return null;
    }
  }

  /**
   * Cria novo médico
   */
  async create(data: CreateDoctorInput): Promise<Doctor> {
    try {
      const response = await apiClient.post<Doctor>("/doctors", data);
      return response.data;
    } catch (error) {
      console.error("Erro ao criar médico:", error);
      throw error;
    }
  }

  /**
   * Atualiza médico existente
   */
  async update(id: string, data: UpdateDoctorInput): Promise<Doctor> {
    try {
      const response = await apiClient.patch<Doctor[]>(
        `/doctors?id=eq.${id}`,
        data
      );
      if (response.data && response.data.length > 0) {
        return response.data[0];
      }
      throw new Error("Médico não encontrado");
    } catch (error) {
      console.error("Erro ao atualizar médico:", error);
      throw error;
    }
  }

  /**
   * Atualiza médico por user_id
   */
  async updateByUserId(userId: string, data: UpdateDoctorInput): Promise<Doctor> {
    try {
      const response = await apiClient.patch<Doctor[]>(
        `/doctors?user_id=eq.${userId}`,
        data
      );
      if (response.data && response.data.length > 0) {
        return response.data[0];
      }
      throw new Error("Médico não encontrado");
    } catch (error) {
      console.error("Erro ao atualizar médico por user_id:", error);
      throw error;
    }
  }

  /**
   * Deleta médico
   */
  async delete(id: string): Promise<void> {
    try {
      await apiClient.delete(`/doctors?id=eq.${id}`);
    } catch (error) {
      console.error("Erro ao deletar médico:", error);
      throw error;
    }
  }
}

export const doctorService = new DoctorService();
