import type { MetadataRoute } from 'next';
import { headers } from 'next/headers';
import { getBlogPosts, blogPostUrl } from '@/lib/blogPosts';
import { getGrammarCategories, getGrammarPosts } from '@/lib/grammar';
import { getImpactStories } from '@/lib/impactStories';
import { LEVEL_TESTS, getLevelTestPath } from '@/lib/levelTestConfig';
import { getAllPracticeLevels, getPracticeExercises, getPracticeTypes } from '@/lib/practice';
import { getPresentationsList } from '@/lib/presentations';
import { getStudentProfileSlugs } from '@/lib/studentProfiles';
import { getPastWebinars, getUpcomingWebinars } from '@/lib/webinars';
import { isNoIndexHost, isNoIndexPath } from '@/lib/searchIndexing';
import { MAIN_SITE_URL } from '@/lib/mainSiteUrl';

export const dynamic = 'force-dynamic';

const BASE = MAIN_SITE_URL;

type Freq = 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never';

function url(path: string, priority = 0.7, changeFrequency: Freq = 'monthly', lastModified?: Date) {
  return {
    url: `${BASE}${path}`,
    ...(lastModified ? { lastModified } : {}),
    changeFrequency,
    priority,
  };
}

async function getPracticeUrls(): Promise<MetadataRoute.Sitemap> {
  const practiceLevels = await getAllPracticeLevels();
  const entries: MetadataRoute.Sitemap = [];

  for (const practice of practiceLevels) {
    if (!practice?.slug) continue;

    entries.push(url(`/practice/${practice.slug}`, 0.65, 'monthly'));
    const topics = await getPracticeTypes(practice.id);

    for (const topic of topics) {
      if (!topic?.slug) continue;

      entries.push(url(`/practice/${practice.slug}/${topic.slug}`, 0.6, 'monthly'));
      const exercises = await getPracticeExercises(topic.id);

      for (const exercise of exercises) {
        if (!exercise?.slug) continue;
        entries.push(
          url(
            `/practice/${practice.slug}/${topic.slug}/${exercise.slug}`,
            0.55,
            'monthly'
          )
        );
      }
    }
  }

  return entries;
}

const STATIC_ROUTES: MetadataRoute.Sitemap = [
  // ── Core ──────────────────────────────────────────────────────────────────
  url('/', 1.0, 'weekly'),
  url('/about-us', 0.8, 'monthly'),
  url('/contact-us', 0.7, 'monthly'),
  url('/faq', 0.7, 'monthly'),
  url('/career', 0.6, 'monthly'),
  url('/enrol-risk-free', 0.7, 'monthly'),
  url('/how-to-start', 0.7, 'monthly'),
  url('/hall-of-fame', 0.6, 'monthly'),
  url('/veritas-impact', 0.6, 'monthly'),
  url('/free-resources', 0.7, 'monthly'),
  url('/conversation-clubs', 0.7, 'monthly'),
  url('/accent-improvement-pronunciation-classes', 0.85, 'monthly'),
  url('/accent-neutralisation-modification-training', 0.85, 'monthly'),
  url('/american-accent-training', 0.85, 'monthly'),
  url('/british-accent-training', 0.85, 'monthly'),
  url('/voice-and-accent-classes', 0.85, 'monthly'),
  url('/english-pronunciation-training', 0.85, 'monthly'),
  url('/courses', 0.85, 'weekly'),
  url('/self-paced-programmes', 0.9, 'weekly'),
  url('/self-paced-programmes/ielts-trainer-masterclass', 0.85, 'monthly'),
  url('/self-paced-programmes/voice-and-accent-trainer-programme', 0.85, 'monthly'),
  url('/self-paced-programmes/ipc-club', 0.85, 'monthly'),
  url('/pricing', 0.75, 'monthly'),
  url('/reviews', 0.7, 'weekly'),
  url('/presentations', 0.7, 'weekly'),
  url('/online-algebra-1-tutoring', 0.85, 'weekly'),
  url('/algebra-diagnostic', 0.75, 'monthly'),
  url('/algebra-privacy', 0.4, 'yearly'),
  url('/tools', 0.85, 'weekly'),
  url('/tools/writing-analyser', 0.75, 'weekly'),
  url('/tools/speech-analyser', 0.85, 'weekly'),
  url('/tools/accent-enhancer', 0.75, 'weekly'),
  url('/tools/oral-drill', 0.7, 'weekly'),
  url('/tools/photo-mode', 0.7, 'weekly'),
  url('/tools/practice-accent-with-ella', 0.65, 'monthly'),
  url('/tools/practice-ielts-with-emma', 0.65, 'monthly'),
  url('/tools/practice-english-with-eva', 0.65, 'monthly'),
  url('/tools/practice-tesol-with-ellie', 0.65, 'monthly'),

  // ── Certifications ────────────────────────────────────────────────────────
  url('/certifications', 0.95, 'weekly'),
  url('/certifications/cambridge-veritas-certificate-in-TESOL', 0.9, 'monthly'),
  url('/certifications/cambridge-veritas-certificate-in-advanced-fluency', 0.9, 'monthly'),
  url('/certifications/cambridge-veritas-certificate-for-ielts-preparation', 0.9, 'monthly'),
  url('/certifications/cambridge-veritas-certificate-for-medical-practitioners', 0.9, 'monthly'),
  url('/certifications/cambridge-veritas-certificate-in-creative-writing', 0.85, 'monthly'),
  url('/certifications/cambridge-veritas-communication-across-cultures-specialization', 0.85, 'monthly'),

  // ── Masterclass ───────────────────────────────────────────────────────────
  url('/masterclass', 0.9, 'weekly'),
  url('/masterclass/cambridge-veritas-certificate-in-ielts-masterclass', 0.9, 'monthly'),
  url('/masterclass/cambridge-veritas-voice-and-accent-trainer-certification', 0.9, 'monthly'),
  url('/masterclass/cambridge-veritas-certificate-in-business-english', 0.85, 'monthly'),
  url('/masterclass/cambridge-veritas-dynamic-presentations', 0.85, 'monthly'),
  url('/masterclass/vnaprofessionals', 0.8, 'monthly'),

  // ── Specializations ───────────────────────────────────────────────────────
  url('/specializations', 0.85, 'weekly'),
  url('/specializations/cambridge-veritas-aviation-proficiency-certificate', 0.8, 'monthly'),
  url('/specializations/cambridge-veritas-certificate-in-customer-service', 0.8, 'monthly'),
  url('/specializations/cambridge-veritas-certificate-in-nursing', 0.8, 'monthly'),
  url('/specializations/cambridge-veritas-certificate-in-financial-english', 0.8, 'monthly'),
  url('/specializations/cambridge-veritas-proficiency-in-sales-and-purchasing', 0.8, 'monthly'),
  url('/specializations/cambridge-veritas-certificate-in-engineering-english', 0.8, 'monthly'),
  url('/specializations/cambridge-veritas-proficiency-for-scientists', 0.8, 'monthly'),
  url('/specializations/cambridge-veritas-hr-proficiency-certificate', 0.8, 'monthly'),
  url('/specializations/cambridge-veritas-legal-proficiency-certificate', 0.8, 'monthly'),
  url('/specializations/cambridge-veritas-certificate-in-tourism-and-hospitality-management', 0.8, 'monthly'),

  // ── Blog index ────────────────────────────────────────────────────────────
  url('/blog', 0.8, 'weekly'),

  // ── Level Tests ───────────────────────────────────────────────────────────
  url('/level-test', 0.8, 'monthly'),

  // ── Grammar index ─────────────────────────────────────────────────────────
  url('/grammar', 0.75, 'weekly'),

  // ── Webinars ──────────────────────────────────────────────────────────────
  url('/webinars', 0.75, 'weekly'),
  url('/webinars/upcoming-webinars', 0.75, 'weekly'),
  url('/webinars/past-webinars', 0.65, 'monthly'),

  // ── Writing Analyser ─────────────────────────────────────────────────────
  url('/writing-analyser', 0.75, 'monthly'),
  url('/practice', 0.75, 'weekly'),

  // ── CEFR / Info ───────────────────────────────────────────────────────────
  url('/cefr-levels', 0.65, 'monthly'),
  url('/introduction-class/ielts', 0.75, 'weekly'),
  url('/introduction-class/tesol', 0.75, 'weekly'),
  url('/introduction-class/voice-and-accent', 0.75, 'weekly'),

  // ── Legal ─────────────────────────────────────────────────────────────────
  url('/privacy-policy', 0.4, 'yearly'),
  url('/terms-of-use', 0.4, 'yearly'),
  url('/disclaimer', 0.4, 'yearly'),
];

const LEVEL_TEST_ROUTES: MetadataRoute.Sitemap = LEVEL_TESTS.map((test) =>
  url(getLevelTestPath(test), 0.75, 'monthly')
);

export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
  const requestHeaders = await headers();
  const requestHost =
    requestHeaders.get('x-forwarded-host') || requestHeaders.get('host') || '';

  if (isNoIndexHost(requestHost)) {
    return [];
  }

  const [
    blogPosts,
    grammarCategories,
    grammarPosts,
    impactStories,
    upcomingWebinars,
    pastWebinarData,
    presentationData,
    practiceUrls,
    studentProfiles,
  ] = await Promise.all([
    getBlogPosts(undefined).catch(() => []),
    getGrammarCategories().catch(() => []),
    getGrammarPosts().catch(() => []),
    getImpactStories().catch(() => []),
    getUpcomingWebinars().catch(() => []),
    getPastWebinars({ page: 1, pageSize: 50_000 }).catch(() => ({ webinars: [] })),
    getPresentationsList({ pageSize: 50_000 }).catch(() => ({ presentations: [] })),
    getPracticeUrls().catch(() => []),
    getStudentProfileSlugs().catch(() => []),
  ]);

  const blogUrls: MetadataRoute.Sitemap = blogPosts
    .filter((post) => post?.slug)
    .map((post) => {
      const postPath = blogPostUrl(post);
      const lastMod = post.created_at ? new Date(post.created_at) : undefined;
      return url(postPath, 0.7, 'monthly', lastMod);
    });

  const grammarUrls: MetadataRoute.Sitemap = grammarPosts
    .filter((post) => post?.slug && post?.category_slug)
    .map((post) =>
      url(
        `/grammar/${post.category_slug}/${post.slug}`,
        0.65,
        'monthly',
        post.created_at ? new Date(post.created_at) : undefined
      )
    );

  const grammarCategoryUrls: MetadataRoute.Sitemap = grammarCategories
    .filter((category) => category?.slug)
    .map((category) =>
      url(
        `/grammar/${category.slug}`,
        0.7,
        'weekly',
        category.created_at ? new Date(category.created_at) : undefined
      )
    );

  const impactUrls: MetadataRoute.Sitemap = impactStories
    .filter((story) => story?.slug)
    .map((story) =>
      url(
        `/veritas-impact/${story.slug}`,
        0.65,
        'monthly',
        story.created_at ? new Date(story.created_at) : undefined
      )
    );

  const upcomingWebinarUrls: MetadataRoute.Sitemap = upcomingWebinars
    .filter((webinar) => webinar?.slug)
    .map((webinar) =>
      url(`/webinars/upcoming-webinars/${webinar.slug}`, 0.7, 'weekly')
    );

  const pastWebinarUrls: MetadataRoute.Sitemap = (pastWebinarData.webinars || [])
    .filter((webinar) => webinar?.slug)
    .map((webinar) =>
      url(`/webinars/past-webinars/${webinar.slug}`, 0.6, 'monthly')
    );

  const presentationUrls: MetadataRoute.Sitemap = (presentationData.presentations || [])
    .filter((presentation) => presentation?.presentationId)
    .map((presentation) =>
      url(`/presentation/${presentation.presentationId}`, 0.55, 'monthly')
    );

  const studentProfileUrls: MetadataRoute.Sitemap = studentProfiles
    .filter((student) => student?.slug)
    .map((student) =>
      url(
        `/student/${student.slug}`,
        0.55,
        'monthly',
        student.createdAt ? new Date(student.createdAt) : undefined
      )
    );

  const entries: MetadataRoute.Sitemap = [
    ...STATIC_ROUTES,
    ...LEVEL_TEST_ROUTES,
    ...blogUrls,
    ...grammarCategoryUrls,
    ...grammarUrls,
    ...impactUrls,
    ...upcomingWebinarUrls,
    ...pastWebinarUrls,
    ...presentationUrls,
    ...practiceUrls,
    ...studentProfileUrls,
  ];

  return entries.filter((entry) => {
    try {
      return !isNoIndexPath(new URL(entry.url).pathname);
    } catch {
      return false;
    }
  });
}
