import {
  createAdminUserAction,
  resetAdminUserPasswordAction,
  revokeAdminUserSessionsAction,
  updateAdminUserAction,
} from "@/app/admin/actions";
import AdminFeedback from "@/components/admin/AdminFeedback";
import AdminShell from "@/components/admin/AdminShell";
import { ASSIGNABLE_ADMIN_MODULES, type AdminModule, type AdminPermissionAction } from "@/lib/admin-permissions";
import { requireAdminPermission } from "@/lib/auth";
import { prisma } from "@/lib/db";
import { KeyRound, Plus, ShieldCheck, UserRoundCog } from "lucide-react";
import Link from "next/link";

export const revalidate = 0;

const ACTION_LABELS: Record<AdminPermissionAction, string> = {
  view: "Görüntüle",
  create: "Ekle",
  edit: "Düzenle",
  publish: "Yayınla",
  archive: "Arşivle",
  upload: "Dosya yükle",
};

const MODULE_ACTIONS: Record<Exclude<AdminModule, "users">, AdminPermissionAction[]> = {
  products: ["view", "create", "edit", "publish", "archive", "upload"],
  series: ["view", "create", "edit", "publish", "archive", "upload"],
  gallery: ["view", "create", "edit", "publish", "archive", "upload"],
  markets: ["view", "create", "edit", "publish"],
  sections: ["view", "edit", "publish"],
  activity: ["view"],
};

type PermissionRow = {
  module: string;
  canView: boolean;
  canCreate: boolean;
  canEdit: boolean;
  canPublish: boolean;
  canArchive: boolean;
  canUpload: boolean;
};

function permissionEnabled(permission: PermissionRow | undefined, action: AdminPermissionAction) {
  if (!permission) return false;
  if (action === "view") return permission.canView;
  if (action === "create") return permission.canCreate;
  if (action === "edit") return permission.canEdit;
  if (action === "publish") return permission.canPublish;
  if (action === "archive") return permission.canArchive;
  return permission.canUpload;
}

function PermissionMatrix({ permissions = [] }: { permissions?: PermissionRow[] }) {
  return (
    <fieldset className="space-y-4">
      <legend className="mb-3 text-[10px] font-semibold uppercase tracking-[0.18em] text-fg-muted">Modül ve işlem yetkileri</legend>
      {ASSIGNABLE_ADMIN_MODULES.map((module) => {
        const permission = permissions.find((item) => item.module === module.key);
        const actions = MODULE_ACTIONS[module.key];
        return (
          <div key={module.key} className="rounded-2xl border border-border bg-white/[0.02] p-4">
            <div className="mb-3">
              <p className="text-sm font-semibold text-fg-primary">{module.label}</p>
              <p className="mt-1 text-xs leading-5 text-fg-muted">{module.description}</p>
            </div>
            <div className="flex flex-wrap gap-2">
              {actions.map((action) => (
                <label key={action} className="inline-flex cursor-pointer items-center gap-2 rounded-full border border-border px-3 py-2 text-[10px] uppercase tracking-[0.1em] text-fg-secondary has-[:checked]:border-ember/50 has-[:checked]:bg-ember/[0.08] has-[:checked]:text-ember">
                  <input
                    type="checkbox"
                    name={`permission_${module.key}_${action}`}
                    defaultChecked={permissionEnabled(permission, action)}
                    className="accent-[var(--ember)]"
                  />
                  {ACTION_LABELS[action]}
                </label>
              ))}
            </div>
          </div>
        );
      })}
    </fieldset>
  );
}

export default async function AdminUsersPage({ searchParams }: { searchParams: Promise<Record<string, string | string[] | undefined>> }) {
  await requireAdminPermission("users", "view");
  const query = await searchParams;
  const editId = typeof query.edit === "string" ? query.edit : null;
  const users = await prisma.adminUser.findMany({
    include: {
      permissions: true,
      sessions: { where: { revokedAt: null, expiresAt: { gt: new Date() } }, select: { id: true } },
    },
    orderBy: [{ isSystem: "desc" }, { createdAt: "asc" }],
  });
  const selected = editId ? users.find((user) => user.id === editId) : null;

  return (
    <AdminShell
      eyebrow="Kimlik ve erişim"
      title="Yönetici hesapları"
      description="Her hesaba yalnız ihtiyaç duyduğu modül ve işlemleri verin. Menü görünürlüğü ile sunucu tarafı işlem izinleri aynı yetki kaynağından yönetilir."
      actions={<Link href="/admin/users?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 hesap</Link>}
    >
      <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">
          {users.map((user) => (
            <Link key={user.id} href={`/admin/users?edit=${user.id}`} className={`block rounded-2xl border p-4 transition ${selected?.id === user.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-3">
                <div>
                  <div className="flex items-center gap-2 text-sm font-semibold text-fg-primary">
                    {user.isSystem ? <ShieldCheck size={15} className="text-ember" /> : <UserRoundCog size={15} className="text-fg-muted" />}
                    {user.displayName}
                  </div>
                  <p className="mt-1 text-xs text-fg-muted">@{user.username}</p>
                </div>
                <span className={`rounded-full border px-2 py-1 text-[9px] uppercase tracking-wider ${user.status === "active" ? "border-emerald-500/25 text-emerald-300" : "border-red-500/25 text-red-300"}`}>{user.status === "active" ? "Aktif" : "Kapalı"}</span>
              </div>
              <div className="mt-4 flex items-center justify-between border-t border-border pt-3 text-[10px] uppercase tracking-wider text-fg-muted">
                <span>{user.isSystem ? "Tüm yetkiler" : `${user.permissions.length} modül`}</span>
                <span>{user.sessions.length} açık oturum</span>
              </div>
            </Link>
          ))}
        </div>

        <div className="rounded-3xl border border-border bg-surface-1/55 p-5 md:p-7">
          {selected?.isSystem ? (
            <div className="space-y-6">
              <div className="rounded-2xl border border-ember/30 bg-ember/[0.07] p-5">
                <div className="flex items-center gap-3 text-ember"><ShieldCheck size={20} /><span className="text-xs font-semibold uppercase tracking-[0.16em]">Korunan sistem hesabı</span></div>
                <h2 className="mt-4 text-2xl font-semibold text-fg-primary">{selected.displayName}</h2>
                <p className="mt-2 text-sm leading-6 text-fg-secondary">Bu hesap bütün modül ve işlemlere sahiptir. Panelden kapatılamaz, silinemez, yetkisi düşürülemez veya parolası başka bir kullanıcı tarafından sıfırlanamaz.</p>
              </div>
              <div className="grid gap-3 sm:grid-cols-2">
                <div className="rounded-2xl border border-border p-4"><p className="text-[10px] uppercase tracking-wider text-fg-muted">Kullanıcı</p><p className="mt-2 text-sm text-fg-primary">@{selected.username}</p></div>
                <div className="rounded-2xl border border-border p-4"><p className="text-[10px] uppercase tracking-wider text-fg-muted">Açık oturum</p><p className="mt-2 text-sm text-fg-primary">{selected.sessions.length}</p></div>
              </div>
              <Link href="/admin/account/password" className="inline-flex items-center gap-2 rounded-full border border-border px-5 py-3 text-xs text-fg-secondary"><KeyRound size={14} /> Kendi parolamı değiştir</Link>
            </div>
          ) : selected ? (
            <div className="space-y-8">
              <form action={updateAdminUserAction} className="space-y-6">
                <input type="hidden" name="id" value={selected.id} />
                <div className="grid gap-4 md:grid-cols-2">
                  <label className="space-y-2"><span className="text-[10px] uppercase tracking-wider text-fg-muted">Kullanıcı adı</span><input value={selected.username} disabled className="w-full rounded-2xl border border-border bg-white/[0.02] px-4 py-3 text-sm text-fg-muted" /></label>
                  <label className="space-y-2"><span className="text-[10px] uppercase tracking-wider text-fg-muted">Görünen ad</span><input name="displayName" defaultValue={selected.displayName} required maxLength={120} className="w-full rounded-2xl border border-border bg-white/[0.035] px-4 py-3 text-sm outline-none focus:border-ember/50" /></label>
                </div>
                <label className="block space-y-2"><span className="text-[10px] uppercase tracking-wider text-fg-muted">Hesap durumu</span><select name="status" defaultValue={selected.status} className="w-full rounded-2xl border border-border bg-surface-0 px-4 py-3 text-sm"><option value="active">Aktif</option><option value="disabled">Kapalı</option></select></label>
                <PermissionMatrix permissions={selected.permissions} />
                <button type="submit" className="rounded-full bg-ember px-6 py-3 text-xs font-semibold uppercase tracking-[0.14em] text-surface-0">Hesabı ve yetkileri güncelle</button>
              </form>

              <div className="grid gap-5 border-t border-border pt-7 lg:grid-cols-2">
                <form action={resetAdminUserPasswordAction} className="space-y-3 rounded-2xl border border-border p-4">
                  <input type="hidden" name="id" value={selected.id} />
                  <p className="text-sm font-semibold text-fg-primary">Geçici parola belirle</p>
                  <p className="text-xs leading-5 text-fg-muted">Açık oturumlar kapanır; kullanıcı ilk girişte parolasını değiştirir.</p>
                  <input name="password" type="password" required minLength={12} maxLength={72} autoComplete="new-password" placeholder="Güçlü geçici parola" className="w-full rounded-2xl border border-border bg-white/[0.035] px-4 py-3 text-sm outline-none focus:border-ember/50" />
                  <p className="text-xs leading-5 text-fg-muted">En az 12 karakter; büyük-küçük harf, sayı ve özel karakter; en fazla 72 UTF-8 baytı.</p>
                  <button type="submit" className="rounded-full border border-ember/35 px-4 py-2.5 text-[10px] font-semibold uppercase tracking-wider text-ember">Parolayı sıfırla</button>
                </form>
                <form action={revokeAdminUserSessionsAction} className="space-y-3 rounded-2xl border border-border p-4">
                  <input type="hidden" name="id" value={selected.id} />
                  <p className="text-sm font-semibold text-fg-primary">Oturumları kapat</p>
                  <p className="text-xs leading-5 text-fg-muted">{selected.sessions.length} açık oturum bir sonraki istekte geçersiz olur.</p>
                  <button type="submit" className="rounded-full border border-red-500/25 px-4 py-2.5 text-[10px] font-semibold uppercase tracking-wider text-red-300">Tüm oturumları kapat</button>
                </form>
              </div>
            </div>
          ) : (
            <form action={createAdminUserAction} className="space-y-6">
              <div>
                <p className="text-[10px] font-semibold uppercase tracking-[0.18em] text-ember">Yeni sınırlı hesap</p>
                <h2 className="mt-2 text-2xl font-semibold text-fg-primary">Kullanıcı oluştur</h2>
                <p className="mt-2 text-sm leading-6 text-fg-secondary">Kullanıcıya sadece görevinde ihtiyaç duyduğu modül ve işlemleri verin.</p>
              </div>
              <div className="grid gap-4 md:grid-cols-2">
                <label className="space-y-2"><span className="text-[10px] uppercase tracking-wider text-fg-muted">Kullanıcı adı</span><input name="username" required minLength={3} maxLength={40} pattern="[a-z0-9._-]+" placeholder="ornek.kullanici" className="w-full rounded-2xl border border-border bg-white/[0.035] px-4 py-3 text-sm outline-none focus:border-ember/50" /></label>
                <label className="space-y-2"><span className="text-[10px] uppercase tracking-wider text-fg-muted">Görünen ad</span><input name="displayName" required maxLength={120} placeholder="Ad Soyad" className="w-full rounded-2xl border border-border bg-white/[0.035] px-4 py-3 text-sm outline-none focus:border-ember/50" /></label>
              </div>
              <label className="block space-y-2"><span className="text-[10px] uppercase tracking-wider text-fg-muted">Geçici parola</span><input name="password" type="password" required minLength={12} maxLength={72} autoComplete="new-password" className="w-full rounded-2xl border border-border bg-white/[0.035] px-4 py-3 text-sm outline-none focus:border-ember/50" /><span className="block text-xs leading-5 text-fg-muted">En az 12 karakter; büyük-küçük harf, sayı ve özel karakter; en fazla 72 UTF-8 baytı.</span></label>
              <PermissionMatrix />
              <button type="submit" className="rounded-full bg-ember px-6 py-3 text-xs font-semibold uppercase tracking-[0.14em] text-surface-0">Hesabı oluştur</button>
            </form>
          )}
        </div>
      </div>
    </AdminShell>
  );
}
