export type Arcana = "major" | "minor";

export type Suit = "wands" | "cups" | "swords" | "pentacles";

export interface TarotCard {
  slug: string;
  name: string;
  arcana: Arcana;
  suit?: Suit;
  number: number;
  symbol: string;
  keywordsUpright: string;
  keywordsReversed: string;
}

/*
|--------------------------------------------------------------------------
| Major Arcana (22 cards)
|--------------------------------------------------------------------------
*/

const MAJOR_ARCANA: TarotCard[] = [
  { slug: "the_fool", name: "The Fool", number: 0, symbol: "🌄", keywordsUpright: "New beginnings, spontaneity, innocence", keywordsReversed: "Recklessness, hesitation, poor judgment" },
  { slug: "the_magician", name: "The Magician", number: 1, symbol: "🪄", keywordsUpright: "Willpower, resourcefulness, manifestation", keywordsReversed: "Untapped talent, manipulation, poor planning" },
  { slug: "the_high_priestess", name: "The High Priestess", number: 2, symbol: "🌙", keywordsUpright: "Intuition, mystery, inner knowledge", keywordsReversed: "Secrets withheld, disconnection from instinct" },
  { slug: "the_empress", name: "The Empress", number: 3, symbol: "🌾", keywordsUpright: "Abundance, nurturing, creativity", keywordsReversed: "Dependence, creative block, neglect" },
  { slug: "the_emperor", name: "The Emperor", number: 4, symbol: "🛡️", keywordsUpright: "Authority, structure, stability", keywordsReversed: "Rigidity, domination, loss of control" },
  { slug: "the_hierophant", name: "The Hierophant", number: 5, symbol: "🕯️", keywordsUpright: "Tradition, guidance, shared belief", keywordsReversed: "Rebellion, unconventional paths" },
  { slug: "the_lovers", name: "The Lovers", number: 6, symbol: "💞", keywordsUpright: "Union, alignment, meaningful choice", keywordsReversed: "Imbalance, misaligned values, indecision" },
  { slug: "the_chariot", name: "The Chariot", number: 7, symbol: "🏇", keywordsUpright: "Willpower, determination, victory", keywordsReversed: "Lack of direction, loss of control" },
  { slug: "strength", name: "Strength", number: 8, symbol: "🦁", keywordsUpright: "Courage, patience, inner strength", keywordsReversed: "Self-doubt, low energy, insecurity" },
  { slug: "the_hermit", name: "The Hermit", number: 9, symbol: "🏮", keywordsUpright: "Reflection, solitude, inner guidance", keywordsReversed: "Isolation, withdrawal, loneliness" },
  { slug: "wheel_of_fortune", name: "Wheel of Fortune", number: 10, symbol: "🎡", keywordsUpright: "Cycles, destiny, turning points", keywordsReversed: "Setbacks, resistance to change" },
  { slug: "justice", name: "Justice", number: 11, symbol: "⚖️", keywordsUpright: "Fairness, truth, cause and effect", keywordsReversed: "Bias, dishonesty, avoidance of accountability" },
  { slug: "the_hanged_man", name: "The Hanged Man", number: 12, symbol: "🙃", keywordsUpright: "Pause, surrender, new perspective", keywordsReversed: "Stalling, resistance, needless sacrifice" },
  { slug: "death", name: "Death", number: 13, symbol: "🦋", keywordsUpright: "Transformation, endings, transition", keywordsReversed: "Resistance to change, stagnation" },
  { slug: "temperance", name: "Temperance", number: 14, symbol: "🕊️", keywordsUpright: "Balance, patience, moderation", keywordsReversed: "Excess, imbalance, discord" },
  { slug: "the_devil", name: "The Devil", number: 15, symbol: "⛓️", keywordsUpright: "Attachment, temptation, restriction", keywordsReversed: "Release, breaking free, reclaiming power" },
  { slug: "the_tower", name: "The Tower", number: 16, symbol: "🌩️", keywordsUpright: "Sudden change, upheaval, revelation", keywordsReversed: "Averted disaster, delayed reckoning" },
  { slug: "the_star", name: "The Star", number: 17, symbol: "⭐", keywordsUpright: "Hope, renewal, inspiration", keywordsReversed: "Discouragement, disconnection, self-doubt" },
  { slug: "the_moon", name: "The Moon", number: 18, symbol: "🌘", keywordsUpright: "Intuition, illusion, the subconscious", keywordsReversed: "Clarity emerging, releasing fear" },
  { slug: "the_sun", name: "The Sun", number: 19, symbol: "☀️", keywordsUpright: "Joy, success, vitality", keywordsReversed: "Temporary setbacks, low energy" },
  { slug: "judgement", name: "Judgement", number: 20, symbol: "📯", keywordsUpright: "Reflection, renewal, a turning point", keywordsReversed: "Self-doubt, avoiding a reckoning" },
  { slug: "the_world", name: "The World", number: 21, symbol: "🌍", keywordsUpright: "Completion, fulfillment, wholeness", keywordsReversed: "Incompletion, delays, seeking closure" },
].map((card) => ({ ...card, arcana: "major" as const }));

/*
|--------------------------------------------------------------------------
| Minor Arcana (56 cards — 4 suits x 14 ranks)
|--------------------------------------------------------------------------
*/

const SUITS: { suit: Suit; symbol: string; theme: string }[] = [
  { suit: "wands", symbol: "🔥", theme: "passion, ambition, and creative energy" },
  { suit: "cups", symbol: "💧", theme: "emotion, relationships, and intuition" },
  { suit: "swords", symbol: "🗡️", theme: "intellect, conflict, and truth" },
  { suit: "pentacles", symbol: "🪙", theme: "material matters, work, and resources" },
];

const RANKS: { rank: string; label: string; number: number }[] = [
  { rank: "ace", label: "Ace", number: 1 },
  { rank: "two", label: "Two", number: 2 },
  { rank: "three", label: "Three", number: 3 },
  { rank: "four", label: "Four", number: 4 },
  { rank: "five", label: "Five", number: 5 },
  { rank: "six", label: "Six", number: 6 },
  { rank: "seven", label: "Seven", number: 7 },
  { rank: "eight", label: "Eight", number: 8 },
  { rank: "nine", label: "Nine", number: 9 },
  { rank: "ten", label: "Ten", number: 10 },
  { rank: "page", label: "Page", number: 11 },
  { rank: "knight", label: "Knight", number: 12 },
  { rank: "queen", label: "Queen", number: 13 },
  { rank: "king", label: "King", number: 14 },
];

const MINOR_ARCANA: TarotCard[] = SUITS.flatMap(({ suit, symbol, theme }) =>
  RANKS.map(({ rank, label, number }) => ({
    slug: `${rank}_of_${suit}`,
    name: `${label} of ${suit.charAt(0).toUpperCase()}${suit.slice(1)}`,
    arcana: "minor" as const,
    suit,
    number,
    symbol,
    keywordsUpright: `${label} of ${suit} — growth in matters of ${theme}`,
    keywordsReversed: `${label} of ${suit}, reversed — blocked or delayed ${theme}`,
  })),
);

/*
|--------------------------------------------------------------------------
| Full Deck (78 cards)
|--------------------------------------------------------------------------
*/

export const TAROT_DECK: TarotCard[] = [...MAJOR_ARCANA, ...MINOR_ARCANA];

export const TAROT_DECK_BY_SLUG: Record<string, TarotCard> = Object.fromEntries(
  TAROT_DECK.map((card) => [card.slug, card]),
);

export function getTarotCardBySlug(slug: string): TarotCard | undefined {
  return TAROT_DECK_BY_SLUG[slug];
}

export function getMajorArcana(): TarotCard[] {
  return MAJOR_ARCANA;
}

export function getMinorArcanaBySuit(suit: Suit): TarotCard[] {
  return MINOR_ARCANA.filter((card) => card.suit === suit);
}

/*
|--------------------------------------------------------------------------
| Random Draw Helpers
|--------------------------------------------------------------------------
*/

export interface DrawnCard {
  card: TarotCard;
  direction: "upright" | "reversed";
}

export function drawRandomCards(count: number): DrawnCard[] {
  const shuffled = [...TAROT_DECK].sort(() => Math.random() - 0.5);

  return shuffled.slice(0, count).map((card) => ({
    card,
    direction: Math.random() < 0.5 ? "upright" : "reversed",
  }));
}
