import { apiRequest } from "@/services/apiClient";
import type { BillingCycle, PriceQuote } from "@/types/commerce";

export const commerceService = {
  async calculate(payload: {
    plan_id: number;
    addon_ids?: number[];
    billing_cycle: BillingCycle;
    coupon_code?: string;
  }) {
    return apiRequest<PriceQuote>("/commerce/calculate", {
      method: "POST",
      body: payload,
    });
  },

  async createCheckout(
    payload: {
      plan_id: number;
      addon_ids?: number[];
      billing_cycle: BillingCycle;
      form_data?: Record<string, unknown>;
      coupon_code?: string;
    },
    token: string,
  ) {
    return apiRequest<{ session_id: string; amount: number; expires_at?: string }>(
      "/commerce/checkout",
      {
        method: "POST",
        body: payload,
        token,
      },
    );
  },

  async processPayment(
    payload: {
      session_id: string;
      form_data: Record<string, unknown>;
      payment_method?: string;
    },
    token: string,
  ) {
    return apiRequest<{
      subscription: unknown;
      payment: unknown;
      checkout_status: string;
      mercadopago_payment?: {
        id?: string;
        status?: string;
        qr_code?: string;
        qr_code_base64?: string;
        ticket_url?: string;
      };
    }>("/commerce/checkout/process-payment", {
      method: "POST",
      body: payload,
      token,
    });
  },

  async completeCheckout(
    payload: {
      session_id: string;
      gateway: string;
      payment_method: string;
      transaction_id?: string;
    },
    token: string,
  ) {
    return apiRequest<{
      subscription: unknown;
      payment: unknown;
      checkout_status: string;
      mercadopago?: { init_point: string; preapproval_id?: string } | null;
    }>("/commerce/checkout/complete", {
      method: "POST",
      body: payload,
      token,
    });
  },

  async getPlans() {
    return apiRequest<unknown[]>("/plans");
  },

  async getAddons() {
    return apiRequest<unknown[]>("/addons");
  },

  async billingOverview(token: string) {
    return apiRequest<{ subscription: unknown; payments: unknown[] }>(
      "/billing/overview",
      { token },
    );
  },
};
