import type { Metadata, Viewport } from 'next';
import { Inter, Outfit } from 'next/font/google';
import { headers } from 'next/headers';
import { createHash } from 'node:crypto';
import { readFileSync } from 'node:fs';
import { join } from 'node:path';
import './globals.css';
import SessionProvider from './components/SessionProvider';
import { ToastProvider } from './components/ToastProvider';
import AppErrorBoundary from './components/AppErrorBoundary';
import { config } from '@/lib/config';
import { getTelegramBotUrlOptional } from '@/lib/telegram';
import { getServerConfig } from '@/lib/server-config';
import { escapeInlineScriptJson } from '@/lib/security/csp';

// Cache-bust для favicon: хэш содержимого public/icon.png. Браузер перезапрашивает
// иконку, как только файл меняется, без ручного сброса кеша.
const ICON_VERSION = (() => {
  try {
    const bytes = readFileSync(join(process.cwd(), 'public', 'icon.png'));
    return createHash('sha1').update(bytes).digest('hex').slice(0, 10);
  } catch {
    return 'static';
  }
})();
const ICON_URL = `/icon.png?v=${ICON_VERSION}`;

export const dynamic = 'force-dynamic';
export const revalidate = 0;

const inter = Inter({
  subsets: ['cyrillic', 'latin'],
  variable: '--font-inter',
  display: 'swap',
});

const outfit = Outfit({
  subsets: ['latin', 'latin-ext'],
  variable: '--font-outfit',
  display: 'swap',
});

function buildSharedDescription(projectName: string) {
  return `${projectName} превращает длинные URL в инструмент роста. Аналитика в реальном времени, умные редиректы и полный контроль над каждым кликом.`;
}

export async function generateMetadata(): Promise<Metadata> {
  const serverConfig = await getServerConfig();
  const projectName = serverConfig.branding.projectName;
  const sharedDescription = buildSharedDescription(projectName);
  const heleketDomainMeta = process.env.HELEKET_DOMAIN_META?.trim() || null;

  return {
    title: `${projectName} - ${config.tagline}`,
    description: sharedDescription,
    keywords: ['сокращение ссылок', 'аналитика', 'редиректы', 'URL shortener', 'трекинг'],
    authors: [{ name: projectName }],
    creator: projectName,
    publisher: projectName,
    icons: {
      icon: {
        url: ICON_URL,
        type: 'image/png',
      },
      apple: {
        url: ICON_URL,
        type: 'image/png',
      },
    },
    robots: {
      index: true,
      follow: true,
    },
    openGraph: {
      type: 'website',
      locale: 'ru_RU',
      url: config.baseUrl,
      title: `${projectName} - ${config.tagline}`,
      description: sharedDescription,
      siteName: projectName,
    },
    twitter: {
      card: 'summary_large_image',
      title: `${projectName} - ${config.tagline}`,
      description: sharedDescription,
    },
    other: heleketDomainMeta
      ? { heleket: heleketDomainMeta }
      : undefined,
  };
}

export const viewport: Viewport = {
  themeColor: '#3B82F6',
  width: 'device-width',
  initialScale: 1,
};

export default async function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  const serverConfig = await getServerConfig();
  const nonce = (await headers()).get('x-csp-nonce') || undefined;
  const runtimeConfigScript = `window.__APP_CONFIG__=${escapeInlineScriptJson({
    projectName: serverConfig.branding.projectName,
    baseUrl: config.baseUrl,
    domain: config.domain,
    analyticsDebugVisibilityEnabled: serverConfig.analytics.debugVisibilityEnabled,
    telegramBotUrl: getTelegramBotUrlOptional(),
    timeZone: serverConfig.time.timeZone,
    supportEmail: serverConfig.branding.supportEmail,
    supportTelegramUsername: serverConfig.branding.supportTelegramUsername,
  })};`;

  return (
    <html lang="ru" className={`${inter.variable} ${outfit.variable}`}>
      <body className="antialiased min-h-screen bg-black">
        <script nonce={nonce} dangerouslySetInnerHTML={{ __html: runtimeConfigScript }} />
        <SessionProvider>
          <ToastProvider>
            <AppErrorBoundary>
              {children}
            </AppErrorBoundary>
          </ToastProvider>
        </SessionProvider>
      </body>
    </html>
  );
}
