import type { Prisma, User } from '@prisma/client';
import { prisma } from './db';

/** Yönetici işlemini günlüğe yazar. Günlük yazılamazsa işlem geri alınmaz; hata loglanır. */
export async function audit(admin: Pick<User, 'id' | 'email'>, action: string, targetType: string, targetId: string | null, detail?: Prisma.InputJsonValue, tx: Prisma.TransactionClient = prisma) {
  await tx.adminLog.create({ data: { adminId: admin.id, adminEmail: admin.email, action, targetType, targetId, detail } });
}

/** Günlükteki işlem kodlarının Türkçe karşılığı */
export const ACTION_TR: Record<string, string> = {
  'order.rerender': 'Siparişi yeniden üretime aldı', 'order.cancel': 'Siparişi iptal etti', 'order.release': 'Harici sahipliği bıraktı', 'order.share_off': 'Paylaşım bağlantısını kapattı',
  'user.credits': 'Kredi düzenledi', 'user.verify': 'E-postayı doğrulanmış işaretledi', 'user.send_verify': 'Doğrulama e-postası gönderdi', 'user.send_reset': 'Şifre sıfırlama e-postası gönderdi',
  'user.logout': 'Tüm oturumları kapattı', 'user.role': 'Rolü değiştirdi', 'user.suspend': 'Hesabı askıya aldı', 'user.unsuspend': 'Askıyı kaldırdı', 'job.retry': 'Ölü işi yeniden denedi',
};

export const PAY_TR: Record<string, string> = { pending: 'Bekliyor', succeeded: 'Alındı', failed: 'Başarısız', refunded: 'İade' };

export const TZ = 'Europe/Istanbul';
export const dt = (d?: Date | null) => (d ? d.toLocaleString('tr-TR', { day: '2-digit', month: '2-digit', year: '2-digit', hour: '2-digit', minute: '2-digit', timeZone: TZ }) : '—');
export const day = (d: Date) => d.toLocaleDateString('tr-TR', { day: '2-digit', month: '2-digit', timeZone: TZ });
export const tryFmt = (kurus: number, currency = 'TRY') => (kurus / 100).toLocaleString('tr-TR', { style: 'currency', currency, maximumFractionDigits: 0 });
export const n = (x: number) => x.toLocaleString('tr-TR');
export const pct = (a: number, b: number) => (b ? `%${Math.round((a / b) * 100)}` : '—');
export function dur(ms: number) {
  if (!Number.isFinite(ms) || ms <= 0) return '—';
  const m = Math.round(ms / 60000);
  return m < 60 ? `${m} dk` : m < 1440 ? `${Math.floor(m / 60)} sa ${m % 60} dk` : `${Math.floor(m / 1440)} gün`;
}

/** Dönem seçici: ?d=1|7|30|90|0 (0 = tümü) */
export const PERIODS: [string, string][] = [['1', 'Bugün'], ['7', '7 gün'], ['30', '30 gün'], ['90', '90 gün'], ['0', 'Tümü']];
export function since(d: string | undefined) {
  const k = Number(d ?? 30);
  if (!k) return null;
  // bugün = İstanbul gece yarısından beri (Türkiye 2016'dan beri sabit UTC+3)
  if (k === 1) { const p = new Date(Date.now() + 3 * 3600_000); return new Date(Date.UTC(p.getUTCFullYear(), p.getUTCMonth(), p.getUTCDate()) - 3 * 3600_000); }
  return new Date(Date.now() - k * 86400_000);
}

export const PAGE = 50;
export const page = (p?: string) => Math.max(1, Math.min(10_000, Number(p) || 1));
/** Mevcut sorgu parametrelerini koruyarak bağlantı üretir */
export function href(base: string, params: Record<string, string | undefined>, patch: Record<string, string | number | undefined>) {
  const q = new URLSearchParams();
  for (const [k, v] of Object.entries({ ...params, ...patch })) if (v !== undefined && v !== '' && v !== null) q.set(k, String(v));
  const s = q.toString();
  return s ? `${base}?${s}` : base;
}
