import type {
  CompanyEntitlements,
  EntitlementCatalogue,
  PlanEntitlements,
  SetOverridePayload,
  UpdatePlanEntitlementsPayload,
  UpsellSignalOptions,
  UpsellSignalRow,
} from "@/domain/entities/entitlement";
import type { EntitlementRepository } from "@/domain/repositories/entitlement.repository";
import { api, apiClient } from "@/infrastructure/api/api-client";
import type { BackendPaginatedData, PaginationQueryParams } from "@/shared/types";

const key = (k: string) => encodeURIComponent(k);

export class EntitlementRepositoryImpl implements EntitlementRepository {
  getCatalogue() {
    return api.get<EntitlementCatalogue>("/entitlements/catalogue");
  }

  getPlan(planId: number) {
    return api.get<PlanEntitlements>(`/entitlements/plans/${planId}`);
  }

  updatePlan(planId: number, payload: UpdatePlanEntitlementsPayload) {
    return api.put<PlanEntitlements>(`/entitlements/plans/${planId}`, payload);
  }

  getCompany(companyId: number) {
    return api.get<CompanyEntitlements>(`/entitlements/companies/${companyId}`);
  }

  setOverride(companyId: number, k: string, payload: SetOverridePayload) {
    return api.put<CompanyEntitlements>(`/entitlements/companies/${companyId}/${key(k)}`, payload);
  }

  async removeOverride(companyId: number, k: string) {
    const { data } = await apiClient.delete<{ data: CompanyEntitlements }>(`/entitlements/companies/${companyId}/${key(k)}`);
    return data.data;
  }

  resetUsage(companyId: number, k: string) {
    return api.post<CompanyEntitlements>(`/entitlements/companies/${companyId}/${key(k)}/reset-usage`);
  }

  findUpsellSignals(params: PaginationQueryParams) {
    return api.get<BackendPaginatedData<UpsellSignalRow>>("/upsell-signals", { params });
  }

  getUpsellSignalOptions() {
    return api.get<UpsellSignalOptions>("/upsell-signals/options");
  }

  async markUpsellSignalHandled(signalId: number) {
    await apiClient.post(`/upsell-signals/${signalId}/handled`);
  }

  async reopenUpsellSignal(signalId: number) {
    await apiClient.delete(`/upsell-signals/${signalId}/handled`);
  }
}
