import { getProductConfig, resolveCurrentProduct } from '../config/products.js';

const ROUTE_SEO = {
  club: {
    '/': {
      title: 'TT Verein – Vereinsverwaltung für Tischtennis',
      description:
        'TT Verein ist die zentrale Arbeitsplattform für kleine und mittlere Tischtennisvereine mit Fokus auf Mitglieder, Anfragen, Kommunikation, Termine, Dokumente und Zahlungen.',
      robots: 'index,follow'
    },
    '/vereinssoftware-tischtennis': {
      title: 'Vereinssoftware für Tischtennisvereine | TT Verein',
      description:
        'Webbasierte Vereinssoftware für Tischtennisvereine: Mitgliederverwaltung, Trainingsplanung, Mannschaften, Turniere und Auswertungen.',
      robots: 'index,follow'
    },
    '/mitgliederverwaltung-verein': {
      title: 'Mitgliederverwaltung für Tischtennisvereine | TT Verein',
      description:
        'Mitgliederprofile, Rollen, Gruppen und Vereinsdaten zentral pflegen und mit Training sowie Mannschaften verbinden.',
      robots: 'index,follow'
    },
    '/trainingsplanung-tischtennis': {
      title: 'Trainingsplanung für Tischtennisvereine | TT Verein',
      description:
        'Trainingsplanung für Tischtennisvereine mit Gruppen, Anwesenheiten, Trainingstagen und digitaler Organisation.',
      robots: 'index,follow'
    },
    '/turniersoftware-tischtennis': {
      title: 'Turniersoftware für Tischtennis | TT Verein',
      description:
        'Turniersoftware für Tischtennisvereine mit Teilnehmerverwaltung, Gruppen, Paarungen, Ergebnissen und Übersichten.',
      robots: 'index,follow'
    },
  },
  player: {
    '/': {
      title: 'Mein TT – Tischtennis für Spieler',
      description:
        'Mein TT ist die persönliche Tischtennisoberfläche für Spieler mit Kalender, Kontoverknüpfungen, Bestellungen und persönlichen Einstellungen.',
      robots: 'index,follow'
    },
  },
};

const COMMON_ROUTE_SEO = {
  '/login': { title: 'Login', description: 'Im Konto anmelden.', robots: 'noindex,follow' },
  '/register': { title: 'Registrieren', description: 'Neues Konto anlegen.', robots: 'noindex,follow' },
  '/activate': { title: 'Konto aktivieren', description: 'Benutzerkonto aktivieren.', robots: 'noindex,follow' },
  '/forgot-password': { title: 'Passwort vergessen', description: 'Zugang wiederherstellen.', robots: 'noindex,follow' },
  '/reset-password': { title: 'Passwort zurücksetzen', description: 'Passwort sicher zurücksetzen.', robots: 'noindex,follow' },
  '/impressum': { title: 'Impressum', description: 'Impressum.', robots: 'index,follow' },
  '/datenschutz': { title: 'Datenschutz', description: 'Datenschutzerklärung.', robots: 'index,follow' },
  '/konto-loeschen': { title: 'Konto löschen', description: 'Informationen zur Kontolöschung.', robots: 'index,follow' },
};

const NOINDEX_PREFIXES = [
  '/createclub',
  '/showclub',
  '/members',
  '/diary',
  '/calendar',
  '/pending-approvals',
  '/schedule',
  '/friendly-matches',
  '/tournaments',
  '/tournament-participations',
  '/training-stats',
  '/club-settings',
  '/predefined-activities',
  '/mytischtennis-account',
  '/clicktt-account',
  '/team-management',
  '/permissions',
  '/logs',
  '/clicktt',
  '/member-transfer-settings',
  '/personal-settings',
  '/orders',
  '/billing',
  '/club-'
];

function normalizePath(path = '/') {
  if (!path || path === '') return '/';
  if (path === '/') return '/';
  return path.endsWith('/') ? path.slice(0, -1) : path;
}

function prefixMatchSeo(routeSeo, normalizedPath) {
  const matchedPrefix = Object.keys(routeSeo)
    .filter((routePath) => routePath !== '/' && normalizedPath.startsWith(routePath))
    .sort((a, b) => b.length - a.length)[0];

  return (matchedPrefix && routeSeo[matchedPrefix]) || routeSeo[normalizedPath];
}

export function getSeoConfigForPath(path, product = resolveCurrentProduct()) {
  const normalizedPath = normalizePath(path);
  const productConfig = getProductConfig(product);
  const productRouteSeo = ROUTE_SEO[productConfig.id] || {};
  const routeSeo = prefixMatchSeo(productRouteSeo, normalizedPath) || prefixMatchSeo(COMMON_ROUTE_SEO, normalizedPath);
  const canonicalPath = normalizedPath === '/' ? '' : normalizedPath;
  const shouldNoindex = !routeSeo && NOINDEX_PREFIXES.some((routePath) => normalizedPath.startsWith(routePath));
  const fallbackTitle = productConfig.seo.defaultTitle;
  const fallbackDescription = productConfig.seo.defaultDescription;

  return {
    title: routeSeo?.title || fallbackTitle,
    description: routeSeo?.description || fallbackDescription,
    robots: routeSeo?.robots || (shouldNoindex ? 'noindex,follow' : 'index,follow'),
    canonical: `${productConfig.canonicalUrl}${canonicalPath}`,
    url: `${productConfig.canonicalUrl}${canonicalPath}`,
    image: `${productConfig.canonicalUrl}${productConfig.seo.imagePath}`,
    siteName: productConfig.seo.siteName,
  };
}

function upsertMeta(selector, attributes) {
  let element = document.head.querySelector(selector);

  if (!element) {
    element = document.createElement('meta');
    document.head.appendChild(element);
  }

  Object.entries(attributes).forEach(([key, value]) => {
    element.setAttribute(key, value);
  });
}

function upsertLink(selector, attributes) {
  let element = document.head.querySelector(selector);

  if (!element) {
    element = document.createElement('link');
    document.head.appendChild(element);
  }

  Object.entries(attributes).forEach(([key, value]) => {
    element.setAttribute(key, value);
  });
}

export function applySeoForPath(path) {
  if (typeof document === 'undefined') {
    return;
  }

  const seo = getSeoConfigForPath(path);

  document.title = seo.title;

  upsertMeta('meta[name="description"]', { name: 'description', content: seo.description });
  upsertMeta('meta[name="robots"]', { name: 'robots', content: seo.robots });
  upsertMeta('meta[property="og:type"]', { property: 'og:type', content: 'website' });
  upsertMeta('meta[property="og:site_name"]', { property: 'og:site_name', content: seo.siteName });
  upsertMeta('meta[property="og:title"]', { property: 'og:title', content: seo.title });
  upsertMeta('meta[property="og:description"]', { property: 'og:description', content: seo.description });
  upsertMeta('meta[property="og:url"]', { property: 'og:url', content: seo.url });
  upsertMeta('meta[property="og:image"]', { property: 'og:image', content: seo.image });
  upsertMeta('meta[name="twitter:card"]', { name: 'twitter:card', content: 'summary_large_image' });
  upsertMeta('meta[name="twitter:title"]', { name: 'twitter:title', content: seo.title });
  upsertMeta('meta[name="twitter:description"]', { name: 'twitter:description', content: seo.description });
  upsertMeta('meta[name="twitter:image"]', { name: 'twitter:image', content: seo.image });
  upsertLink('link[rel="canonical"]', { rel: 'canonical', href: seo.canonical });
}
