// app/(lib)/services/checkoutPageService.ts
import { apiClient } from "../../app/api/client";
import { handleAPIError } from "../utils/apiErrorHandler";

export interface CheckoutPageContentInfo {
  // Hero
  registerMainHeading?: string;
  registerSubHeading?: string;
  // Parent
  parentDetailText?: string;
  nameText?: string;
  lastNameText?: string;
  emailText?: string;
  phoneText?: string;
  // Child
  childDetailText?: string;
  childFirstNameText?: string;
  childLastNameText?: string;
  ageText?: string;
  schoolTypeText?: string;
  // Coupon
  couponSectionTitleText?: string;
  couponInputPlaceholderText?: string;
  couponApplyButtonText?: string;
  // Payment options
  paymentSectionTitleText?: string;
  paymentByCardText?: string;
  paymentPayLaterText?: string;
  // CTAs (ctaRegisterAndPayText supports {amount} {plan_date} {program_name} {lessons})
  ctaRegisterAndPayText?: string;
  ctaPayLaterButtonText?: string;
  // Policy
  policyAgreementPrefixText?: string;
  policyAgreementLinkText?: string;
  // Sidebar (Order Details)
  sidebarTitleText?: string;
  classInfoTitleText?: string;
  studyPeriodLabel?: string;
  daysLabel?: string;
  classTimeLabel?: string;
  numberOfLessonsLabel?: string;
  classScheduleLabel?: string;
  startDateLabel?: string;
  paymentInfoTitleText?: string;
  totalValueLabel?: string;
  pricePerClassLabel?: string;
  paymentFrequencyLabel?: string;
  feeTypeLabel?: string;
  paymentScheduleLabel?: string;
  nextPaymentLabel?: string;
  lastPaymentLabel?: string;
  paymentLabel?: string;
  noFuturePlansText?: string;
  paymentAmountLabel?: string;
  youPayNowText?: string;
  paymentOfText?: string;
  paymentForText?: string;
  nextPaymentText?: string;
  oneTimePaymentText?: string;
  loadingCheckoutTitleText?: string;
  loadingCheckoutMessageText?: string;
  loadingCheckoutHintText?: string;
}

export interface CheckoutPageContent {
  checkoutPage?: CheckoutPageContentInfo;
}

export interface CheckoutPageData {
  id: string;
  franchisee_id: string | null;
  is_global: boolean;
  title: string;
  slug: string;
  template_id: string;
  content: CheckoutPageContent;
  translated_content?: CheckoutPageContent;
  status: string;
  seo_title?: string | null;
  seo_description?: string | null;
}

export interface CheckoutPageDataWithTranslations {
  default: CheckoutPageContent;
  translated?: CheckoutPageContent;
}

const DEFAULTS: CheckoutPageContentInfo = {
  registerMainHeading: "Register For A Program",
  registerSubHeading: "Fill in the form to join the classes",
  parentDetailText: "1. Provide parent info",
  nameText: "First name",
  lastNameText: "Last name",
  emailText: "E-mail",
  phoneText: "Phone",
  childDetailText: "2. Provide your child info",
  childFirstNameText: "First name",
  childLastNameText: "Last name",
  ageText: "Age",
  schoolTypeText: "School",
  couponSectionTitleText: "3. Have a coupon?",
  couponInputPlaceholderText: "Enter code",
  couponApplyButtonText: "Apply",
  paymentSectionTitleText: "4. Choose payment method",
  paymentByCardText: "By card",
  paymentPayLaterText: "Pay later (we will contact you for more details)",
  ctaRegisterAndPayText: "Register and pay {amount}",
  ctaPayLaterButtonText: "Register and pay later",
  policyAgreementPrefixText: "I agree with the",
  policyAgreementLinkText: "Data collection policy",
  sidebarTitleText: "ORDER DETAILS",
  classInfoTitleText: "Class Info",
  studyPeriodLabel: "Study Period",
  daysLabel: "Days",
  classTimeLabel: "Class Time",
  numberOfLessonsLabel: "Number Of Lessons",
  classScheduleLabel: "Class Schedule",
  startDateLabel: "Start Date",
  paymentInfoTitleText: "Payment Info",
  totalValueLabel: "Total Value of the Class",
  pricePerClassLabel: "Price per class",
  paymentFrequencyLabel: "Payment Frequency",
  feeTypeLabel: "Fee Type",
  paymentScheduleLabel: "Payment Schedule",
  nextPaymentLabel: "Next payment",
  lastPaymentLabel: "Last payment",
  paymentLabel: "Payment",
  noFuturePlansText: "No future plans available",
  paymentAmountLabel: "Payment Amount",
  youPayNowText: "You pay now",
  paymentOfText: "of",
  paymentForText: "for",
  nextPaymentText: "next",
  oneTimePaymentText: "One-time payment",
  loadingCheckoutTitleText: "Preparing secure checkout",
  loadingCheckoutMessageText:
    "We are loading your payment session. Your card details will appear in a moment.",
  loadingCheckoutHintText: "Please wait…",
};

export class CheckoutPageService {
  // Matches the page slug created in the admin ("Check Out" → "check-out").
  // The template slug is "checkout-page", but pages are fetched by the page slug.
  private readonly endpoint = "pages/check-out";

  async fetchByDomain(domain: string, franchiseeId?: string | null, language?: string | null): Promise<CheckoutPageDataWithTranslations> {
    const startTime = Date.now();

    try {
      const params: Record<string, string> = {};
      if (franchiseeId) params.franchiseeId = franchiseeId;
      if (language && language !== "default") params.lang = language;

      const response = await apiClient.get<{ status: boolean; data: CheckoutPageData }>(
        this.endpoint,
        {
          headers: { "X-Domain": domain },
          params: Object.keys(params).length > 0 ? params : undefined,
        }
      );

      if (!response.data?.status || !response.data?.data?.content) {
        return this.getDefaultData();
      }

      const elapsed = Date.now() - startTime;

      return {
        default: response.data.data.content,
        translated: response.data.data.translated_content || undefined,
      };
    } catch (error) {
      return handleAPIError(error, domain, startTime, this.getDefaultData.bind(this));
    }
  }

  private async getDefaultData(): Promise<CheckoutPageDataWithTranslations> {
    return {
      default: { checkoutPage: DEFAULTS },
      translated: undefined,
    };
  }
}

export const checkoutPageService = new CheckoutPageService();
