import { NextResponse } from "next/server";
import { db } from "@/db";
import { siteSettings } from "@/db/schema";
import { isSettingEnabled } from "@/lib/auth";
import { getSiteContactSettings, saveSiteContactSettings } from "@/lib/site-settings";
import { z } from "zod";
import { adminAuthorized } from "@/lib/admin-auth";
import { recordAudit } from "@/lib/audit";

export async function GET(request: Request) {
  if (!(await adminAuthorized(request))) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  return NextResponse.json({
    authEnabled: await isSettingEnabled("auth_enabled"),
    authVkEnabled: await isSettingEnabled("auth_vk_enabled"),
    authYandexEnabled: await isSettingEnabled("auth_yandex_enabled"),
    authTelegramEnabled: await isSettingEnabled("auth_telegram_enabled"),
    authMaxEnabled: await isSettingEnabled("auth_max_enabled"),
    ordersEnabled: await isSettingEnabled("orders_enabled"),
    ordersPickupEnabled: await isSettingEnabled("orders_pickup_enabled"),
    ordersDeferredEnabled: await isSettingEnabled("orders_deferred_enabled"),
    ...(await getSiteContactSettings())
  });
}

const SETTING_KEYS = [["auth_enabled", "authEnabled"], ["auth_vk_enabled", "authVkEnabled"], ["auth_yandex_enabled", "authYandexEnabled"], ["auth_telegram_enabled", "authTelegramEnabled"], ["auth_max_enabled", "authMaxEnabled"], ["orders_enabled", "ordersEnabled"], ["orders_pickup_enabled", "ordersPickupEnabled"], ["orders_deferred_enabled", "ordersDeferredEnabled"]] as const;

export async function PATCH(request: Request) {
  if (!(await adminAuthorized(request, true))) return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  if (!db) return NextResponse.json({ error: "Database is not configured" }, { status: 503 });
  const body = await request.json() as Record<string, unknown>;
  const contact = z.object({ address: z.string().trim().min(3).max(300), phone: z.string().trim().min(10).max(32).regex(/^[0-9+()\-\s]+$/) }).safeParse(body);
  if (contact.success) await saveSiteContactSettings(contact.data);
  const changed: Record<string, boolean> = {};
  for (const [key, field] of SETTING_KEYS) {
    const value = body[field];
    if (typeof value === "boolean") {
      await db.insert(siteSettings).values({ key, value, updatedAt: new Date() }).onConflictDoUpdate({ target: siteSettings.key, set: { value, updatedAt: new Date() } });
      changed[key] = value;
    }
  }
  if (Object.keys(changed).length) await recordAudit("settings_update", { details: changed });
  if (!contact.success && ("address" in body || "phone" in body)) return NextResponse.json({ error: "Проверьте адрес и телефон" }, { status: 400 });
  return NextResponse.json({ ok: true });
}
