/**
 * Dealer Preview Page
 *
 * Allows dealers to preview their site before publishing.
 * This page is only accessible to authenticated dealers and shows
 * a preview of what their public site will look like once published.
 */

import { redirect } from 'next/navigation';
import { getServerSession } from 'next-auth';
import { authOptions } from '@/lib/auth';
import { prisma } from '@/lib/prisma';
import { DealerTemplateClient } from '@/components/DealerTemplateClient';
import { PreviewPublishButton } from '@/components/PreviewPublishButton';
import { DealerInfo, NavigationLink, QuickLink } from '@/types/dealer';
import { getDealerDisplayName } from '@/lib/dealer-display-name';
import { LeadFormSettings, DEFAULT_LEAD_FORM_SETTINGS } from '@/types/lead-form';
import { hasLeadFormAccess } from '@/lib/cms/types';
import { getLanguageFromCookie } from '@/lib/get-language-cookie';
import '@/app/dealer-template.css';
import styles from './preview.module.css';

/**
 * Get page path from page data
 */
function getPagePath(page: { slug: string; type: string }): string {
  return page.type === 'blog' ? `/blog/${page.slug}` : `/${page.slug}`;
}

/**
 * Transform Prisma dealer data to DealerInfo format
 */
function transformToTemplateProps(
  dealer: {
    subdomain: string | null;
    domain: string;
    amsoilLinkDomain: string | null;
    businessName: string | null;
    contactName: string | null;
    phone: string;
    address: string;
    city: string;
    state: string;
    zip: string;
    country: string;
    description: string | null;
    heroSlider: unknown;
    hideAddress: boolean;
    showContactName: boolean;
    logoUrl: string | null;
    preferredLanguage: string;
    allowLanguageSwitch: boolean;
    user: { email: string } | null;
  },
  navigation: NavigationLink[],
  quickLinks: QuickLink[]
): DealerInfo {
  return {
    subdomain: dealer.subdomain || '',
    domain: dealer.domain as 'com' | 'ca',
    amsoilLinkDomain:
      dealer.amsoilLinkDomain === 'com' || dealer.amsoilLinkDomain === 'ca'
        ? (dealer.amsoilLinkDomain as 'com' | 'ca')
        : null,
    name: getDealerDisplayName(dealer),
    phone: dealer.phone,
    email: dealer.user?.email || '',
    address: {
      city: dealer.city,
      state: dealer.state,
      zip: dealer.zip,
      street: dealer.address,
      country: dealer.country,
    },
    navigation,
    description: dealer.description || undefined,
    heroSlider: dealer.heroSlider as DealerInfo['heroSlider'],
    quickLinks,
    hideAddress: dealer.hideAddress,
    contactName: dealer.contactName || undefined,
    showContactName: dealer.showContactName,
    logoUrl: dealer.logoUrl || undefined,
    preferredLanguage: (dealer.preferredLanguage as 'en' | 'es' | 'fr') || 'en',
    allowLanguageSwitch: dealer.allowLanguageSwitch,
  };
}

export default async function PreviewPage() {
  // Get the authenticated session
  const session = await getServerSession(authOptions);

  if (!session?.user?.id) {
    redirect('/api/auth/signin');
  }

  // Fetch the dealer for this user (regardless of status)
  const dealer = await prisma.dealer.findFirst({
    where: { userId: session.user.id },
    select: {
      id: true,
      subdomain: true,
      domain: true,
      amsoilLinkDomain: true,
      dealerNumber: true,
      businessName: true,
      contactName: true,
      phone: true,
      address: true,
      city: true,
      state: true,
      zip: true,
      country: true,
      description: true,
      heroSlider: true,
      hideAddress: true,
      showContactName: true,
      logoUrl: true,
      preferredLanguage: true,
      allowLanguageSwitch: true,
      settings: true,
      subscriptionTier: true,
      status: true,
      user: {
        select: { email: true },
      },
    },
  });

  // Return error if no dealer found
  if (!dealer) {
    return (
      <div className={styles.errorContainer}>
        <h1>No Dealer Account Found</h1>
        <p>You don&apos;t have a dealer account yet. Please complete the registration process.</p>
        <a href="/dashboard" className={styles.backLink}>
          Return to Dashboard
        </a>
      </div>
    );
  }

  // Fetch navigation items for this dealer
  const navigationItems = await prisma.navigationItem.findMany({
    where: { dealerId: dealer.id },
    orderBy: { sortOrder: 'asc' },
    include: {
      page: { select: { slug: true, type: true } },
      children: {
        orderBy: { sortOrder: 'asc' },
        include: {
          page: { select: { slug: true, type: true } },
        },
      },
    },
  });

  // Transform navigation items to links (only top-level items without parentId)
  const navigation: NavigationLink[] = navigationItems
    .filter((item) => !item.parentId)
    .map((item) => ({
      label: item.label,
      href: item.externalUrl || (item.page ? getPagePath(item.page) : null),
      openInNewTab: item.openInNewTab,
      children: item.children?.map((child) => ({
        label: child.label,
        href: child.externalUrl || (child.page ? getPagePath(child.page) : null),
        openInNewTab: child.openInNewTab,
      })),
    }));

  // Fetch quick links for this dealer
  const quickLinks = await prisma.dealerLink.findMany({
    where: { dealerId: dealer.id },
    orderBy: { sortOrder: 'asc' },
    include: {
      page: { select: { slug: true, type: true } },
    },
  });

  // Transform quick links (filter out broken links where page was deleted)
  const transformedQuickLinks: QuickLink[] = quickLinks
    .map((link) => {
      const href = link.externalUrl || (link.page ? getPagePath(link.page) : null);
      if (!href) return null;
      return {
        label: link.label,
        href,
        openInNewTab: link.openInNewTab,
      };
    })
    .filter((link): link is QuickLink => link !== null);

  // Transform data and render template
  const dealerInfo = transformToTemplateProps(dealer, navigation, transformedQuickLinks);

  // Determine if lead form should be enabled
  const hasTierAccess = hasLeadFormAccess(dealer.subscriptionTier);
  const settingsObj = dealer.settings as { leadFormSettings?: Partial<LeadFormSettings> } | null;
  const leadFormSettings: LeadFormSettings = {
    ...DEFAULT_LEAD_FORM_SETTINGS,
    ...(settingsObj?.leadFormSettings || {}),
  };
  const leadFormEnabled = hasTierAccess && leadFormSettings.leadFormEnabled;

  const isUnpublished = dealer.status !== 'active';

  // Get language from cookie, falling back to dealer's preferred language
  const dealerPreferredLanguage = (dealer.preferredLanguage as 'en' | 'es' | 'fr') || 'en';
  const defaultLanguage = await getLanguageFromCookie(
    dealer.subdomain || '',
    dealerPreferredLanguage
  );

  return (
    <div className={styles.previewContainer}>
      {/* Preview Banner */}
      {isUnpublished && (
        <div className={styles.previewBanner}>
          <div className={styles.previewBannerContent}>
            <span className={styles.previewBadge}>PREVIEW MODE</span>
            <span className={styles.previewText}>
              This is a preview of your site. Click &quot;Publish&quot; to make it live.
            </span>
            <PreviewPublishButton dealerId={dealer.id} />
            <a href="/dashboard" className={styles.backToDashboard}>
              Back to Dashboard
            </a>
          </div>
        </div>
      )}

      {/* Dealer Template */}
      <DealerTemplateClient
        dealer={dealerInfo}
        dealerNumber={dealer.dealerNumber || undefined}
        leadFormEnabled={leadFormEnabled}
        defaultLanguage={defaultLanguage}
        allowLanguageSwitch={dealer.allowLanguageSwitch}
      />
    </div>
  );
}
