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

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

class ReportService {
  /**
   * Lista relatórios com filtros opcionais
   */
  async list(filters?: ReportFilters): Promise<Report[]> {
    console.log("[ReportService] list() filters:", filters);

    try {
      const params = new URLSearchParams();

      if (filters?.patient_id) {
        params.append("patient_id", `eq.${filters.patient_id}`);
      }

      if (filters?.status) {
        params.append("status", `eq.${filters.status}`);
      }

      if (filters?.created_by) {
        params.append("created_by", `eq.${filters.created_by}`);
      }

      if (filters?.order) {
        params.append("order", filters.order);
      }

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

      console.log("[ReportService] Requisição para:", url);

      const response = await apiClient.get<Report[]>(url);
      const reports = response.data || [];

      console.log("[ReportService] list() - reports found:", reports.length);
      return reports;
    } catch (error: any) {
      console.error("[ReportService] list() - error:", error);
      console.error("[ReportService] error details:", {
        message: error?.message,
        response: error?.response?.data,
        status: error?.response?.status,
      });
      throw new Error(`Erro ao listar relatórios: ${error.message}`);
    }
  }

  /**
   * Busca relatório por ID
   */
  async getById(id: string): Promise<Report> {
    console.log("[ReportService] getById() - id:", id);

    try {
      const response = await apiClient.get<Report[]>(`/reports?id=eq.${id}`);
      const report = response.data?.[0];

      if (!report) {
        throw new Error("Relatório não encontrado");
      }

      console.log("[ReportService] getById() - found:", report);
      return report;
    } catch (error: any) {
      console.error("[ReportService] getById() - error:", error);
      throw new Error(`Erro ao buscar relatório: ${error.message}`);
    }
  }

  /**
   * Cria novo relatório
   * Nota: order_number é gerado automaticamente pelo backend
   */
  async create(data: CreateReportInput): Promise<Report> {
    console.log("[ReportService] create() - data:", data);

    try {
      const response = await apiClient.post<Report>("/reports", data, {
        headers: {
          Prefer: "return=representation",
        },
      });

      console.log("[ReportService] create() - success:", response.data);
      return response.data;
    } catch (error: any) {
      console.error("[ReportService] create() - error:", error);
      throw new Error(`Erro ao criar relatório: ${error.message}`);
    }
  }

  /**
   * Atualiza relatório existente
   * Nota: order_number não pode ser modificado
   */
  async update(id: string, data: UpdateReportInput): Promise<Report> {
    console.log("[ReportService] update() - id:", id, "data:", data);

    try {
      const response = await apiClient.patch<Report[]>(
        `/reports?id=eq.${id}`,
        data,
        {
          headers: {
            Prefer: "return=representation",
          },
        }
      );

      const report = response.data?.[0];
      if (!report) {
        throw new Error("Relatório não encontrado para atualizar");
      }

      console.log("[ReportService] update() - success:", report);
      return report;
    } catch (error: any) {
      console.error("[ReportService] update() - error:", error);
      throw new Error(`Erro ao atualizar relatório: ${error.message}`);
    }
  }
}

export const reportService = new ReportService();
