import { seoServices } from "@/data/seo/services";
import { seoSegments } from "@/data/seo/segments";
import { seoCities } from "@/data/seo/cities";
import { seoStates } from "@/data/seo/states";
import type { SeoPageContext } from "./types";
import {
  buildSegmentCitySlug,
  buildSegmentSlug,
  buildServiceCitySlug,
  buildServiceSegmentCitySlug,
  buildServiceSegmentSlug,
  buildServiceSegmentStateSlug,
  buildServiceStateSlug,
  resolveFlatSlug,
} from "./slugs";

/** Páginas priorizadas para SSG no build (tier 1). Demais via ISR on-demand. */
export const SEO_BUILD_PRIORITY_TIER = 1 as const;
export const SEO_REVALIDATE_SECONDS = 86_400;

const HUB_SEGMENT_SLUGS = ["restaurante", "pizzaria", "loja", "clinica", "barbearia"] as const;

/** Resolve slug sem materializar dezenas de milhares de objetos em memória. */
export function resolveSeoPage(slug: string): SeoPageContext | null {
  return resolveFlatSlug(slug);
}

/** Lista só slugs para sitemap (leve). */
export function enumerateAllSeoSlugs(): string[] {
  const slugs: string[] = [];

  for (const service of seoServices) {
    for (const city of seoCities) {
      slugs.push(buildServiceCitySlug(service.slug, city.slug));
    }
    for (const state of seoStates) {
      slugs.push(buildServiceStateSlug(service.slug, state.slug));
    }
  }

  for (const segment of seoSegments) {
    slugs.push(buildSegmentSlug(segment.slug));
    for (const city of seoCities) {
      slugs.push(buildSegmentCitySlug(segment.slug, city.slug));
    }
  }

  for (const service of seoServices) {
    for (const segment of seoSegments) {
      slugs.push(buildServiceSegmentSlug(service.slug, segment.slug));
      for (const city of seoCities.filter((c) => c.populationTier <= 2)) {
        slugs.push(buildServiceSegmentCitySlug(service.slug, segment.slug, city.slug));
      }
      for (const state of seoStates) {
        slugs.push(buildServiceSegmentStateSlug(service.slug, segment.slug, state.slug));
      }
    }
  }

  return slugs;
}

/** @deprecated Use resolveSeoPage — evita array gigante em runtime. */
export function enumerateAllPageContexts(): SeoPageContext[] {
  return enumerateAllSeoSlugs()
    .map((slug) => resolveFlatSlug(slug))
    .filter((c): c is SeoPageContext => c !== null);
}

export function getAllSeoPages(): SeoPageContext[] {
  return enumerateAllPageContexts();
}

export function getSeoPageBySlug(slug: string): SeoPageContext | undefined {
  return resolveSeoPage(slug) ?? undefined;
}

export function getPriorityStaticParams(): { slug: string }[] {
  const tier1Cities = seoCities.filter((c) => c.populationTier === SEO_BUILD_PRIORITY_TIER);
  const slugs = new Set<string>();

  for (const service of seoServices) {
    for (const city of tier1Cities) {
      slugs.add(buildServiceCitySlug(service.slug, city.slug));
    }
  }

  for (const segment of seoSegments) {
    slugs.add(buildSegmentSlug(segment.slug));
    for (const city of tier1Cities) {
      slugs.add(buildSegmentCitySlug(segment.slug, city.slug));
    }
  }

  for (const service of seoServices) {
    for (const segSlug of HUB_SEGMENT_SLUGS) {
      slugs.add(buildServiceSegmentSlug(service.slug, segSlug));
    }
  }

  return [...slugs].slice(0, 500).map((slug) => ({ slug }));
}

export function estimatePageCount(): number {
  const s = seoServices.length;
  const g = seoSegments.length;
  const c = seoCities.length;
  const st = seoStates.length;
  const tier2c = seoCities.filter((x) => x.populationTier <= 2).length;
  return s * c + s * st + g + g * c + s * g + s * g * tier2c + s * g * st;
}
