/**
 * Serviço de Relatórios
 */

import { apiClient } from "../api/client";
import type {
  Report,
  CreateReportInput,
  UpdateReportInput,
  ReportFilters,
} from "./types";

class ReportService {
  private readonly basePath = "/reports";

  /**
   * Lista relatórios com filtros opcionais
   */
  async list(filters?: ReportFilters): Promise<Report[]> {
    const params: Record<string, string> = {};

    if (filters?.patient_id) {
      params["patient_id"] = `eq.${filters.patient_id}`;
    }

    if (filters?.status) {
      params["status"] = `eq.${filters.status}`;
    }

    const response = await apiClient.get<Report[]>(this.basePath, { params });
    return response.data;
  }

  /**
   * Busca relatório por ID
   */
  async getById(id: string): Promise<Report> {
    const response = await apiClient.get<Report[]>(
      `${this.basePath}?id=eq.${id}`
    );
    if (response.data && response.data.length > 0) {
      return response.data[0];
    }
    throw new Error("Relatório não encontrado");
  }

  /**
   * Cria novo relatório
   * Nota: order_number é gerado automaticamente pelo backend
   */
  async create(data: CreateReportInput): Promise<Report> {
    const response = await apiClient.post<Report>(this.basePath, data);
    return response.data;
  }

  /**
   * Atualiza relatório existente
   * Nota: order_number não pode ser modificado
   */
  async update(id: string, data: UpdateReportInput): Promise<Report> {
    const response = await apiClient.patch<Report[]>(
      `${this.basePath}?id=eq.${id}`,
      data
    );
    if (response.data && response.data.length > 0) {
      return response.data[0];
    }
    throw new Error("Relatório não encontrado");
  }
}

export const reportService = new ReportService();
