import { apiService } from "./base";

export interface StripePlan {
  id: "essential" | "premium";
  name: string;
  description: string;
  monthlyRecipes: number | null;
  features: string[];
  available: boolean;
}

export interface SubscriptionStatus {
  plan: "free" | "essential" | "premium";
  status: string | null;
  currentPeriodEnd: string | null;
  hasActiveSubscription: boolean;
}

const stripeService = {
  /** Récupère la liste des plans disponibles */
  getPlans: (): Promise<{ plans: StripePlan[] }> => apiService.get("/stripe/plans"),

  /** Récupère le statut d'abonnement de l'utilisateur courant */
  getSubscription: (): Promise<SubscriptionStatus> =>
    apiService.get("/stripe/subscription"),

  /** Démarre un Checkout Stripe — redirige vers l'URL renvoyée */
  startCheckout: async (plan: "essential" | "premium"): Promise<void> => {
    const { url } = await apiService.post<{ url: string; sessionId: string }>(
      "/stripe/checkout",
      { plan }
    );
    if (!url) throw new Error("Pas d'URL de checkout reçue");
    window.location.href = url;
  },

  /** Ouvre le Customer Portal pour gérer l'abonnement */
  openPortal: async (): Promise<void> => {
    const { url } = await apiService.post<{ url: string }>("/stripe/portal", {});
    if (!url) throw new Error("Pas d'URL de portail reçue");
    window.location.href = url;
  },

  /**
   * Ouvre directement le flow d'annulation du Customer Portal.
   * Après validation, Stripe redirige automatiquement vers
   * /subscription/cancelled (géré par flow_data.after_completion côté backend).
   */
  openCancelFlow: async (): Promise<void> => {
    const { url } = await apiService.post<{ url: string }>("/stripe/portal/cancel", {});
    if (!url) throw new Error("Pas d'URL de portail reçue");
    window.location.href = url;
  },

  /**
   * Resynchronise l'abonnement depuis Stripe. Utile quand le webhook
   * n'est pas arrivé (mode dev sans `stripe listen`, latence, etc.).
   */
  syncSubscription: (): Promise<SubscriptionStatus & { synced: boolean }> =>
    apiService.post("/stripe/sync", {}),
};

export default stripeService;
