import type { Metadata } from 'next';
import { Noto_Sans_JP } from 'next/font/google';
import { Analytics } from '@vercel/analytics/react';
import { Header } from '@/components/layout/Header';
import { Footer } from '@/components/layout/Footer';
import { getAllCategories } from '@/lib/utils/db';
import { getHomepageContent } from '@/lib/homepage-content';
import { getNavigationItems, buildNavigationTree } from '@/lib/navigation';
import './globals.css';

export const dynamic = 'force-dynamic';

const notoSansJP = Noto_Sans_JP({
  subsets: ['latin'],
  weight: ['400', '500', '600'],
  variable: '--font-noto-sans-jp',
  display: 'swap',
});

const defaultMetadata: Metadata = {
  metadataBase: new URL('https://ten-sura-game.com'),
  title: {
    default: 'ten-sura-game.com（転スラゲーム攻略）| 日本のゲーム攻略メディア',
    template: '%s | ten-sura-game.com',
  },
  description: 'ストーリー攻略、ボス攻略、高難易度攻略、編成・スキル解説、初心者ガイドなど、転生したらスライムだった件のゲーム攻略情報を分かりやすく解説する攻略メディア。',
  keywords: ['ten-sura-game.com', '転スラゲーム攻略', '転生したらスライムだった件', '転スラ', 'ストーリー攻略', 'ボス攻略', '高難易度攻略', '編成・スキル解説', '初心者ガイド', 'ゲーム攻略', '攻略情報'],
  authors: [{ name: 'ten-sura-game.com編集部' }],
  creator: 'ten-sura-game.com編集部',
  publisher: 'ten-sura-game.com',
  icons: {
    icon: '/favicon.png',
    shortcut: '/favicon.png',
    apple: '/favicon.png',
  },
  alternates: {
    canonical: 'https://ten-sura-game.com',
  },
  openGraph: {
    title: 'ten-sura-game.com（転スラゲーム攻略）| 日本のゲーム攻略メディア',
    description: 'ストーリー攻略、ボス攻略、高難易度攻略、編成・スキル解説、初心者ガイドなど、転生したらスライムだった件のゲーム攻略情報を分かりやすく解説する攻略メディア。',
    url: 'https://ten-sura-game.com',
    siteName: 'ten-sura-game.com',
    locale: 'ja_JP',
    type: 'website',
    images: [
      {
        url: '/og-image.jpg',
        width: 1200,
        height: 630,
        alt: 'ten-sura-game.com',
      },
    ],
  },
  twitter: {
    card: 'summary_large_image',
    title: 'ten-sura-game.com（転スラゲーム攻略）| 日本のゲーム攻略メディア',
    description: 'ストーリー攻略、ボス攻略、高難易度攻略、編成・スキル解説、初心者ガイドなど、転生したらスライムだった件のゲーム攻略情報を分かりやすく解説する攻略メディア。',
    creator: '@tensura_game',
    images: ['/og-image.jpg'],
  },
  robots: {
    index: true,
    follow: true,
    googleBot: {
      index: true,
      follow: true,
      'max-video-preview': -1,
      'max-image-preview': 'large',
      'max-snippet': -1,
    },
  },
};

export async function generateMetadata(): Promise<Metadata> {
  let faviconUrl = '/favicon.png';
  try {
    const data = await getHomepageContent();
    const content = data?.puckData?.content as any[] | undefined;
    const headerBlock = content?.find((b: any) => b.type === 'SiteHeader');
    const cmsFavicon = headerBlock?.props?.favicon;
    if (cmsFavicon && typeof cmsFavicon === 'string' && cmsFavicon.trim()) {
      faviconUrl = cmsFavicon;
    }
  } catch { /* fallback to default */ }

  return {
    ...defaultMetadata,
    icons: {
      icon: faviconUrl,
      shortcut: faviconUrl,
      apple: faviconUrl,
    },
  };
}

export default async function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  const categoriesDb = await getAllCategories();
  const categories = categoriesDb.map((c) => ({
    name: c.japanese,
    slug: c.slug,
  }));

  const headerNavItems = await getNavigationItems(['top_header', 'category_bar']);
  const footerNavItems = await getNavigationItems('footer');

  const headerTree = buildNavigationTree(headerNavItems, categories);
  const footerTree = buildNavigationTree(footerNavItems, categories);

  return (
    <html lang="ja" className={`${notoSansJP.variable} bg-deep-black`} suppressHydrationWarning>
      <body className={`${notoSansJP.className} antialiased bg-deep-black text-foreground`} suppressHydrationWarning>
        <Header navigationTree={headerTree} />
        {children}
        <Footer navigationTree={footerTree} />
        <Analytics />
      </body>
    </html>
  );
}
