import type {
  CancelSubscriptionPayload,
  CompanySubscriptionState,
  PlanChangePreview,
  Subscription,
  SubscriptionStats,
  UpdateCompanyPlanPayload,
} from "@/domain/entities/subscription";
import type { SubscriptionPlan, CreatePlanPayload, UpdatePlanPayload } from "@/domain/entities/subscription-plan";
import type { SubscriptionRepository } from "@/domain/repositories/subscription.repository";
import type { BackendPaginatedData, PaginationQueryParams } from "@/shared/types";
import { api } from "@/infrastructure/api/api-client";

export class SubscriptionRepositoryImpl implements SubscriptionRepository {
  findAll(params: PaginationQueryParams) {
    return api.get<BackendPaginatedData<Subscription>>("/subscriptions", { params });
  }

  getPlans() {
    return api.get<SubscriptionPlan[]>("/subscriptions/plans");
  }

  createPlan(payload: CreatePlanPayload) {
    return api.post<SubscriptionPlan>("/subscriptions/plans", payload);
  }

  updatePlan(id: number, payload: UpdatePlanPayload) {
    return api.put<SubscriptionPlan>(`/subscriptions/plans/${id}`, payload);
  }

  updateCompanyPlan(companyId: number, payload: UpdateCompanyPlanPayload) {
    return api.put<void>(`/subscriptions/${companyId}/plan`, payload);
  }

  getStats() {
    return api.get<SubscriptionStats>("/subscriptions/stats");
  }

  previewCompanyPlan(companyId: number, planId: number) {
    return api.get<PlanChangePreview>(`/subscriptions/${companyId}/plan/preview`, { params: { subscription_plan_id: planId } });
  }

  getCompanySubscription(companyId: number) {
    return api.get<CompanySubscriptionState>(`/subscriptions/${companyId}/subscription`);
  }

  cancelCompanySubscription(companyId: number, payload: CancelSubscriptionPayload) {
    return api.post<CompanySubscriptionState>(`/subscriptions/${companyId}/cancellation`, payload);
  }

  undoCompanyCancellation(companyId: number) {
    return api.delete(`/subscriptions/${companyId}/cancellation`);
  }
}
