import { TESOL_UPDATED } from '@/lib/tesolResourceSeo.mjs';
import { modules as cvimResourceModules, CVIM_BASE, CVIM_UPDATED } from '@/data/cvim/course.mjs';
import { modules as tesolResourceModules, TESOL_BASE } from '@/data/tesol/course.mjs';
import type { MetadataRoute } from 'next';
import { headers } from 'next/headers';
import { getBlogCategories, getBlogPosts, blogPostUrl } from '@/lib/blogPosts';
import { mergeStaticBlogPosts } from '@/lib/staticBlogPosts';
import { STRATEGY_CATEGORIES } from '@/data/seo/strategyArticles';
import { CVAF_CATEGORIES } from '@/data/seo/cvafArticles';
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';
import { publishedCurriculumUnits } from '@/lib/algebraPlatformRepository';
import { businessEnglishCourseFacts } from '@/data/courses/masterclass/business-english/courseFactsData';
import { dynamicPresentationsCourseFacts } from '@/data/courses/masterclass/dynamic-presentations/courseFactsData';
import { PUBLIC_TOOLS } from '@/app/tools/toolsSeoData';
import { vnaProfessionalsSeo } from '@/data/courses/masterclass/vna-professionals/seoData';
import { cvcacSeo } from '@/data/courses/certificates/communication-across-cultures/seoData';
import { creativeWritingSeo } from '@/data/courses/certificates/creative-writing/seoData';
import { ieltsPreparationSeo } from '@/data/courses/certificates/ielts-preparation/seoData';
import { medicalPractitionersSeo } from '@/data/courses/certificates/medical-practitioners/seoData';
import { TESOL_GROWTH_RESOURCE_ARTICLES } from '@/data/seo/tesolGrowthArticles';
import {
  ALGEBRA_RESOURCE_ARTICLES,
  ALGEBRA_RESOURCE_HUB,
  ALGEBRA_WORKSHEET_HUB,
} from '@/data/seo/algebraGrowthArticles';

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 = [
  url('/algebra-1/staar', 0.7, 'monthly'),
  // ── 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', new Date('2026-10-22T00:00:00Z')),
  url('/self-paced-programmes/ielts-trainer-masterclass', 0.85, 'monthly', new Date('2026-10-22T00:00:00Z')),
  url('/self-paced-programmes/voice-and-accent-trainer-programme', 0.85, 'monthly', new Date('2026-10-22T00:00:00Z')),
  url('/self-paced-programmes/ipc-club', 0.85, 'monthly', new Date('2026-10-19T00:00:00Z')),
  url('/pricing', 0.75, 'monthly'),
  url('/reviews', 0.7, 'weekly'),
  url('/presentations', 0.7, 'weekly'),
  url('/online-algebra-1-tutoring', 0.85, 'weekly', new Date('2026-10-19T00:00:00Z')),
  url('/free-algebra-1-resources-texas', 0.8, 'weekly', new Date('2026-10-22T00:00:00Z')),
  url(ALGEBRA_RESOURCE_HUB.path, 0.8, 'weekly', new Date('2026-10-09T06:00:00Z')),
  url(ALGEBRA_WORKSHEET_HUB.path, 0.75, 'weekly', new Date('2026-10-09T06:00:00Z')),
  ...ALGEBRA_RESOURCE_ARTICLES.map((article) =>
    url(article.path, article.intent === 'Worksheet' ? 0.72 : 0.74, 'monthly', new Date(article.modifiedAt || article.publishedAt))
  ),
  url('/algebra-diagnostic', 0.75, 'monthly'),
  url('/algebra-privacy', 0.4, 'yearly'),
  url('/tools', 0.85, 'weekly'),
  ...PUBLIC_TOOLS.map((tool) =>
    url(tool.path, tool.sitemapPriority, tool.changeFrequency as Freq)
  ),

  // ── 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',
    new Date(`${ieltsPreparationSeo.lastModified}T00:00:00Z`)
  ),
  url(
    '/certifications/cambridge-veritas-certificate-for-medical-practitioners',
    0.9,
    'monthly',
    new Date(`${medicalPractitionersSeo.lastModified}T00:00:00Z`)
  ),
  url(
    '/certifications/cambridge-veritas-certificate-in-creative-writing',
    0.9,
    'monthly',
    new Date(`${creativeWritingSeo.lastModified}T00:00:00Z`)
  ),
  url(
    '/certifications/cambridge-veritas-communication-across-cultures-specialization',
    0.9,
    'monthly',
    new Date(`${cvcacSeo.lastModified}T00:00:00Z`)
  ),

  // ── 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',
    new Date(`${businessEnglishCourseFacts.lastModified}T00:00:00Z`)
  ),
  url(
    '/masterclass/cambridge-veritas-dynamic-presentations',
    0.85,
    'monthly',
    new Date(`${dynamicPresentationsCourseFacts.lastModified}T00:00:00Z`)
  ),
  url(
    '/masterclass/vnaprofessionals',
    0.9,
    'monthly',
    new Date(`${vnaProfessionalsSeo.lastModified}T00:00:00Z`)
  ),

  // ── 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'),
  url('/blog/algebra-1', 0.72, 'weekly'),
  url('/editorial-policy', 0.5, 'yearly'),

  // ── Level Tests ───────────────────────────────────────────────────────────
  url('/level-test', 0.8, 'monthly'),

  // ── Grammar index ─────────────────────────────────────────────────────────
  url('/grammar', 0.75, 'weekly', new Date('2026-10-23T00:00:00Z')),

  // ── Webinars ──────────────────────────────────────────────────────────────
  url('/webinars', 0.75, 'weekly'),
  url('/webinars/upcoming-webinars', 0.75, 'weekly'),
  url('/webinars/past-webinars', 0.65, 'monthly'),

  // ── Writing Analyser ─────────────────────────────────────────────────────
  url('/practice', 0.75, 'weekly'),
  url('/tesol-teaching-practice', 0.8, 'monthly'),
  ...TESOL_GROWTH_RESOURCE_ARTICLES.map((article) =>
    url(article.path, 0.75, 'monthly', new Date(article.modifiedAt || article.publishedAt))
  ),

  // ── 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,
    blogCategories,
    grammarCategories,
    grammarPosts,
    impactStories,
    upcomingWebinars,
    pastWebinarData,
    presentationData,
    practiceUrls,
    studentProfiles,
    curriculumUnits,
  ] = await Promise.all([
    getBlogPosts(undefined).catch(() => []),
    getBlogCategories().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(() => []),
    publishedCurriculumUnits().catch(() => []),
  ]);

  const blogUrls: MetadataRoute.Sitemap = mergeStaticBlogPosts(blogPosts)
    .filter((post) => post?.slug)
    .map((post) => {
      const postPath = blogPostUrl(post);
      const lastMod = (post.updated_at || post.created_at) ? new Date(post.updated_at || post.created_at) : undefined;
      return url(postPath, 0.7, 'monthly', lastMod);
    });

  const blogCategoryUrls: MetadataRoute.Sitemap = [...new Map([...blogCategories, ...CVAF_CATEGORIES, ...STRATEGY_CATEGORIES].map((category) => [category.slug, category])).values()]
    .filter((category) => category?.slug)
    .map((category) => url(`/blog/${category.slug}`, category.slug === 'teacher-training' ? 0.8 : 0.65, 'weekly'));

  const grammarUrls: MetadataRoute.Sitemap = (grammarPosts as {slug?:string; category_slug?:string; created_at?:string}[])
    .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 as {slug?:string; created_at?:string}[])
    .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 as {slug?:string; created_at?:string}[])
    .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 as {slug?:string}[])
    .filter((webinar) => webinar?.slug)
    .map((webinar) =>
      url(`/webinars/upcoming-webinars/${webinar.slug}`, 0.7, 'weekly')
    );

  const pastWebinarUrls: MetadataRoute.Sitemap = ((pastWebinarData.webinars || []) as {slug?:string}[])
    .filter((webinar) => webinar?.slug)
    .map((webinar) =>
      url(`/webinars/past-webinars/${webinar.slug}`, 0.6, 'monthly')
    );

  const presentationUrls: MetadataRoute.Sitemap = ((presentationData.presentations || []) as {presentationId?:string}[])
    .filter((presentation) => presentation?.presentationId)
    .map((presentation) =>
      url(`/presentation/${presentation.presentationId}`, 0.55, 'monthly')
    );

  const studentProfileUrls: MetadataRoute.Sitemap = (studentProfiles as {slug?:string; createdAt?:string}[])
    .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,
    url(CVIM_BASE, 0.8, 'monthly', new Date(CVIM_UPDATED)),
    ...cvimResourceModules.flatMap(unit => [url(unit.path, 0.7, 'monthly', new Date(CVIM_UPDATED)), ...unit.topics.map(topic => url(topic.path, 0.65, 'monthly', new Date(CVIM_UPDATED)))]),
    url(TESOL_BASE, 0.8, 'monthly', new Date(TESOL_UPDATED)),
    ...tesolResourceModules.flatMap(module => [url(module.path, 0.7, 'monthly', new Date(TESOL_UPDATED)), ...module.topics.map(topic => url(topic.path, 0.65, 'monthly', new Date(TESOL_UPDATED)))]),
    ...curriculumUnits.flatMap((unit: {topics: {path:string}[]}) => unit.topics.map(topic => url(topic.path, 0.7, 'monthly'))),
    ...LEVEL_TEST_ROUTES,
    ...blogUrls,
    ...blogCategoryUrls,
    ...grammarCategoryUrls,
    ...grammarUrls,
    ...impactUrls,
    ...upcomingWebinarUrls,
    ...pastWebinarUrls,
    ...presentationUrls,
    ...practiceUrls,
    ...studentProfileUrls,
  ];

  return entries.filter((entry) => {
    try {
      return !isNoIndexPath(new URL(entry.url).pathname);
    } catch {
      return false;
    }
  });
}
