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

export interface SubmissionPageContentInfo {
  registerMainHeading?: string;
  registerSubHeading?: string;
  parentDetailText?: string;
  nameText?: string;
  lastNameText?: string;
  emailText?: string;
  phoneText?: string;
  childDetailText?: string;
  childNameText?: string;
  childFirstNameText?: string;
  childLastNameText?: string;
  ageText?: string;
  schoolTypeText?: string;
  classDetailText?: string;
  classSummaryPrefixText?: string;
  classSummarySuffixText?: string;
  couponSectionTitleText?: string;
  couponInputPlaceholderText?: string;
  couponApplyButtonText?: string;
  paymentSectionTitleText?: string;
  paymentByCardText?: string;
  paymentPayLaterText?: string;
  ctaRegisterAndPayText?: string;
  ctaPayLaterButtonText?: string;
  ctaConfirmAndProceedText?: string;
  policyAgreementPrefixText?: string;
  policyAgreementLinkText?: string;
}

export interface SubmissionPageContent {
  submission?: SubmissionPageContentInfo;
}

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

export interface SubmissionPageDataWithTranslations {
  default: SubmissionPageContent;
  translated?: SubmissionPageContent;
}

export class SubmissionPageService {
  private readonly endpoint = "pages/submission";

  async fetchByDomain(domain: string, franchiseeId?: string | null, language?: string | null): Promise<SubmissionPageDataWithTranslations> {
    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: SubmissionPageData }>(
        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<SubmissionPageDataWithTranslations> {
    return {
      default: {
        submission: {
          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",
          childNameText: "First name",
          childFirstNameText: "First name",
          childLastNameText: "Last name",
          ageText: "Age",
          schoolTypeText: "School",
          classDetailText: "Class details",
          classSummaryPrefixText: "3. The chosen program includes",
          classSummarySuffixText: "lessons with monthly payments of",
          couponSectionTitleText: "4. Have a coupon?",
          couponInputPlaceholderText: "Enter code",
          couponApplyButtonText: "Apply",
          paymentSectionTitleText: "5. Choose payment method",
          paymentByCardText: "By card",
          paymentPayLaterText: "Pay later (we will contact you for more details)",
          ctaRegisterAndPayText: "Register and pay $",
          ctaPayLaterButtonText: "Register and pay later",
          ctaConfirmAndProceedText: "Confirm & proceed",
          policyAgreementPrefixText: "I agree with the",
          policyAgreementLinkText: "Data collection policy",
        }
      },
      translated: undefined
    };
  }
}

export const submissionPageService = new SubmissionPageService();
