import { archiveSeriesAction, saveSeriesAction } from "@/app/admin/actions";
import AdminFeedback from "@/components/admin/AdminFeedback";
import { FormCard, SelectField, SubmitButton, TextAreaField, TextField } from "@/components/admin/AdminFormFields";
import AdminShell from "@/components/admin/AdminShell";
import { requireAdminPermission } from "@/lib/auth";
import { prisma } from "@/lib/db";
import { ExternalLink, Plus } from "lucide-react";
import AdminAssetField from "@/components/admin/AdminAssetField";
import Link from "next/link";
import { hasAdminPermission } from "@/lib/admin-permissions";

export const revalidate = 0;

export default async function AdminSeriesPage({ searchParams }: { searchParams: Promise<Record<string, string | string[] | undefined>> }) {
  const session = await requireAdminPermission("series", "view");
  const query = await searchParams;
  const editId = typeof query.edit === "string" ? query.edit : null;
  const [series, categories] = await Promise.all([
    prisma.series.findMany({
      where: { status: { not: "archived" } },
      include: { category: true, _count: { select: { products: true } } },
      orderBy: [{ order: "asc" }, { name: "asc" }],
    }),
    prisma.category.findMany({ orderBy: { order: "asc" } }),
  ]);
  const selected = editId ? series.find((item) => item.id === editId) : null;
  const canCreate = hasAdminPermission(session, "series", "create");
  const canEdit = hasAdminPermission(session, "series", "edit");
  const canPublish = hasAdminPermission(session, "series", "publish");
  const canArchive = hasAdminPermission(session, "series", "archive");
  const canUpload = hasAdminPermission(session, "series", "upload");
  const canManageForm = selected ? canEdit : canCreate;

  return (
    <AdminShell
      eyebrow="Koleksiyon mimarisi"
      title="Seri yönetimi"
      description="Yeni seri ekleyin, sıralamayı değiştirin ve Türkçe, İngilizce, Rusça anlatımları kod dosyasına dokunmadan yönetin."
      actions={canCreate ? <Link href="/admin/series?new=1" className="inline-flex items-center gap-2 rounded-full bg-ember px-5 py-3 text-[10px] font-semibold uppercase tracking-[0.15em] text-surface-0"><Plus size={14} /> Yeni seri</Link> : undefined}
    >
      <AdminFeedback saved={typeof query.saved === "string" ? query.saved : undefined} error={typeof query.error === "string" ? query.error : undefined} />
      <div className="grid gap-6 xl:grid-cols-[360px_minmax(0,1fr)]">
        <div className="space-y-3">
          {series.map((item) => (
            <Link key={item.id} href={`/admin/series?edit=${item.id}`} className={`block rounded-2xl border p-4 transition ${selected?.id === item.id ? "border-ember/50 bg-ember/[0.07]" : "border-border bg-surface-1/50 hover:border-border-strong"}`}>
              <div className="flex items-start justify-between gap-4">
                <div>
                  <p className="font-semibold">{item.name}</p>
                  <p className="mt-1 text-xs text-fg-muted">/{item.slug || "bağlantı-belirlenmedi"}</p>
                </div>
                <span className="rounded-full border border-border px-2 py-1 text-[9px] uppercase tracking-wider text-fg-secondary">{item._count.products} ürün</span>
              </div>
              <p className="mt-4 line-clamp-2 text-xs leading-5 text-fg-secondary">{item.taglineTr || "Türkçe kısa anlatım bekleniyor"}</p>
            </Link>
          ))}
        </div>

        <FormCard
          title={selected ? `${selected.name} serisini düzenle` : "Yeni seri oluştur"}
          subtitle="Bu alanlar koleksiyon seçicisi, seri hikâyesi, ürün filtresi ve SEO sunumunun veri kaynağıdır."
        >
          {!canManageForm ? <div className="mb-5 rounded-2xl border border-border bg-white/[0.025] p-4 text-sm text-fg-secondary">Bu seri için görüntüleme yetkiniz var; oluşturma veya düzenleme yetkiniz yok.</div> : null}
          <form action={saveSeriesAction} className="space-y-7">
            {selected ? <input type="hidden" name="id" value={selected.id} /> : null}
            <div className="grid gap-4 md:grid-cols-2 xl:grid-cols-4">
              <TextField label="Seri adı" name="name" defaultValue={selected?.name} required placeholder="Nero" />
              <TextField label="URL bağlantısı" name="slug" defaultValue={selected?.slug} required placeholder="nero" />
              <TextField label="Ürün seri kodu" name="seriesFilter" defaultValue={selected?.seriesFilter || selected?.name} required placeholder="Nero veya VTC" />
              <SelectField label="Kategori" name="categoryId" defaultValue={selected?.categoryId || categories[0]?.id}>
                {categories.map((category) => <option key={category.id} value={category.id}>{category.name}</option>)}
              </SelectField>
              <TextField label="Gösterim sırası" name="order" type="number" min={0} max={999} defaultValue={selected?.order ?? series.length + 1} />
              <SelectField label="Yayın durumu" name="status" defaultValue={selected?.status || "draft"}>
                <option value="draft">Taslak</option>{canPublish || selected?.status === "published" ? <option value="published">Yayında</option> : null}
              </SelectField>
              <TextField label="Ölçüler" name="sizes" defaultValue={selected?.sizes} placeholder="30 · 60 · 90 cm" />
              <TextField label="Görsel konumu" name="imagePosition" defaultValue={selected?.imagePosition} placeholder="50% 50%" />
            </div>

            <div className="grid gap-5 lg:grid-cols-3">
              {(["Tr", "En", "Ru"] as const).map((locale) => (
                <div key={locale} className="space-y-4 rounded-2xl border border-border bg-surface-0/45 p-4">
                  <p className="text-[10px] font-semibold uppercase tracking-[0.18em] text-ember">{locale === "Tr" ? "Türkçe" : locale === "En" ? "English" : "Русский"}</p>
                  <TextField label="Kısa anlatım" name={`tagline${locale}`} defaultValue={selected?.[`tagline${locale}`]} />
                  <TextAreaField label="Seri hikâyesi" name={`story${locale}`} defaultValue={selected?.[`story${locale}`]} rows={5} />
                  <TextField label="Yüzeyler" name={`surfaces${locale}`} defaultValue={selected?.[`surfaces${locale}`]} />
                </div>
              ))}
            </div>

            <div className="grid gap-4 md:grid-cols-3">
              <AdminAssetField label="Ana perspektif görseli" name="image" defaultValue={selected?.image} canUpload={canUpload} uploadModule="series" />
              <AdminAssetField label="Üst görünüm" name="topImage" defaultValue={selected?.topImage} canUpload={canUpload} uploadModule="series" />
              <AdminAssetField label="Inox görünüm" name="inoxImage" defaultValue={selected?.inoxImage} canUpload={canUpload} uploadModule="series" />
            </div>

            <div className="flex flex-wrap items-center justify-between gap-3 border-t border-border pt-6">
              <div className="flex gap-3">
                {canManageForm ? <SubmitButton>{selected ? "Değişiklikleri kaydet" : "Seriyi oluştur"}</SubmitButton> : null}
                {selected?.slug ? <Link href={`/tr/collections/${selected.slug}`} target="_blank" className="inline-flex items-center gap-2 rounded-full border border-border px-5 py-3 text-[10px] font-semibold uppercase tracking-[0.14em] text-fg-secondary">Önizleme <ExternalLink size={13} /></Link> : null}
              </div>
            </div>
          </form>
          {selected && canArchive ? (
            <form action={archiveSeriesAction} className="mt-4 border-t border-border pt-4">
              <input type="hidden" name="id" value={selected.id} />
              <button type="submit" disabled={selected._count.products > 0} className="text-xs text-red-300 disabled:cursor-not-allowed disabled:opacity-35">
                {selected._count.products > 0 ? "Arşivlemek için bağlı ürünleri başka seriye taşıyın." : "Bu seriyi arşive al"}
              </button>
            </form>
          ) : null}
        </FormCard>
      </div>
    </AdminShell>
  );
}
