/**
 * Tử Vi Số · Palmistry analyze engine
 *
 * Self-assessment palmistry: user reports observed traits via a structured
 * form. Engine scores 4 main lines + hand shape + supporting traits and
 * produces a personality + career + relationship summary.
 *
 * No physical measurement is required — descriptive multiple-choice only.
 * Result quality scales with input completeness.
 */

export type LineLength = "long" | "medium" | "short" | "absent" | "unknown";
export type LineQuality = "clear" | "broken" | "chained" | "forked" | "unknown";
export type HandShape = "earth" | "air" | "fire" | "water" | "unknown";
export type DominantHand = "left" | "right" | "both" | "unknown";

export type PalmistryInput = {
  dominantHand: DominantHand;
  shape: HandShape;
  // 4 main lines
  heart: { length: LineLength; quality: LineQuality };
  head: { length: LineLength; quality: LineQuality };
  life: { length: LineLength; quality: LineQuality };
  fate: { length: LineLength; quality: LineQuality };
  // Optional traits
  thumbStrong?: boolean; // ngón cái cứng cáp, gốc rộng
  fingersLong?: boolean; // ngón dài hơn lòng bàn tay
  mountVenus?: boolean; // gò Venus đầy đặn (gốc ngón cái)
  mountJupiter?: boolean; // gò Jupiter rõ (gốc ngón trỏ)
  marriageLines?: 0 | 1 | 2 | 3; // số đường hôn nhân quan sát được
};

export type LineReport = {
  label: string;
  finding: string;
  score: number; // 0-25
};

export type PalmistryReport = {
  totalScore: number; // 0-100
  rating: string;
  shape: { name: string; desc: string };
  lines: LineReport[];
  personality: string[];
  career: string;
  relationship: string;
  health: string;
  highlights: string[];
};

const SHAPE_PROFILE: Record<HandShape, { name: string; desc: string }> = {
  earth: {
    name: "Bàn tay Đất (Square Palm + Short Fingers)",
    desc: "Thực tế, kiên trì, đáng tin cậy. Tư duy cụ thể, hành động chậm rãi nhưng chắc chắn. Hợp công việc kỹ thuật, xây dựng, nông nghiệp, sản xuất.",
  },
  air: {
    name: "Bàn tay Khí (Square Palm + Long Fingers)",
    desc: "Trí tuệ, giao tiếp, tò mò. Yêu chữ nghĩa và ý tưởng. Hợp viết lách, tư vấn, nghiên cứu, công nghệ thông tin.",
  },
  fire: {
    name: "Bàn tay Lửa (Long Palm + Short Fingers)",
    desc: "Năng động, lãnh đạo, đam mê. Hành động trước khi suy nghĩ kỹ. Hợp khởi nghiệp, sales, biểu diễn, quản lý.",
  },
  water: {
    name: "Bàn tay Nước (Long Palm + Long Fingers)",
    desc: "Nhạy cảm, nghệ sĩ, trực giác cao. Sống nội tâm sâu sắc. Hợp nghệ thuật, tâm lý học, chăm sóc, sáng tạo.",
  },
  unknown: {
    name: "Chưa xác định hình dạng bàn tay",
    desc: "Cung cấp tỷ lệ lòng-ngón để có phân tích đầy đủ hơn.",
  },
};

function scoreLine(line: { length: LineLength; quality: LineQuality }): number {
  let s = 12; // baseline
  // length
  if (line.length === "long") s += 8;
  else if (line.length === "medium") s += 4;
  else if (line.length === "short") s += 1;
  else if (line.length === "absent") s -= 4;
  // quality
  if (line.quality === "clear") s += 5;
  else if (line.quality === "broken") s -= 3;
  else if (line.quality === "chained") s -= 2;
  else if (line.quality === "forked") s += 2;
  return Math.max(0, Math.min(25, s));
}

function describeHeart(l: PalmistryInput["heart"]): string {
  if (l.length === "long" && l.quality === "clear") {
    return "Yêu sâu, chung thủy, cảm xúc bền vững. Ưu tiên gia đình và mối quan hệ lâu dài.";
  }
  if (l.length === "short") {
    return "Ưu tiên lý trí trong tình cảm, ít thể hiện cảm xúc. Chọn lọc kỹ trước khi gắn bó.";
  }
  if (l.quality === "broken") {
    return "Tình duyên trải qua nhiều biến động — học cách chữa lành sau mỗi lần. Phù hợp với người hiểu tâm lý.";
  }
  if (l.quality === "chained") {
    return "Đa tình, dễ rung động — cần chọn người ổn định để cân bằng cảm xúc.";
  }
  if (l.quality === "forked") {
    return "Tình cảm phức tạp nhưng phong phú — có thể yêu nhiều kiểu người trong đời.";
  }
  return "Tình cảm trung tính — phụ thuộc nhiều vào hoàn cảnh và bạn đời.";
}

function describeHead(l: PalmistryInput["head"]): string {
  if (l.length === "long" && l.quality === "clear") {
    return "Tư duy mạch lạc, học giỏi, làm việc trí óc tốt. Phân tích sâu sắc.";
  }
  if (l.length === "short") {
    return "Quyết đoán nhanh, hành động trước khi suy nghĩ kỹ. Hợp công việc thực tế cần phản xạ.";
  }
  if (l.quality === "forked") {
    return "Đa tài, đa nghề — có thể thành công ở nhiều lĩnh vực, nhưng dễ phân tâm.";
  }
  if (l.quality === "broken") {
    return "Tư duy có giai đoạn thay đổi rõ rệt — biến cố có thể đảo lộn cách nhìn cuộc sống.";
  }
  return "Tư duy trung bình — cần rèn luyện liên tục để phát huy tối đa.";
}

function describeLife(l: PalmistryInput["life"]): string {
  if (l.length === "long" && l.quality === "clear") {
    return "Sức khỏe tốt, năng lượng dồi dào. Tránh stress kéo dài.";
  }
  if (l.length === "short") {
    return "QUAN TRỌNG: đường Mệnh ngắn KHÔNG có nghĩa đoản thọ — chỉ ra sức bền cần được nuôi dưỡng. Tập thể dục đều, ngủ đủ.";
  }
  if (l.quality === "broken") {
    return "Có thể có biến cố sức khỏe hoặc thay đổi lớn về môi trường sống ở giai đoạn nào đó.";
  }
  if (l.quality === "chained") {
    return "Sức khỏe nhạy cảm — dễ ảnh hưởng bởi cảm xúc và stress. Chú ý dạ dày, thần kinh.";
  }
  return "Sức khỏe ổn — duy trì thói quen vận động và ăn uống điều độ.";
}

function describeFate(l: PalmistryInput["fate"]): string {
  if (l.length === "long" && l.quality === "clear") {
    return "Sự nghiệp ổn định, có quý nhân hỗ trợ. Hướng đi rõ từ trẻ.";
  }
  if (l.length === "absent") {
    return "Tự lực cánh sinh — không có hướng đi định sẵn, bạn tự tạo cơ hội. Cần bản lĩnh và kiên trì.";
  }
  if (l.quality === "broken") {
    return "Sự nghiệp có giai đoạn chuyển ngành / gián đoạn — đó là cơ hội tái định hình.";
  }
  if (l.length === "short") {
    return "Sự nghiệp khởi sắc muộn — sau 35 tuổi mới rõ định hướng.";
  }
  return "Sự nghiệp bình ổn — không bùng nổ nhưng không cản trở.";
}

const RATINGS: Array<{ min: number; label: string }> = [
  { min: 90, label: "Rất tốt — bàn tay quý" },
  { min: 75, label: "Tốt — nhiều ưu thế" },
  { min: 60, label: "Khá — cân bằng" },
  { min: 45, label: "Trung bình — cần nỗ lực" },
  { min: 0, label: "Thử thách — kiên trì rèn luyện" },
];

function rateScore(score: number): string {
  return RATINGS.find((r) => score >= r.min)?.label ?? RATINGS[RATINGS.length - 1].label;
}

export function analyzePalm(input: PalmistryInput): PalmistryReport {
  const heart = scoreLine(input.heart);
  const head = scoreLine(input.head);
  const life = scoreLine(input.life);
  const fate = scoreLine(input.fate);
  const totalLines = heart + head + life + fate;

  // Bonus points from supporting traits (max +0, normalized into 100)
  let traitBonus = 0;
  if (input.thumbStrong) traitBonus += 3;
  if (input.fingersLong) traitBonus += 2;
  if (input.mountVenus) traitBonus += 3;
  if (input.mountJupiter) traitBonus += 4;
  // Normalize: lines max 100, traits max ~12 → blend 90% + 10%
  const totalScore = Math.min(100, Math.round(totalLines * 0.9 + traitBonus));

  const lines: LineReport[] = [
    { label: "Đường Tim (Heart Line)", finding: describeHeart(input.heart), score: heart },
    { label: "Đường Trí (Head Line)", finding: describeHead(input.head), score: head },
    { label: "Đường Sinh / Mệnh (Life Line)", finding: describeLife(input.life), score: life },
    { label: "Đường Sự Nghiệp (Fate Line)", finding: describeFate(input.fate), score: fate },
  ];

  const personality: string[] = [];
  if (input.shape === "earth") personality.push("Thực tế, đáng tin, có trách nhiệm");
  if (input.shape === "air") personality.push("Trí tuệ, ưa giao tiếp, hiếu kỳ");
  if (input.shape === "fire") personality.push("Năng động, nhiệt huyết, dễ truyền cảm hứng");
  if (input.shape === "water") personality.push("Nhạy cảm, sâu sắc, giàu trực giác");
  if (input.thumbStrong) personality.push("Ý chí mạnh, kỷ luật cao");
  if (input.fingersLong) personality.push("Cẩn trọng, chú ý chi tiết");
  if (input.mountVenus) personality.push("Tình cảm ấm áp, yêu nghệ thuật, sống thiên về cảm xúc");
  if (input.mountJupiter) personality.push("Tham vọng, lãnh đạo, có khao khát thành tựu");
  if (input.head.length === "long") personality.push("Tư duy logic, thích phân tích");
  if (input.heart.length === "long") personality.push("Yêu chân thành, coi trọng tình cảm");
  if (personality.length === 0)
    personality.push("Tính cách trung tính — bổ sung thêm thông tin để có phân tích sâu hơn");

  // Career synthesis based on shape + dominant lines
  let career = "Cần phân tích thêm về tỷ lệ tay và đặc điểm phụ.";
  if (input.shape === "earth") {
    career =
      "Hợp các ngành cần độ chính xác và kiên nhẫn: kỹ thuật, xây dựng, sản xuất, nông nghiệp. ";
  } else if (input.shape === "air") {
    career =
      "Hợp ngành sử dụng ngôn ngữ và tư duy: viết lách, tư vấn, đào tạo, truyền thông, công nghệ thông tin. ";
  } else if (input.shape === "fire") {
    career =
      "Hợp ngành cần năng lượng cao và quyết đoán: khởi nghiệp, sales, marketing, biểu diễn, lãnh đạo. ";
  } else if (input.shape === "water") {
    career = "Hợp ngành sáng tạo và đồng cảm: nghệ thuật, thiết kế, tâm lý học, y tế, chăm sóc. ";
  }
  if (input.fate.length === "long" && input.fate.quality === "clear") {
    career += "Đường Sự Nghiệp đẹp cho thấy hướng đi rõ ràng và có quý nhân hỗ trợ.";
  } else if (input.fate.length === "absent") {
    career +=
      "Không có Đường Sự Nghiệp rõ → tự khởi nghiệp / tự định hướng sẽ phù hợp hơn việc theo lộ trình cố định.";
  } else if (input.fate.quality === "broken") {
    career +=
      "Đường Sự Nghiệp đứt đoạn cho thấy sẽ có giai đoạn chuyển hướng — đừng sợ nếu công việc hiện tại không bền.";
  }

  // Relationship
  let relationship = "";
  if (input.heart.length === "long" && input.heart.quality === "clear") {
    relationship = "Tình cảm bền vững, có khả năng yêu lâu dài. ";
  } else if (input.heart.length === "short") {
    relationship =
      "Lý trí trong tình cảm — sẽ chọn người phù hợp về giá trị sống hơn là cảm xúc bốc đồng. ";
  } else if (input.heart.quality === "broken") {
    relationship = "Tình duyên có thể trải qua đổ vỡ trước khi tìm được người phù hợp. ";
  } else {
    relationship = "Tình cảm trung tính — phụ thuộc nhiều vào người bạn chọn. ";
  }
  if (input.marriageLines === 1) relationship += "Một mối hôn nhân lớn duy nhất.";
  else if (input.marriageLines === 2)
    relationship += "Có thể có 2 mối quan hệ nghiêm túc trong đời.";
  else if (input.marriageLines === 3)
    relationship += "Đường tình cảm phong phú — cần thận trọng khi chọn bạn đời.";

  // Health
  let health = "";
  if (input.life.length === "long" && input.life.quality === "clear") {
    health =
      "Sức khỏe nền tốt, năng lượng dồi dào. Duy trì lối sống lành mạnh để giữ trạng thái này.";
  } else if (input.life.length === "short") {
    health =
      "Đường Mệnh ngắn không phải đoản thọ — là dấu hiệu cần nuôi dưỡng sức bền. Tập thể dục đều, ngủ đủ giấc.";
  } else if (input.life.quality === "broken") {
    health = "Có thể trải qua giai đoạn sức khỏe biến động — chú ý kiểm tra định kỳ.";
  } else {
    health = "Sức khỏe ổn định — chú ý cân bằng giữa công việc và nghỉ ngơi.";
  }

  // Highlights
  const highlights: string[] = [];
  if (heart >= 22) highlights.push("Đường Tim đẹp — tình cảm là điểm mạnh");
  if (head >= 22) highlights.push("Đường Trí xuất sắc — tư duy là tài sản lớn");
  if (life >= 22) highlights.push("Đường Mệnh khỏe — sức khỏe là nền tảng");
  if (fate >= 22) highlights.push("Đường Sự Nghiệp đẹp — sự nghiệp có quý nhân");
  if (input.mountJupiter) highlights.push("Gò Mộc tinh đầy — có tham vọng và may mắn lãnh đạo");
  if (input.mountVenus) highlights.push("Gò Kim tinh đầy — đời sống tình cảm phong phú");
  if (highlights.length === 0)
    highlights.push("Bàn tay cân bằng — không có điểm vượt trội rõ rệt nhưng cũng không có khuyết");

  return {
    totalScore,
    rating: rateScore(totalScore),
    shape: SHAPE_PROFILE[input.shape],
    lines,
    personality,
    career: career.trim(),
    relationship: relationship.trim(),
    health,
    highlights,
  };
}
