"use client";

import { useMemo, useState } from "react";
import { Gift, Map, Plus, Sparkles, Target, Trash2 } from "lucide-react";
import { Input } from "@/components/ui/input";
import { Select } from "@/components/ui/select";
import { Textarea } from "@/components/ui/textarea";
import {
  ACHIEVEMENT_CATEGORY_SUGGESTIONS,
  ACHIEVEMENT_PROGRESS_SOURCE_OPTIONS,
  ACHIEVEMENT_STATUS_OPTIONS,
  buildDefaultAchievementMilestones,
} from "@/lib/achievements";
import type {
  AchievementProjectOption,
  AchievementTaskOption,
  AchievementUpsertInput,
} from "@/hooks/use-achievements";
import { LinkedEntityPicker } from "@/components/achievements/linked-entity-picker";
import { cn } from "@/lib/utils";
import type { Achievement } from "@/types";

/* ── Types ────────────────────────────────────────────────────────────────── */

interface AchievementFormProps {
  achievement?:      Achievement | null;
  availableProjects: AchievementProjectOption[];
  availableTasks:    AchievementTaskOption[];
  onCancel:          () => void;
  onSubmit:          (input: AchievementUpsertInput) => Promise<void>;
  submitting:        boolean;
}

function toggleId(current: string[], id: string) {
  return current.includes(id)
    ? current.filter((item) => item !== id)
    : [...current, id];
}

/* ── Initial state helper ─────────────────────────────────────────────────── */

function getInitialState(achievement?: Achievement | null) {
  if (!achievement) {
    return {
      background_image_url: "",
      category:             "productivity",
      current_progress:     0,
      description:          "",
      icon:                 "🏆",
      image_url:            "",
      linked_project_ids:   [] as string[],
      linked_task_ids:      [] as string[],
      milestones:           buildDefaultAchievementMilestones(100).map((milestone) => ({
        ...milestone,
        linked_task_ids: [],
        unlocked_at: null,
      })),
      progress_source:      "manual" as const,
      reward_description:   "",
      reward_image_url:     "",
      reward_title:         "",
      reward_why:           "",
      status:               "in_progress" as const,
      target_value:         100,
      title:                "",
    };
  }
  return {
    background_image_url: achievement.background_image_url || "",
    category:             achievement.category,
    current_progress:     achievement.current_progress,
    description:          achievement.description || "",
    icon:                 achievement.icon,
    image_url:            achievement.image_url || "",
    linked_project_ids:   (achievement.project_links || []).map((l) => l.project_id),
    linked_task_ids:      (achievement.task_links   || []).map((l) => l.task_id),
    milestones:           (achievement.milestones   || []).map((m, i) => ({
      description:      m.description,
      linked_task_ids:   (m.task_links || []).map((link) => link.task_id),
      milestone_value:  m.milestone_value,
      sort_order:       i,
      title:            m.title,
      unlocked_at:       m.unlocked_at,
    })),
    progress_source:    achievement.progress_source,
    reward_description: achievement.reward_description || "",
    reward_image_url:   achievement.reward_image_url   || "",
    reward_title:       achievement.reward_title,
    reward_why:         achievement.reward_why || "",
    status:             achievement.status,
    target_value:       achievement.target_value,
    title:              achievement.title,
  };
}

/* ── Form ─────────────────────────────────────────────────────────────────── */

export function AchievementForm({
  achievement,
  availableProjects,
  availableTasks,
  onCancel,
  onSubmit,
  submitting,
}: AchievementFormProps) {
  const init = getInitialState(achievement);

  const [title,               setTitle]               = useState(init.title);
  const [description,         setDescription]         = useState(init.description);
  const [category,            setCategory]            = useState(init.category);
  const [icon,                setIcon]                = useState(init.icon);
  const [imageUrl,            setImageUrl]            = useState(init.image_url);
  const [backgroundImageUrl,  setBackgroundImageUrl]  = useState(init.background_image_url);
  const [targetValue,         setTargetValue]         = useState(init.target_value);
  const [currentProgress,     setCurrentProgress]     = useState(init.current_progress);
  const [status,              setStatus]              = useState<Achievement["status"]>(init.status);
  const [progressSource,      setProgressSource]      = useState<Achievement["progress_source"]>(init.progress_source);
  const [rewardTitle,         setRewardTitle]         = useState(init.reward_title);
  const [rewardDescription,   setRewardDescription]   = useState(init.reward_description);
  const [rewardImageUrl,      setRewardImageUrl]      = useState(init.reward_image_url);
  const [rewardWhy,           setRewardWhy]           = useState(init.reward_why);
  const [milestones,          setMilestones]          = useState(init.milestones);
  const [linkedTaskIds,       setLinkedTaskIds]       = useState<string[]>(init.linked_task_ids);
  const [linkedProjectIds,    setLinkedProjectIds]    = useState<string[]>(init.linked_project_ids);

  const progressSourceDescription = useMemo(
    () => ACHIEVEMENT_PROGRESS_SOURCE_OPTIONS.find((o) => o.value === progressSource)?.description || "",
    [progressSource],
  );

  /* Live preview metrics */
  const previewPct = Math.min(100, Math.round((currentProgress / Math.max(1, targetValue)) * 100));

  async function handleSubmit(e: React.FormEvent<HTMLFormElement>) {
    e.preventDefault();
    await onSubmit({
      background_image_url: backgroundImageUrl || null,
      category:             category.trim() || "productivity",
      current_progress:     Number.isFinite(currentProgress) ? currentProgress : 0,
      description:          description || null,
      icon:                 icon || "🏆",
      image_url:            imageUrl || null,
      linked_project_ids:   linkedProjectIds,
      linked_task_ids:      linkedTaskIds,
      milestones,
      progress_source:      progressSource,
      reward_description:   rewardDescription || null,
      reward_image_url:     rewardImageUrl || null,
      reward_title:         rewardTitle.trim(),
      reward_why:           rewardWhy || null,
      status,
      target_value:         Math.max(1, targetValue),
      title:                title.trim(),
    });
  }

  function updateMilestone(index: number, patch: Partial<(typeof milestones)[number]>) {
    setMilestones((cur) => cur.map((m, i) => (i === index ? { ...m, ...patch } : m)));
  }
  function addMilestone() {
    setMilestones((cur) => [
      ...cur,
      {
        description: "",
        linked_task_ids: [],
        milestone_value: targetValue,
        sort_order: cur.length,
        title: `Milestone ${cur.length + 1}`,
        unlocked_at: null,
      },
    ]);
  }
  function removeMilestone(index: number) {
    setMilestones((cur) => cur.filter((_, i) => i !== index).map((m, i) => ({ ...m, sort_order: i })));
  }

  /* ───────────────────────────────────────────────────────────────────── */

  return (
    <form onSubmit={handleSubmit} className="space-y-5">

      {/* ── Row 1: fields + live preview ────────────────────────────────── */}
      <div className="grid gap-5 lg:grid-cols-[1.15fr_0.85fr]">

        {/* Left: core fields */}
        <div className="space-y-4">

          {/* Title */}
          <div>
            <FormLabel>Title</FormLabel>
            <Input
              value={title}
              onChange={(e) => setTitle(e.target.value)}
              placeholder="e.g. First 10K Month"
              className="mt-1 border-white/[0.08] bg-white/[0.03] text-white placeholder:text-white/20"
              autoFocus
            />
          </div>

          {/* Description */}
          <div>
            <FormLabel>Description</FormLabel>
            <Textarea
              value={description}
              onChange={(e) => setDescription(e.target.value)}
              placeholder="Describe what this achievement means and why it matters."
              className="mt-1 min-h-[88px] border-white/[0.08] bg-white/[0.03] text-white placeholder:text-white/20"
            />
          </div>

          {/* Category + Status */}
          <div className="grid gap-4 sm:grid-cols-2">
            <div>
              <FormLabel>Category</FormLabel>
              <Input
                value={category}
                onChange={(e) => setCategory(e.target.value)}
                list="achievement-category-suggestions"
                className="mt-1 border-white/[0.08] bg-white/[0.03] text-white placeholder:text-white/20"
              />
              <datalist id="achievement-category-suggestions">
                {ACHIEVEMENT_CATEGORY_SUGGESTIONS.map((s) => (
                  <option key={s} value={s} />
                ))}
              </datalist>
            </div>
            <div>
              <FormLabel>Status</FormLabel>
              <Select
                value={status}
                onChange={(e) => setStatus(e.target.value as Achievement["status"])}
                className="mt-1 border-white/[0.08] bg-white/[0.03] text-white"
              >
                {ACHIEVEMENT_STATUS_OPTIONS.map((o) => (
                  <option key={o.value} value={o.value}>{o.label}</option>
                ))}
              </Select>
            </div>
          </div>

          {/* Icon + Target + Current progress */}
          <div className="grid gap-4 sm:grid-cols-3">
            <div>
              <FormLabel>Icon</FormLabel>
              <Input
                value={icon}
                onChange={(e) => setIcon(e.target.value)}
                placeholder="🏆"
                className="mt-1 border-white/[0.08] bg-white/[0.03] text-white"
              />
            </div>
            <div>
              <FormLabel>Target value</FormLabel>
              <Input
                type="number"
                min={1}
                value={targetValue}
                onChange={(e) => setTargetValue(Number(e.target.value) || 1)}
                className="mt-1 border-white/[0.08] bg-white/[0.03] text-white"
              />
            </div>
            <div>
              <FormLabel>Current progress</FormLabel>
              <Input
                type="number"
                min={0}
                value={currentProgress}
                disabled={progressSource !== "manual"}
                onChange={(e) => setCurrentProgress(Number(e.target.value) || 0)}
                className="mt-1 border-white/[0.08] bg-white/[0.03] text-white disabled:opacity-50"
              />
            </div>
          </div>

          {/* Progress source */}
          <div>
            <FormLabel>Progress source</FormLabel>
            <Select
              value={progressSource}
              onChange={(e) => setProgressSource(e.target.value as Achievement["progress_source"])}
              className="mt-1 border-white/[0.08] bg-white/[0.03] text-white"
            >
              {ACHIEVEMENT_PROGRESS_SOURCE_OPTIONS.map((o) => (
                <option key={o.value} value={o.value}>{o.label}</option>
              ))}
            </Select>
            {progressSourceDescription && (
              <p className="mt-1.5 text-[11px] leading-relaxed text-white/30">
                {progressSourceDescription}
              </p>
            )}
          </div>
        </div>

        {/* Right: live preview */}
        <div className="space-y-4">
          {/* Preview hero */}
          <div className="overflow-hidden rounded-[24px] border border-white/[0.07]">
            <div
              className="relative min-h-[220px]"
              style={{
                backgroundImage: backgroundImageUrl
                  ? `linear-gradient(180deg, rgba(8,8,12,0.08), rgba(8,8,12,0.82)), url(${backgroundImageUrl})`
                  : "radial-gradient(ellipse at 30% -20%, #4c1d95 0%, #3730a3 22%, #0c0a10 60%)",
                backgroundSize:     "cover",
                backgroundPosition: "center",
              }}
            >
              {/* Preview badge */}
              <div className="absolute top-4 left-4">
                <span className="inline-flex items-center gap-1.5 rounded-full border border-violet-400/20 bg-violet-500/[0.15] px-2.5 py-1 text-[10px] font-bold uppercase tracking-[0.12em] text-violet-300 backdrop-blur-sm">
                  <Sparkles className="h-2.5 w-2.5" />
                  Live preview
                </span>
              </div>

              <div className="absolute inset-x-0 bottom-0 px-5 pb-5 pt-16">
                <div className="flex items-end gap-3">
                  <div className="flex h-12 w-12 shrink-0 items-center justify-center rounded-[16px] border border-white/[0.12] bg-white/[0.08] text-2xl shadow-lg backdrop-blur-sm">
                    {icon || "🏆"}
                  </div>
                  <div className="min-w-0">
                    <p className="text-[17px] font-bold leading-tight text-white">
                      {title || <span className="text-white/30">Achievement title</span>}
                    </p>
                    <p className="mt-0.5 text-[12px] text-white/40 truncate">
                      {rewardTitle || "Reward destination"}
                    </p>
                  </div>
                </div>
              </div>
            </div>

            {/* Progress bar in preview */}
            <div className="border-t border-white/[0.06] bg-[#0e0c15] px-5 py-4">
              <div className="flex items-center justify-between mb-2">
                <p className="text-[10px] font-bold uppercase tracking-[0.16em] text-white/25">Progress</p>
                <p className="font-mono text-[12px] font-semibold text-violet-300/80">{previewPct}%</p>
              </div>
              <div className="relative h-1.5 overflow-hidden rounded-full bg-white/[0.07]">
                <div
                  className="absolute inset-y-0 left-0 rounded-full bg-[linear-gradient(90deg,#6d28d9,#8b5cf6)] transition-all duration-500"
                  style={{ width: `${previewPct}%` }}
                />
              </div>
            </div>
          </div>

          {/* Image URLs */}
          <div>
            <FormLabel>Achievement image URL</FormLabel>
            <Input
              value={imageUrl}
              onChange={(e) => setImageUrl(e.target.value)}
              placeholder="https://..."
              className="mt-1 border-white/[0.08] bg-white/[0.03] text-white placeholder:text-white/20"
            />
          </div>
          <div>
            <FormLabel>Background image URL</FormLabel>
            <Input
              value={backgroundImageUrl}
              onChange={(e) => setBackgroundImageUrl(e.target.value)}
              placeholder="https://..."
              className="mt-1 border-white/[0.08] bg-white/[0.03] text-white placeholder:text-white/20"
            />
          </div>
        </div>
      </div>

      {/* ── Milestone roadmap ────────────────────────────────────────────── */}
      <FormSection
        icon={<Map className="h-4 w-4 text-violet-400" />}
        title="Milestone roadmap"
        description="Break the achievement into visible checkpoints."
        action={
          <button
            type="button"
            onClick={addMilestone}
            className="flex items-center gap-1.5 rounded-xl border border-violet-500/20 bg-violet-500/[0.08] px-3.5 py-2 text-[12px] font-semibold text-violet-300 transition-all hover:bg-violet-500/[0.14]"
          >
            <Plus className="h-3.5 w-3.5" />
            Add milestone
          </button>
        }
      >
        <div className="space-y-3">
          {milestones.length === 0 && (
            <p className="text-[13px] text-white/25 py-2">No milestones yet. Add one to build a visual roadmap.</p>
          )}
          {milestones.map((milestone, index) => (
            <div
              key={`${milestone.title}-${index}`}
              className="overflow-hidden rounded-2xl border border-white/[0.07] bg-white/[0.02]"
            >
              <div className="flex items-center gap-2 border-b border-white/[0.05] px-4 py-2.5">
                <span className="flex h-5 w-5 shrink-0 items-center justify-center rounded-full border border-violet-500/20 bg-violet-500/10 text-[10px] font-bold text-violet-400">
                  {index + 1}
                </span>
                <span className="text-[11px] font-bold uppercase tracking-[0.14em] text-white/25">
                  Checkpoint {index + 1}
                </span>
                <button
                  type="button"
                  onClick={() => removeMilestone(index)}
                  className="ml-auto rounded-lg p-1 text-white/25 transition-colors hover:bg-red-500/10 hover:text-red-300"
                >
                  <Trash2 className="h-3.5 w-3.5" />
                </button>
              </div>
              <div className="grid gap-3 p-4 md:grid-cols-[1fr_140px]">
                <Input
                  value={milestone.title}
                  onChange={(e) => updateMilestone(index, { title: e.target.value })}
                  placeholder="Milestone title"
                  className="border-white/[0.08] bg-white/[0.03] text-white placeholder:text-white/20"
                />
                <Input
                  type="number"
                  min={0}
                  value={milestone.milestone_value}
                  onChange={(e) => updateMilestone(index, { milestone_value: Number(e.target.value) || 0 })}
                  className="border-white/[0.08] bg-white/[0.03] text-white"
                />
              </div>
              <div className="px-4 pb-4">
                <Textarea
                  value={milestone.description || ""}
                  onChange={(e) => updateMilestone(index, { description: e.target.value })}
                  placeholder="Optional context for this checkpoint…"
                  className="min-h-[72px] border-white/[0.08] bg-white/[0.03] text-white placeholder:text-white/20"
                />
              </div>
              <div className="border-t border-white/[0.05] px-4 py-4">
                <div className="mb-3 flex items-center justify-between gap-3">
                  <div>
                    <p className="text-[11px] font-bold uppercase tracking-[0.14em] text-white/30">
                      Etappen-Tasks
                    </p>
                    <p className="mt-1 text-[12px] text-white/25">
                      Wenn alle hier verlinkten Tasks erledigt sind, wird diese Etappe automatisch abgeschlossen.
                    </p>
                  </div>
                  {(milestone.linked_task_ids || []).length > 0 && (
                    <span className="rounded-full bg-sky-500/10 px-2.5 py-1 text-[10px] font-bold text-sky-300">
                      {(milestone.linked_task_ids || []).length} linked
                    </span>
                  )}
                </div>
                {availableTasks.length === 0 ? (
                  <p className="text-[12px] text-white/25">No tasks available in this workspace yet.</p>
                ) : (
                  <div className="grid gap-2 md:grid-cols-2">
                    {availableTasks.map((task) => {
                      const selected = (milestone.linked_task_ids || []).includes(task.id);
                      return (
                        <button
                          key={task.id}
                          type="button"
                          onClick={() =>
                            updateMilestone(index, {
                              linked_task_ids: toggleId(milestone.linked_task_ids || [], task.id),
                            })
                          }
                          className={cn(
                            "flex items-center justify-between gap-2 rounded-xl border px-3 py-2.5 text-left transition-all",
                            selected
                              ? "border-sky-400/20 bg-sky-500/10 text-white"
                              : "border-white/[0.06] bg-white/[0.02] text-white/55 hover:bg-white/[0.05]",
                          )}
                        >
                          <span className="min-w-0">
                            <span className="block truncate text-[12px] font-semibold">{task.title}</span>
                            <span className="mt-0.5 block text-[10px] uppercase tracking-[0.14em] text-white/25">
                              {task.status.replace(/_/g, " ")}
                            </span>
                          </span>
                          <span
                            className={cn(
                              "h-2.5 w-2.5 shrink-0 rounded-full",
                              selected ? "bg-sky-300" : "bg-white/15",
                            )}
                          />
                        </button>
                      );
                    })}
                  </div>
                )}
              </div>
            </div>
          ))}
        </div>
      </FormSection>

      {/* ── Reward destination ───────────────────────────────────────────── */}
      <FormSection
        icon={<Gift className="h-4 w-4 text-amber-400" />}
        title="Reward destination"
        description="Make the outcome tangible so the achievement feels worth chasing."
      >
        <div className="grid gap-4 lg:grid-cols-2">
          <div>
            <FormLabel>Reward title</FormLabel>
            <Input
              value={rewardTitle}
              onChange={(e) => setRewardTitle(e.target.value)}
              placeholder="Weekend trip, new setup, celebration dinner…"
              className="mt-1 border-white/[0.08] bg-white/[0.03] text-white placeholder:text-white/20"
            />
          </div>
          <div>
            <FormLabel>Reward image URL</FormLabel>
            <Input
              value={rewardImageUrl}
              onChange={(e) => setRewardImageUrl(e.target.value)}
              placeholder="https://..."
              className="mt-1 border-white/[0.08] bg-white/[0.03] text-white placeholder:text-white/20"
            />
          </div>
        </div>

        <div className="mt-4">
          <FormLabel>Reward description</FormLabel>
          <Textarea
            value={rewardDescription}
            onChange={(e) => setRewardDescription(e.target.value)}
            placeholder="Describe the reward in a way that feels motivating and concrete."
            className="mt-1 min-h-[88px] border-white/[0.08] bg-white/[0.03] text-white placeholder:text-white/20"
          />
        </div>

        <div className="mt-4">
          <FormLabel>Why this reward matters</FormLabel>
          <Textarea
            value={rewardWhy}
            onChange={(e) => setRewardWhy(e.target.value)}
            placeholder="Optional: explain why this reward reinforces the achievement."
            className="mt-1 min-h-[72px] border-white/[0.08] bg-white/[0.03] text-white placeholder:text-white/20"
          />
        </div>
      </FormSection>

      {/* ── Linked work ──────────────────────────────────────────────────── */}
      <FormSection
        icon={<Target className="h-4 w-4 text-sky-400" />}
        title="Linked work"
        description="Attach tasks or projects to anchor this achievement in real work."
      >
        <LinkedEntityPicker
          projectIds={linkedProjectIds}
          projects={availableProjects}
          setProjectIds={setLinkedProjectIds}
          setTaskIds={setLinkedTaskIds}
          taskIds={linkedTaskIds}
          tasks={availableTasks}
        />
      </FormSection>

      {/* ── Footer ───────────────────────────────────────────────────────── */}
      <div className="flex items-center justify-end gap-3 pt-1">
        <button
          type="button"
          onClick={onCancel}
          className="rounded-xl border border-white/[0.07] bg-white/[0.03] px-5 py-2.5 text-[13px] font-semibold text-white/50 transition-all hover:bg-white/[0.06] hover:text-white/70"
        >
          Cancel
        </button>
        <button
          type="submit"
          disabled={!title.trim() || !rewardTitle.trim() || submitting}
          className={cn(
            "rounded-xl px-5 py-2.5 text-[13px] font-bold text-white transition-all",
            "bg-violet-600 shadow-[0_4px_20px_rgba(109,40,217,0.30)] hover:bg-violet-500 hover:shadow-[0_4px_28px_rgba(109,40,217,0.40)]",
            "disabled:cursor-not-allowed disabled:opacity-40 disabled:shadow-none",
          )}
        >
          {submitting ? "Saving…" : achievement ? "Save achievement" : "Create achievement"}
        </button>
      </div>
    </form>
  );
}

/* ── Form section wrapper ─────────────────────────────────────────────────── */

function FormSection({
  action,
  children,
  description,
  icon,
  title,
}: {
  action?:      React.ReactNode;
  children:     React.ReactNode;
  description?: string;
  icon:         React.ReactNode;
  title:        string;
}) {
  return (
    <div className="overflow-hidden rounded-[24px] border border-white/[0.07] bg-[#0e0c15]">
      {/* Section header */}
      <div className="flex items-center justify-between gap-4 border-b border-white/[0.05] px-5 py-4">
        <div className="flex items-center gap-3">
          <div className="flex h-7 w-7 items-center justify-center rounded-lg bg-white/[0.05]">
            {icon}
          </div>
          <div>
            <p className="text-[13px] font-bold text-white/80">{title}</p>
            {description && (
              <p className="text-[11px] text-white/30">{description}</p>
            )}
          </div>
        </div>
        {action}
      </div>
      {/* Section body */}
      <div className="p-5">{children}</div>
    </div>
  );
}

/* ── Label helper ─────────────────────────────────────────────────────────── */

function FormLabel({ children }: { children: React.ReactNode }) {
  return (
    <p className="text-[12px] font-semibold text-white/55">{children}</p>
  );
}
