import type {
  Achievement,
  AchievementMilestone,
  AchievementProgressSource,
  AchievementStatus,
} from "@/types";

export const ACHIEVEMENT_STATUS_OPTIONS: Array<{
  label: string;
  value: AchievementStatus;
}> = [
  { label: "Not started", value: "not_started" },
  { label: "In progress", value: "in_progress" },
  { label: "Completed", value: "completed" },
  { label: "Archived", value: "archived" },
];

export const ACHIEVEMENT_PROGRESS_SOURCE_OPTIONS: Array<{
  description: string;
  label: string;
  value: AchievementProgressSource;
}> = [
  {
    value: "manual",
    label: "Manual progress",
    description: "You update progress yourself.",
  },
  {
    value: "completed_tasks_count",
    label: "All completed tasks",
    description: "Mindavio counts every completed task in the current workspace.",
  },
  {
    value: "linked_tasks_completed_count",
    label: "Linked tasks completed",
    description: "Progress comes from the linked tasks attached to this achievement.",
  },
];

export const ACHIEVEMENT_CATEGORY_SUGGESTIONS = [
  "productivity",
  "focus",
  "routine",
  "projects",
  "revenue",
  "audience",
  "wellbeing",
  "learning",
];

export function buildDefaultAchievementMilestones(
  targetValue: number,
): Array<Pick<AchievementMilestone, "title" | "description" | "milestone_value" | "sort_order">> {
  if (targetValue <= 1) {
    return [
      {
        title: "Goal hit",
        description: "Complete the achievement.",
        milestone_value: 1,
        sort_order: 0,
      },
    ];
  }

  const halfway = Math.max(1, Math.round(targetValue * 0.5));
  const warmup = Math.max(1, Math.round(targetValue * 0.25));

  return [
    {
      title: "Warmup",
      description: "Build visible momentum.",
      milestone_value: warmup,
      sort_order: 0,
    },
    {
      title: "Halfway",
      description: "Cross the midpoint and keep the pace.",
      milestone_value: halfway,
      sort_order: 1,
    },
    {
      title: "Goal hit",
      description: "Reach the final achievement target.",
      milestone_value: targetValue,
      sort_order: 2,
    },
  ];
}

export function resolveAchievementProgress(achievement: Achievement): number {
  return achievement.resolved_progress ?? achievement.current_progress;
}

export function resolveAchievementStatus(achievement: Achievement): AchievementStatus {
  return achievement.resolved_status ?? achievement.status;
}

export function isAchievementCompleted(achievement: Achievement): boolean {
  return resolveAchievementStatus(achievement) === "completed";
}

export function getAchievementProgressPercent(achievement: Achievement): number {
  const targetValue = Math.max(achievement.target_value, 1);
  const progress = resolveAchievementProgress(achievement);
  return Math.max(0, Math.min(100, Math.round((progress / targetValue) * 100)));
}

export function normalizeAchievementStatus(
  progress: number,
  targetValue: number,
  fallback: AchievementStatus,
): AchievementStatus {
  if (fallback === "archived") return "archived";
  if (progress >= targetValue) return "completed";
  if (progress > 0) return "in_progress";
  return fallback === "completed" ? "in_progress" : fallback;
}

export function formatAchievementValue(value: number): string {
  if (value >= 1000) {
    return new Intl.NumberFormat("en-US", {
      maximumFractionDigits: 0,
    }).format(value);
  }

  return `${value}`;
}

export function sortAchievementMilestones(
  milestones: AchievementMilestone[],
): AchievementMilestone[] {
  return [...milestones].sort(
    (left, right) =>
      left.milestone_value - right.milestone_value || left.sort_order - right.sort_order,
  );
}

export function isMilestoneCompleted(
  milestone: AchievementMilestone,
  progress: number,
): boolean {
  if (milestone.resolved_completed !== undefined) {
    return milestone.resolved_completed;
  }

  const taskLinks = milestone.task_links || [];
  const allLinkedTasksDone =
    taskLinks.length > 0 && taskLinks.every((link) => link.task?.status === "done");

  return Boolean(milestone.unlocked_at) || allLinkedTasksDone || progress >= milestone.milestone_value;
}
