/* ============================================================
   WEINBERG — App: language-prefixed real-path routing, i18n, mount
   URLs: /en/services, /de/leistungen … English is the default for
   visitors landing without a language prefix.
   ============================================================ */

const ROUTES = Object.keys(SLUGS);

/* Split the current URL into { lang, route, known }.
   known=false means the URL had no usable language prefix and the caller
   should rewrite it (root → /en/, legacy /leistungen → /de/leistungen). */
function parseLocation(){
  let p = window.location.pathname || '/';
  if(BASE !== '/' && p.indexOf(BASE) === 0) p = p.slice(BASE.length);
  p = p.replace(/^\/+/, '').replace(/\/+$/, '');

  /* Legacy #/route links from the pre-path era. */
  const hash = (window.location.hash||'').replace(/^#\/?/, '').split('?')[0];
  if(hash && LEGACY_SLUG_TO_ROUTE[hash]){
    return {lang:'de', route:LEGACY_SLUG_TO_ROUTE[hash], known:false};
  }

  const parts = p.split('/').filter(Boolean);
  /* Drop a dev/offline filename segment such as "index- fejlesztői verzió.html". */
  if(parts.length && /\.html?$/i.test(parts[parts.length-1])) parts.pop();

  if(parts.length && LANGS.indexOf(parts[0]) !== -1){
    const lang = parts[0];
    const slug = parts.slice(1).join('/');
    if(!slug) return {lang:lang, route:'home', known:true};
    const r = SLUG_TO_ROUTE[lang+'/'+slug];
    if(r) return {lang:lang, route:r, known:true};
    /* Slug from the other language under this prefix — accept the route, fix the URL. */
    const other = LANGS.filter(function(l){ return l !== lang; })[0];
    const rOther = SLUG_TO_ROUTE[other+'/'+slug];
    if(rOther) return {lang:lang, route:rOther, known:false};
    return {lang:lang, route:'home', known:false};
  }

  /* No language prefix. */
  if(!parts.length){
    const stored = localStorage.getItem('wb_lang');
    const pref = LANGS.indexOf(stored) !== -1 ? stored : DEFAULT_LANG;
    return {lang:pref, route:'home', known:false};
  }
  const legacy = LEGACY_SLUG_TO_ROUTE[parts.join('/')];
  if(legacy){
    /* Old un-prefixed URL: German slugs were the originals, so send those to /de/. */
    const isGerman = SLUGS[legacy] && SLUGS[legacy].de === parts.join('/');
    return {lang: isGerman ? 'de' : DEFAULT_LANG, route:legacy, known:false};
  }
  return {lang:DEFAULT_LANG, route:'home', known:false};
}

/* Keep exactly one <link rel="alternate" hreflang> set + canonical in <head>. */
function syncHeadLinks(route, lang){
  const set = function(sel, make, attrs){
    let el = document.head.querySelector(sel);
    if(!el){ el = make(); document.head.appendChild(el); }
    Object.keys(attrs).forEach(function(k){ el.setAttribute(k, attrs[k]); });
    return el;
  };
  set('link[rel="canonical"]', function(){ const l=document.createElement('link'); l.rel='canonical'; return l; },
      {href: CANONICAL(route, lang)});
  LANGS.forEach(function(l){
    set('link[rel="alternate"][hreflang="'+l+'"]',
        function(){ const e=document.createElement('link'); e.rel='alternate'; e.setAttribute('hreflang', l); return e; },
        {href: CANONICAL(route, l)});
  });
  /* x-default → English: the fallback for visitors whose language isn't detected. */
  set('link[rel="alternate"][hreflang="x-default"]',
      function(){ const e=document.createElement('link'); e.rel='alternate'; e.setAttribute('hreflang','x-default'); return e; },
      {href: CANONICAL(route, DEFAULT_LANG)});
  set('meta[property="og:url"]',
      function(){ const m=document.createElement('meta'); m.setAttribute('property','og:url'); return m; },
      {content: CANONICAL(route, lang)});
  set('meta[property="og:locale"]',
      function(){ const m=document.createElement('meta'); m.setAttribute('property','og:locale'); return m; },
      {content: lang === 'de' ? 'de_DE' : 'en_GB'});
}

function App(){
  const initial = React.useMemo(parseLocation, []);
  const [lang, setLangState] = React.useState(initial.lang);
  const [route, setRoute] = React.useState(initial.route);
  const [kontaktTab, setKontaktTab] = React.useState('kontakt');
  const [refFilter, setRefFilter] = React.useState(null);

  /* HREF() reads this, so it must be current before children render. */
  setCurrentLang(lang);

  const navigate = React.useCallback(function(r, l, opts, replace){
    if(opts && opts.tab) setKontaktTab(opts.tab);
    setRefFilter(opts && opts.filter ? opts.filter : null);
    const url = HREF(r, l);
    try{
      if(replace) window.history.replaceState({route:r, lang:l}, '', url);
      else if(window.location.pathname !== url || window.location.hash) window.history.pushState({route:r, lang:l}, '', url);
    }catch(e){}
    setCurrentLang(l);
    setLangState(l);
    setRoute(r);
    if(!replace) window.scrollTo({top:0, behavior:'auto'});
  },[]);

  const go = React.useCallback(function(r, opts){ navigate(r, CURRENT_LANG, opts, false); },[navigate]);

  /* DE/EN toggle: same page, other language — the URL changes with it. */
  const setLang = React.useCallback(function(l){
    localStorage.setItem('wb_lang', l);
    navigate(route, l, null, false);
  },[navigate, route]);

  /* Normalise the entry URL once: root → /en/, legacy paths → prefixed equivalent. */
  React.useEffect(function(){
    if(!initial.known) navigate(initial.route, initial.lang, null, true);
  },[]);

  React.useEffect(function(){
    const onPop = function(){
      const loc = parseLocation();
      setCurrentLang(loc.lang);
      setLangState(loc.lang);
      setRoute(loc.route);
    };
    window.addEventListener('popstate', onPop);
    return function(){ window.removeEventListener('popstate', onPop); };
  },[]);

  /* Intercept in-app link clicks so real-path <a href> navigation stays client-side. */
  React.useEffect(function(){
    const onClick = function(e){
      if(e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;
      const a = e.target.closest && e.target.closest('a[href]');
      if(!a || a.target === '_blank' || a.hasAttribute('download')) return;
      const href = a.getAttribute('href');
      if(!href || href.charAt(0) === '#' || /^[a-z]+:/i.test(href)) return;
      let path = href.split('?')[0].split('#')[0];
      if(BASE !== '/' && path.indexOf(BASE) === 0) path = path.slice(BASE.length);
      path = path.replace(/^\/+/, '').replace(/\/+$/, '');
      const parts = path.split('/').filter(Boolean);
      if(!parts.length || LANGS.indexOf(parts[0]) === -1) return;
      const l = parts[0];
      const slug = parts.slice(1).join('/');
      const r = slug ? SLUG_TO_ROUTE[l+'/'+slug] : 'home';
      if(!r) return;
      e.preventDefault();
      navigate(r, l, null, false);
    };
    document.addEventListener('click', onClick);
    return function(){ document.removeEventListener('click', onClick); };
  },[navigate]);

  /* document title / lang attribute / canonical + hreflang per page */
  React.useEffect(function(){
    const c = CONTENT[route] || CONTENT.home;
    document.title = (c.meta && c.meta.title) ? L(c.meta.title, lang) : 'Weinberg Stahlbau';
    document.documentElement.lang = lang;
    syncHeadLinks(route, lang);
  },[route, lang]);

  let Page = Home;
  if(route==='leistungen') Page = Leistungen;
  else if(route==='fabrik') Page = Fabrik;
  else if(route==='nachhaltigkeit') Page = Nachhaltigkeit;
  else if(route==='warum') Page = Warum;
  else if(route==='referenzen') Page = Referenzen;
  else if(route==='zertifikate') Page = Zertifikate;
  else if(route==='impressum') Page = Impressum;
  else if(route==='datenschutz') Page = Datenschutz;
  else if(route==='kontakt') Page = Kontakt;

  const pageProps = {go, lang};
  if(route==='kontakt'){ pageProps.tab = kontaktTab; pageProps.setTab = setKontaktTab; }
  if(route==='referenzen'){ pageProps.initialFilter = refFilter; }

  return (
    <LangContext.Provider value={lang}>
      <ConsentProvider>
        <TopBar/>
        <MainNav route={route} go={go} lang={lang} setLang={setLang}/>
        <Page key={route+'-'+lang} {...pageProps}/>
        <Footer go={go} lang={lang}/>
        <CookieBanner lang={lang} go={go}/>
      </ConsentProvider>
    </LangContext.Provider>
  );
}

ReactDOM.createRoot(document.getElementById('root')).render(<App/>);
