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

export interface SubscriptionRepository {
  findAll(params: PaginationQueryParams): Promise<BackendPaginatedData<Subscription>>;
  getPlans(): Promise<SubscriptionPlan[]>;
  createPlan(data: CreatePlanPayload): Promise<SubscriptionPlan>;
  updatePlan(id: number, data: UpdatePlanPayload): Promise<SubscriptionPlan>;
  updateCompanyPlan(companyId: number, data: UpdateCompanyPlanPayload): Promise<void>;
  getStats(): Promise<SubscriptionStats>;
  // Plan changes during the month and cancellation (billing automation, part 2).
  // companyId is the company account's id, as for updateCompanyPlan.
  previewCompanyPlan(companyId: number, planId: number): Promise<PlanChangePreview>;
  getCompanySubscription(companyId: number): Promise<CompanySubscriptionState>;
  cancelCompanySubscription(companyId: number, data: CancelSubscriptionPayload): Promise<CompanySubscriptionState>;
  undoCompanyCancellation(companyId: number): Promise<void>;
}
