import { getAuthToken } from "./auth-token";

export type TarotReadingType = "one-card" | "three-card" | "love" | "yes-no";

/*
|--------------------------------------------------------------------------
| Shared Request Helper
|--------------------------------------------------------------------------
*/

async function tarotFetch(url: string, init: RequestInit) {
  const token = getAuthToken();

  if (!token) {
    return {
      authenticated: false,
      success: false,
      data: null,
      message: "Please login first.",
    };
  }

  try {
    const response = await fetch(url, {
      ...init,

      headers: {
        ...(init.headers || {}),
        Authorization: `Bearer ${token}`,
      },

      cache: "no-store",
    });

    const result = await response.json();

    if (response.status === 401) {
      return {
        authenticated: false,
        success: false,
        data: null,
        message: result?.message || "Authentication expired.",
      };
    }

    if (!response.ok || result?.status !== true) {
      return {
        authenticated: true,
        success: false,
        data: null,
        message: result?.message || "Tarot request failed.",
      };
    }

    return {
      authenticated: true,
      success: true,
      data: result.data,
      message: result.message,
    };
  } catch (error) {
    console.error("Tarot request error:", error);

    return {
      authenticated: true,
      success: false,
      data: null,
      message: "Unable to connect to tarot API.",
    };
  }
}

/*
|--------------------------------------------------------------------------
| Card Reference
|--------------------------------------------------------------------------
*/

export async function getTarotCardsList() {
  return tarotFetch("/api/tarot/cards", { method: "GET" });
}

export async function getTarotCardDetail(slug: string) {
  return tarotFetch(`/api/tarot/cards/${slug}`, { method: "GET" });
}

/*
|--------------------------------------------------------------------------
| Readings
|--------------------------------------------------------------------------
*/

export interface OneCardPayload {
  name: string;
  card: string;
  direction: "upright" | "reversed";
  lang?: string;
}

export interface ThreeCardPayload {
  name: string;
  cards: { card: string; direction: "upright" | "reversed" }[];
  lang?: string;
}

export interface LovePayload {
  name: string;
  card: string;
  style?: string;
  lang?: string;
}

export interface YesNoPayload {
  name: string;
  card: string;
  direction: "upright" | "reversed";
  lang?: string;
}

function postTarot(type: TarotReadingType, body: Record<string, any>) {
  return tarotFetch(`/api/tarot/${type}`, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(body),
  });
}

export async function getOneCardReading(payload: OneCardPayload) {
  return postTarot("one-card", { lang: "en", ...payload });
}

export async function getThreeCardReading(payload: ThreeCardPayload) {
  return postTarot("three-card", { lang: "en", ...payload });
}

export async function getLoveReading(payload: LovePayload) {
  return postTarot("love", { style: "in_depth", lang: "en", ...payload });
}

export async function getYesNoReading(payload: YesNoPayload) {
  return postTarot("yes-no", { lang: "en", ...payload });
}
