import { redirect } from "next/navigation";
import { isAdminSession, hasPermission, getAllPermissions } from "@/lib/adminAuth";
import { getSettings } from "@/lib/settings";
import { AdminNavLinks } from "@/components/admin/AdminNavLinks";
import { AdminPageHeader } from "@/components/admin/AdminPageHeader";
import { InvoiceSettingsForm } from "@/components/admin/InvoiceSettingsForm";
import { PaymentSettingsPanel } from "@/components/admin/PaymentSettingsPanel";
import { BannerSettingsPanel } from "@/components/admin/BannerSettingsPanel";
import { VoucherPurchaseSettingsPanel } from "@/components/admin/VoucherPurchaseSettingsPanel";
import { MaintenanceSettingsPanel } from "@/components/admin/MaintenanceSettingsPanel";
import { ReferralSettingsPanel } from "@/components/admin/ReferralSettingsPanel";
import { ReengagementSettingsPanel } from "@/components/admin/ReengagementSettingsPanel";
import { PreshootReminderSettingsPanel } from "@/components/admin/PreshootReminderSettingsPanel";
import { WeatherCheckSettingsPanel } from "@/components/admin/WeatherCheckSettingsPanel";
import { ReviewRewardSettingsPanel } from "@/components/admin/ReviewRewardSettingsPanel";
import { LoyaltySettingsPanel } from "@/components/admin/LoyaltySettingsPanel";
import { FeedbackRequestSettingsPanel } from "@/components/admin/FeedbackRequestSettingsPanel";
import { GoogleReviewSettingsPanel } from "@/components/admin/GoogleReviewSettingsPanel";
import { TaxReserveSettingsPanel } from "@/components/admin/TaxReserveSettingsPanel";
import { MileageSettingsPanel } from "@/components/admin/MileageSettingsPanel";
import { ReminderEscalationSettingsPanel } from "@/components/admin/ReminderEscalationSettingsPanel";
import { BookingSettingsPanel } from "@/components/admin/BookingSettingsPanel";
import { GoogleSyncSettingsPanel } from "@/components/admin/GoogleSyncSettingsPanel";
import { BackupStatusPanel } from "@/components/admin/BackupStatusPanel";
import { LegalTextSettingsPanel } from "@/components/admin/LegalTextSettingsPanel";
import { SocialLinksForm } from "@/components/admin/SocialLinksForm";
import { ActiveStatePanel, type ActiveStateRow } from "@/components/admin/ActiveStatePanel";
import { isStripeConfigured } from "@/lib/stripe";
import { connectDB } from "@/lib/db";
import { DiscountCode } from "@/models/DiscountCode";

export const dynamic = "force-dynamic";

export default async function AdminSettingsPage() {
  if (!(await isAdminSession())) redirect("/de/login?next=%2Fde%2Fadmin%2Forders");

  if (!(await hasPermission("settings"))) redirect("/de/account");

  const permissions = await getAllPermissions();

  const settings = await getSettings();

  await connectDB();
  const activeDiscountCount = await DiscountCode.countDocuments({
    active: true,
    $or: [{ validUntil: null }, { validUntil: { $gte: new Date() } }],
  });

  const stripeConfigured = isStripeConfigured();
  const paymentOn = Boolean(settings.paymentSettings?.enabled);
  const bannerOn = Boolean(settings.bannerSettings?.enabled);
  const bannerText = settings.bannerSettings?.text?.trim() || "";
  const activeRows: ActiveStateRow[] = [
    {
      label: "Wartungsmodus",
      value: settings.maintenanceMode?.enabled ? "An — Seite gesperrt" : "Aus",
      tone: settings.maintenanceMode?.enabled ? "warn" : "off",
    },
    {
      label: "Hinweis-Banner",
      value: bannerOn ? (bannerText ? `An · „${bannerText.slice(0, 48)}“` : "An") : "Aus",
      tone: bannerOn ? "on" : "off",
    },
    {
      label: "Direktes Bezahlen (Stripe)",
      value: paymentOn ? (stripeConfigured ? "An" : "An — Stripe nicht eingerichtet") : "Aus",
      tone: paymentOn ? (stripeConfigured ? "on" : "warn") : "off",
    },
    {
      label: "Gutschein-Käufe",
      value: settings.voucherSettings?.enabled !== false ? "An" : "Aus",
      tone: settings.voucherSettings?.enabled !== false ? "on" : "off",
    },
    {
      label: "Aktive Rabattcodes",
      value: `${activeDiscountCount}`,
      tone: activeDiscountCount > 0 ? "on" : "off",
      href: "/de/admin/discounts",
    },
  ];

  return (
    <main className="px-6 pt-4 pb-24 max-w-5xl mx-auto">
      <AdminNavLinks permissions={permissions} />
      <AdminPageHeader
        title="Einstellungen"
        subtitle="Diese Angaben werden auf jeder erstellten Rechnung verwendet — bitte vor der ersten Rechnungsstellung vollständig ausfüllen."
      />
      <ActiveStatePanel rows={activeRows} />
      <MaintenanceSettingsPanel maintenanceMode={settings.maintenanceMode} />
      <BannerSettingsPanel bannerSettings={settings.bannerSettings} />
      <VoucherPurchaseSettingsPanel enabled={settings.voucherSettings?.enabled !== false} />
      <ReferralSettingsPanel referralSettings={settings.referralSettings} />
      <ReengagementSettingsPanel reengagementSettings={settings.reengagementSettings} />
      <PreshootReminderSettingsPanel preshootReminderSettings={settings.preshootReminderSettings} />
      <WeatherCheckSettingsPanel weatherCheckSettings={settings.weatherCheckSettings} />
      <ReviewRewardSettingsPanel reviewRewardSettings={settings.reviewRewardSettings} />
      <LoyaltySettingsPanel loyaltySettings={settings.loyaltySettings} />
      <FeedbackRequestSettingsPanel feedbackRequestSettings={settings.feedbackRequestSettings} />
      <GoogleReviewSettingsPanel googleReviewSettings={settings.googleReviewSettings} />
      <TaxReserveSettingsPanel taxReserveSettings={settings.taxReserveSettings} />
      <MileageSettingsPanel mileageSettings={settings.mileageSettings} />
      <ReminderEscalationSettingsPanel reminderEscalationSettings={settings.reminderEscalationSettings} />
      <BookingSettingsPanel bookingSettings={settings.bookingSettings} />
      <GoogleSyncSettingsPanel googleSyncSettings={settings.googleSyncSettings} />
      <BackupStatusPanel lastBackupAt={settings.lastBackupAt ? new Date(settings.lastBackupAt).toISOString() : null} />
      <SocialLinksForm socialLinks={settings.socialLinks} />
      <LegalTextSettingsPanel legal={settings.legal} />
      <PaymentSettingsPanel enabled={settings.paymentSettings?.enabled ?? false} configured={isStripeConfigured()} />
      <InvoiceSettingsForm invoiceSettings={settings.invoiceSettings} />
    </main>
  );
}
