import { Suspense } from 'react';
import { redirect } from 'next/navigation';
import { getServerSession } from '@/lib/auth/getServerSession';
import { PERMISSIONS } from '@/lib/permissions/permissions';
import AccessDenied from '@/components/admin/errors/AccessDenied';
import CouponForm from '@/components/admin/coupons/CouponForm';
import { CouponFormSkeleton } from '@/components/admin/coupons/CouponSkeleton';
import { cookies } from 'next/headers';
import { SESSION_COOKIE } from '@/lib/auth/requireAuth';
import { Metadata } from 'next';

export const metadata: Metadata = {
  title: 'Add New Coupon',
};

// ─── Data Fetchers ──────────────────────────────────────────────────────────
async function getCategoriesAndProducts(sessionToken: string) {
  try {
    const baseUrl = process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3000';
    const [categoriesRes, productsRes] = await Promise.all([
      fetch(`${baseUrl}/api/coupons/items/categories`, {
        cache: 'no-store',
        headers: { Authorization: `Bearer ${sessionToken}` },
      }),
      fetch(`${baseUrl}/api/coupons/items/products`, {
        cache: 'no-store',
        headers: { Authorization: `Bearer ${sessionToken}` },
      }),
    ]);

    const categories = categoriesRes.ok ? (await categoriesRes.json()).data || [] : [];
    const products = productsRes.ok ? (await productsRes.json()).data || [] : [];

    return { categories, products };
  } catch (error) {
    console.error('Failed to fetch items:', error);
    return { categories: [], products: [] };
  }
}

async function getLanguages(sessionToken: string) {
  try {
    const baseUrl = process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3000';
    const res = await fetch(`${baseUrl}/api/getlanguages`, {
      cache: 'no-store',
      headers: { Authorization: `Bearer ${sessionToken}` },
    });
    if (!res.ok) return [];
    const data = await res.json();
    return data.data || [];
  } catch (error) {
    console.error('Failed to fetch languages:', error);
    return [];
  }
}

// ─── Page Content ───────────────────────────────────────────────────────────
async function NewCouponContent() {
  const cookieStore = await cookies();
  const sessionId = cookieStore.get(SESSION_COOKIE)?.value;
  if (!sessionId) redirect('/admin/login');

  const session = await getServerSession();
  if (!session) redirect('/admin/login');

  if (!session.permissions.includes(PERMISSIONS.COUPONS_CREATE)) {
    return <AccessDenied />;
  }

  const [{ categories, products }, languages] = await Promise.all([
    getCategoriesAndProducts(sessionId),
    getLanguages(sessionId),
  ]);

  return (
    <>
      <div className="mb-6">
        <h1 className="text-2xl font-semibold" style={{ color: 'var(--color-text)' }}>
          Create Coupon
        </h1>
        <p className="text-sm mt-1" style={{ color: 'var(--color-text-secondary)' }}>
          Create a new discount coupon code
        </p>
      </div>

      <CouponForm
        mode="create"
        initialData={null}
        categories={categories}
        products={products}
        languages={languages}
      />
    </>
  );
}

export default async function NewCouponPage() {
  return (
    <div className="sm:p-6">
      <Suspense fallback={<CouponFormSkeleton />}>
        <NewCouponContent />
      </Suspense>
    </div>
  );
}