"use client";

import { useActionState, useState } from "react";
import { useTranslations } from "next-intl";
import { createOrderAction } from "@/lib/actions/orders";
import { SHOOTING_TYPES } from "@/lib/orderConstants";
import { Field, SubmitButton, RequiredMark } from "@/components/auth/RegisterForm";

function TextArea({
  label,
  name,
  maxLength,
  defaultValue,
}: {
  label: string;
  name: string;
  maxLength?: number;
  defaultValue?: string;
}) {
  return (
    <label className="flex flex-col gap-1.5 text-sm">
      <span className="text-xs uppercase tracking-[0.1em] text-[var(--rk-ink-muted)]">{label}</span>
      <textarea
        name={name}
        maxLength={maxLength}
        rows={4}
        defaultValue={defaultValue}
        className="bg-transparent border border-white/15 rounded-lg px-3.5 py-2.5 text-[var(--rk-ink)] focus:outline-none focus:border-white/50 transition-colors resize-y"
      />
    </label>
  );
}

export function NewOrderForm({
  locale,
  minLeadTimeWeeks,
  defaultShootingType,
  defaultConcept,
  serviceId,
  tierId,
  bundleId,
  defaultEventLocation,
  defaultDatePeriod,
  defaultInstagramHandle,
  defaultDiscordHandle,
  defaultIdeaMood,
  defaultAdditionalNotes,
}: {
  locale: string;
  minLeadTimeWeeks: number;
  defaultShootingType?: string;
  defaultConcept?: string;
  serviceId?: string;
  tierId?: string;
  bundleId?: string;
  defaultEventLocation?: string;
  defaultDatePeriod?: string;
  defaultInstagramHandle?: string;
  defaultDiscordHandle?: string;
  defaultIdeaMood?: string;
  defaultAdditionalNotes?: string;
}) {
  const t = useTranslations("orders");
  const [state, formAction, pending] = useActionState(createOrderAction, {});
  const [earlyDateRequested, setEarlyDateRequested] = useState(false);
  const validDefaultShootingType =
    defaultShootingType && (SHOOTING_TYPES as readonly string[]).includes(defaultShootingType)
      ? defaultShootingType
      : "";
  // Kalender lässt regulär nur Termine ab der Mindestvorlaufzeit zu — wer
  // wirklich früher braucht, beschreibt das stattdessen über die "früherer
  // Termin"-Ausnahme unten (Freitext statt Datum), damit der Kalender selbst
  // nie unterlaufen werden muss.
  const minDate = new Date(Date.now() + minLeadTimeWeeks * 7 * 24 * 60 * 60 * 1000).toISOString().slice(0, 10);
  const validDefaultDatePeriod = defaultDatePeriod && /^\d{4}-\d{2}-\d{2}$/.test(defaultDatePeriod) ? defaultDatePeriod : undefined;

  return (
    <form action={formAction} className="flex flex-col gap-4" encType="multipart/form-data">
      <input type="hidden" name="locale" value={locale} />
      {serviceId && <input type="hidden" name="serviceId" value={serviceId} />}
      {tierId && <input type="hidden" name="tierId" value={tierId} />}
      {bundleId && <input type="hidden" name="bundleId" value={bundleId} />}

      <label className="flex flex-col gap-1.5 text-sm">
        <span className="text-xs uppercase tracking-[0.1em] text-[var(--rk-ink-muted)]">
          {t("shootingType")}
          <RequiredMark />
        </span>
        <select
          name="shootingType"
          required
          defaultValue={validDefaultShootingType}
          className="bg-[var(--rk-bg)] border border-white/15 rounded-lg px-3.5 py-2.5 text-[var(--rk-ink)] focus:outline-none focus:border-white/50 transition-colors"
        >
          <option value="" disabled>
            {t("shootingTypePlaceholder")}
          </option>
          {SHOOTING_TYPES.map((type) => (
            <option key={type} value={type}>
              {t(`shootingTypes.${type}`)}
            </option>
          ))}
        </select>
      </label>

      <Field label={t("characterOrConcept")} name="characterOrConcept" type="text" required defaultValue={defaultConcept} />
      <div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
        <Field label={t("eventLocation")} name="eventLocation" type="text" defaultValue={defaultEventLocation} />
        <Field label={t("datePeriod")} name="datePeriod" type="date" min={minDate} defaultValue={validDefaultDatePeriod} />
      </div>
      {minLeadTimeWeeks > 0 && (
        <p className="text-xs text-[var(--rk-ink-muted)] -mt-1">{t("leadTimeHint", { weeks: minLeadTimeWeeks })}</p>
      )}
      <label className="flex items-center gap-2 text-sm">
        <input
          type="checkbox"
          name="earlyDateRequested"
          checked={earlyDateRequested}
          onChange={(e) => setEarlyDateRequested(e.target.checked)}
          className="h-4 w-4"
        />
        {t("earlyDateRequested")}
      </label>
      {earlyDateRequested && (
        <TextArea label={t("earlyDateReasonLabel")} name="earlyDateReason" maxLength={500} />
      )}
      <div className="grid grid-cols-1 sm:grid-cols-2 gap-4">
        <Field label={t("instagramHandle")} name="instagramHandle" type="text" defaultValue={defaultInstagramHandle} />
        <Field label={t("discordHandle")} name="discordHandle" type="text" defaultValue={defaultDiscordHandle} />
      </div>
      <TextArea label={t("ideaMood")} name="ideaMood" maxLength={2500} defaultValue={defaultIdeaMood} />
      <TextArea label={t("additionalNotes")} name="additionalNotes" maxLength={2500} defaultValue={defaultAdditionalNotes} />

      <label className="flex flex-col gap-1.5 text-sm">
        <span className="text-xs uppercase tracking-[0.1em] text-[var(--rk-ink-muted)]">{t("attachments")}</span>
        <input
          name="attachments"
          type="file"
          multiple
          accept="image/jpeg,image/png,image/webp,image/heic,application/pdf"
          className="text-sm text-[var(--rk-ink-muted)] file:mr-3 file:border file:border-white/20 file:bg-transparent file:text-[var(--rk-ink)] file:rounded-lg file:px-3 file:py-1.5 file:text-xs file:uppercase file:tracking-[0.1em] hover:file:border-white/50"
        />
        <span className="text-xs text-[var(--rk-ink-muted)]">{t("attachmentsHint")}</span>
      </label>

      {state.error && <p className="text-sm text-red-400">{state.error}</p>}
      <SubmitButton pending={pending} label={t("submit")} />
    </form>
  );
}
