import { cookies } from 'next/headers';
import { notFound, redirect } from 'next/navigation';
import { SignJWT, jwtVerify } from 'jose';
import bcrypt from 'bcryptjs';
import { prisma } from './db';

const COOKIE = 'ps_session';
const key = () => new TextEncoder().encode(process.env.AUTH_SECRET || 'dev-only-change-me-dev-only-change-me');

export async function hashPassword(p: string) { return bcrypt.hash(p, 11); }
export async function verifyPassword(p: string, h: string) { return bcrypt.compare(p, h); }

export async function createSession(userId: string, ver = 0) {
  const token = await new SignJWT({ sub: userId, v: ver }).setProtectedHeader({ alg: 'HS256' }).setIssuedAt().setExpirationTime('30d').sign(key());
  (await cookies()).set(COOKIE, token, { httpOnly: true, sameSite: 'lax', secure: process.env.NODE_ENV === 'production', path: '/', maxAge: 60 * 60 * 24 * 30 });
}
export async function destroySession() { (await cookies()).delete(COOKIE); }

export async function verifyToken(token?: string) {
  if (!token) return null;
  try { const { payload } = await jwtVerify(token, key()); return payload.sub ? { id: payload.sub as string, v: Number(payload.v ?? 0) } : null; } catch { return null; }
}

export async function currentUser() {
  const t = await verifyToken((await cookies()).get(COOKIE)?.value);
  if (!t) return null;
  const u = await prisma.user.findUnique({ where: { id: t.id } });
  // şifre değişince sessionVersion artar → eski oturumlar düşer; askıya alınmış hesap oturum açamaz
  return u && u.sessionVersion === t.v && !u.disabledAt ? u : null;
}
export async function requireUser() {
  const u = await currentUser();
  if (!u) redirect('/giris');
  return u;
}
export async function requireAdmin() {
  const u = await requireUser();
  if (u.role !== 'ADMIN') redirect('/panel');
  return u;
}
/** Gizli yönetim yolu: yönetici değilse sayfa hiç yokmuş gibi 404 (giriş sayfasına yönlendirme adresin varlığını ele verir). */
export async function requireAdminOr404() {
  const u = await currentUser();
  if (!u || u.role !== 'ADMIN') notFound();
  return u;
}
export const SESSION_COOKIE = COOKIE;
