"use client";

import { useState } from "react";
import { useRouter } from "next/navigation";
import { toast } from "sonner";
import { JM } from "./modal-theme";
import {
  SetupHeader, FieldLabel, TextInput, TextArea, AudienceSelector,
  PrimaryButton, SecondaryButton, StepDots,
  type SetupProps, type Audience,
} from "./setup-shared";

/**
 * "Build your own idea" — two-step setup.
 *   Step 1: project name + audience.
 *   Step 2: describe the idea (free text). Becomes the seed message
 *           for the first AI conversation in the project.
 */
export function BuildSetup({ workspace, onClose, onBack }: SetupProps) {
  const router = useRouter();
  const [step, setStep] = useState<0 | 1>(0);
  const [name, setName] = useState("");
  const [audience, setAudience] = useState<Audience>("customers");
  const [idea, setIdea] = useState("");
  const [loading, setLoading] = useState(false);

  const canContinue = name.trim().length > 0;
  const canCreate = idea.trim().length > 4;

  const handleCreate = async () => {
    if (!canCreate) return;
    setLoading(true);
    try {
      const res = await fetch("/api/projects/create", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({
          projectName: name.trim(),
          projectType: "web-app",
          slug: name.toLowerCase().replace(/[^a-z0-9]+/g, "-"),
          vision: idea.trim(),
          product: { name: name.trim() },
          audience,
          creationMode: "build",
          sourceData: { idea: idea.trim(), audience },
        }),
      });
      if (!res.ok) {
        const err = await res.json();
        toast.error(err.error || "Failed to create project");
        return;
      }
      const data = await res.json();
      onClose();
      router.push(`/${workspace}/project/${data.projectId}/product`);
    } catch {
      toast.error("Something went wrong");
    } finally {
      setLoading(false);
    }
  };

  return (
    <div style={{ padding: 28 }}>
      <SetupHeader
        icon="✦" label="Build your own idea" tagline="Start from scratch"
        accent="#4338CA" onBack={step === 0 ? onBack : () => setStep(0)} onClose={onClose}
      />

      {step === 0 && (
        <>
          <FieldLabel>Project name</FieldLabel>
          <TextInput
            value={name}
            onChange={setName}
            placeholder="e.g. Pet Sitter Pro"
            onKeyDown={e => { if (e.key === "Enter" && canContinue) setStep(1); }}
            autoFocus
          />

          <AudienceSelector value={audience} onChange={setAudience} />

          <FlowFooter step={0} total={2} primary={
            <PrimaryButton onClick={() => setStep(1)} disabled={!canContinue}>
              Next →
            </PrimaryButton>
          } />
        </>
      )}

      {step === 1 && (
        <>
          <FieldLabel>What do you want to build?</FieldLabel>
          <TextArea
            value={idea}
            onChange={setIdea}
            placeholder="A booking site for my dog grooming business. Customers should be able to book online and pay a deposit by card."
            rows={6}
            autoFocus
          />
          <p style={{ fontSize: 12, color: JM.muted, marginTop: -8, marginBottom: 18, lineHeight: 1.5 }}>
            Don't worry about the tech. Vibn will pick the tools and start building from this description.
          </p>

          <FlowFooter
            step={1} total={2}
            secondary={<SecondaryButton onClick={() => setStep(0)}>← Back</SecondaryButton>}
            primary={
              <PrimaryButton onClick={handleCreate} disabled={!canCreate} loading={loading}>
                Start building →
              </PrimaryButton>
            }
          />
        </>
      )}
    </div>
  );
}

function FlowFooter({
  step, total, primary, secondary,
}: {
  step: number; total: number;
  primary: React.ReactNode; secondary?: React.ReactNode;
}) {
  return (
    <div style={{ display: "flex", alignItems: "center", gap: 12, marginTop: 6 }}>
      <StepDots step={step} total={total} />
      <div style={{ flex: 1 }} />
      {secondary}
      <div style={{ minWidth: 160 }}>{primary}</div>
    </div>
  );
}
