import type { DonnaCandidate, DonnaClientDetail, DonnaSettings, DonnaUsageMonth, UpdateDonnaClientPayload } from "@/domain/entities/donna";
import type { DonnaRepository } from "@/domain/repositories/donna.repository";
import { api } from "@/infrastructure/api/api-client";

const BASE = "/donna";

export class DonnaRepositoryImpl implements DonnaRepository {
  getUsage(params: { month?: string; search?: string }) {
    return api.get<DonnaUsageMonth>(`${BASE}/usage`, { params });
  }

  findClient(companyId: number, month?: string) {
    return api.get<DonnaClientDetail>(`${BASE}/clients/${companyId}`, { params: month ? { month } : undefined });
  }

  updateClient(companyId: number, payload: UpdateDonnaClientPayload) {
    return api.put<DonnaClientDetail>(`${BASE}/clients/${companyId}`, payload);
  }

  grantGift(companyId: number) {
    return api.post<DonnaClientDetail>(`${BASE}/clients/${companyId}/grant`);
  }

  customGift(companyId: number, payload: { amount_eur: number; note?: string | null }) {
    return api.post<DonnaClientDetail>(`${BASE}/clients/${companyId}/gift`, payload);
  }

  grantAll() {
    return api.post<{ granted: number; amount_eur: number }>(`${BASE}/grants/all`);
  }

  getCandidates(search?: string) {
    return api.get<DonnaCandidate[]>(`${BASE}/candidates`, { params: search ? { search } : undefined });
  }

  addClient(payload: { company_id: number; donna_price_per_vehicle?: number | null; amount_eur?: number | null; note?: string | null }) {
    return api.post<DonnaClientDetail>(`${BASE}/clients`, payload);
  }

  removeClient(companyId: number) {
    return api.delete(`${BASE}/clients/${companyId}`);
  }

  getSettings() {
    return api.get<DonnaSettings>(`${BASE}/settings`);
  }

  updateSettings(payload: Partial<DonnaSettings>) {
    return api.put<DonnaSettings>(`${BASE}/settings`, payload);
  }

  revokeGift(grantId: number) {
    return api.post<DonnaClientDetail>(`${BASE}/grants/${grantId}/revoke`);
  }

  restoreGift(grantId: number) {
    return api.post<DonnaClientDetail>(`${BASE}/grants/${grantId}/restore`);
  }
}
