import { AxiosError } from "axios";
import { apiClient } from "../../app/api/client";
import { handleAPIError } from "../utils/apiErrorHandler";
import { getLanguageCode } from "../utils/getLanguageCode";
import {
  Activity,
  ActivitiesResponse,
  ProcessedActivity,
} from "@/src/lib/types/home";

export class ActivitiesService {
  private readonly endpoint = "activities";

  /**
   * Parse CTA button - handles both string and object formats
   */
  private parseCtaButton(ctaButton: string | { text: string; url: string }): { text: string; url: string } {
    try {
      if (typeof ctaButton === "object") {
        return {
          text: ctaButton.text || "Book Now",
          url: ctaButton.url || "#",
        };
      }
      const parsed = JSON.parse(ctaButton);
      return {
        text: parsed.text || "Book Now",
        url: parsed.url || "#",
      };
    } catch {
      return {
        text: "Book Now",
        url: "#",
      };
    }
  }

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

    try {
      // Use getLanguageCode for standardized extraction and filtering
      const languageCode = getLanguageCode(language || undefined, domain);

      const params: Record<string, string> = {};
      if (franchiseeId) {
        params.franchiseeId = franchiseeId;
      }
      if (languageCode) {
        params.language = languageCode;
      }

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

      if (!response.data?.status || !Array.isArray(response.data?.data)) {
        return [];
      }

      // Process activities to include parsed CTA button data
      const processedActivities: ProcessedActivity[] = response.data.data
        .sort((a, b) => a.order_no - b.order_no)
        .map((activity) => {
          const { text: ctaText, url: ctaUrl } = this.parseCtaButton(
            activity.cta_button
          );
          return {
            ...activity,
            ctaText,
            ctaUrl,
          };
        });

      const elapsed = Date.now() - startTime;

      return processedActivities;
    } catch (error) {
      // Delegate error handling to reusable utility
      return handleAPIError(error, domain, startTime, () => []);
    }
  }
}

export const activitiesService = new ActivitiesService();
