/* global React, ReactDOM, Header, Footer, MobileCta,
   HomePage, DeveloperPage, PortfolioPage, PropertyPage,
   LegalTechPage, AboutPage, ContactPage */

const ROUTES = [
  {
    key: "home",
    paths: { pl: "/", en: "/en" },
    meta: {
      pl: {
        title: "Kancelaria Adwokacka Marcin Kuczyński | Obsługa firm, EPU i LegalTech",
        description: "Kancelaria adwokacka w Warszawie dla klientów biznesowych: deweloperzy, nieruchomości komercyjne, portfele wierzytelności, EPU i LegalTech.",
      },
      en: {
        title: "Kuczyński Law Firm Warsaw | Business Legal Support, Litigation and LegalTech",
        description: "Warsaw-based law firm for business clients: developers, commercial real estate, debt portfolios, litigation, EPU proceedings and LegalTech-driven operations.",
      },
    },
  },
  {
    key: "developers",
    paths: { pl: "/deweloperzy", en: "/en/developers" },
    meta: {
      pl: {
        title: "Obsługa prawna deweloperów i inwestycji | Kuczyński Kancelaria",
        description: "Obsługa prawna deweloperów i inwestycji budowlanych: umowy, relacje z wykonawcami, rękojmia, wady inwestycji, spory i bieżące doradztwo.",
      },
      en: {
        title: "Legal Support for Developers and Construction Projects | Kuczyński Law Firm",
        description: "Legal support for developers and construction projects in Poland: contracts, contractors, handover, warranty claims, defects and disputes.",
      },
    },
  },
  {
    key: "portfolios",
    paths: { pl: "/portfele-wierzytelnosci", en: "/en/debt-portfolios" },
    meta: {
      pl: {
        title: "Obsługa portfeli wierzytelności, EPU i egzekucji | Kuczyński Kancelaria",
        description: "Procesowa obsługa portfeli wierzytelności: EPU, sądy powszechne, klauzule, egzekucja, import danych, automatyzacja dokumentów i raportowanie.",
      },
      en: {
        title: "Debt Portfolio Litigation, EPU and Enforcement in Poland | Kuczyński Law Firm",
        description: "Legal and operational support for debt portfolios in Poland: EPU, civil courts, enforcement, data import, document automation and status reporting.",
      },
    },
  },
  {
    key: "property",
    paths: { pl: "/nieruchomosci-komercyjne", en: "/en/commercial-real-estate" },
    meta: {
      pl: {
        title: "Obsługa prawna nieruchomości komercyjnych i najmu | Kuczyński Kancelaria",
        description: "Obsługa właścicieli, zarządców i asset managerów: umowy najmu, zabezpieczenia, rozliczenia, wypowiedzenia, zaległości czynszowe i spory.",
      },
      en: {
        title: "Commercial Real Estate and Lease Legal Support in Poland | Kuczyński Law Firm",
        description: "Legal support for commercial property owners, managers and asset managers: leases, security instruments, rent arrears, terminations and disputes.",
      },
    },
  },
  {
    key: "legaltech",
    paths: { pl: "/legaltech", en: "/en/legaltech" },
    meta: {
      pl: {
        title: "LegalTech w praktyce kancelarii | Kuczyński Kancelaria",
        description: "Własne narzędzia LegalTech kancelarii wspierające dane, dokumenty, EPU, doręczenia, raportowanie i obsługę większych wolumenów spraw.",
      },
      en: {
        title: "LegalTech in Law Firm Operations | Kuczyński Law Firm",
        description: "In-house LegalTech tools supporting data, documents, EPU proceedings, deliveries, reporting and high-volume legal workflows.",
      },
    },
  },
  {
    key: "about",
    paths: { pl: "/o-kancelarii", en: "/en/about" },
    meta: {
      pl: {
        title: "O kancelarii | Kancelaria Adwokacka Marcin Kuczyński",
        description: "Kancelaria adwokacka Marcina Kuczyńskiego w Warszawie. Obsługa prawna klientów biznesowych, procesy, nieruchomości i LegalTech.",
      },
      en: {
        title: "About the Law Firm | Marcin Kuczyński Attorney-at-Law",
        description: "Warsaw law firm led by Marcin Kuczyński, attorney-at-law, supporting business clients in litigation, real estate, debt portfolios and LegalTech-enabled operations.",
      },
    },
  },
  {
    key: "contact",
    paths: { pl: "/kontakt", en: "/en/contact" },
    meta: {
      pl: {
        title: "Kontakt | Kancelaria Adwokacka Marcin Kuczyński",
        description: "Kontakt z Kancelarią Adwokacką Marcina Kuczyńskiego w Warszawie. Sprawy firm, deweloperów, nieruchomości komercyjnych i portfeli wierzytelności.",
      },
      en: {
        title: "Contact | Kuczyński Law Firm Warsaw",
        description: "Contact Kuczyński Law Firm in Warsaw about business legal support, developers, commercial real estate, debt portfolios and litigation workflows.",
      },
    },
  },
];

const ROUTE_BY_PATH = ROUTES.reduce((acc, route) => {
  acc[route.paths.pl] = { ...route, locale: "pl", path: route.paths.pl };
  acc[route.paths.en] = { ...route, locale: "en", path: route.paths.en };
  return acc;
}, {});

const LEGACY_ROUTES = {
  "#/": "/",
  "#/deweloperzy": "/deweloperzy",
  "#/portfele": "/portfele-wierzytelnosci",
  "#/nieruchomosci": "/nieruchomosci-komercyjne",
  "#/legaltech": "/legaltech",
  "#/o-kancelarii": "/o-kancelarii",
  "#/kontakt": "/kontakt",
};

function normalizePath(pathname, { fallbackHome = false } = {}) {
  const base = window.SITE_BASE_PATH || "";
  let path = pathname || "/";
  if (base && path.startsWith(base)) path = path.slice(base.length) || "/";
  path = path.replace(/\/index\.html$/, "/");
  path = path.replace(/\/$/, "") || "/";
  try {
    path = decodeURIComponent(path);
  } catch (error) {
    // Keep the original path if a browser supplies a malformed escape sequence.
  }

  const aliases = {
    "/portfele": "/portfele-wierzytelnosci",
    "/nieruchomosci": "/nieruchomosci-komercyjne",
    "/rozwiazania-it": "/legaltech",
    "/rozwiązania-it": "/legaltech",
    "/en/": "/en",
    "/en/deweloperzy": "/en/developers",
    "/en/portfele": "/en/debt-portfolios",
    "/en/portfele-wierzytelnosci": "/en/debt-portfolios",
    "/en/nieruchomosci": "/en/commercial-real-estate",
    "/en/nieruchomosci-komercyjne": "/en/commercial-real-estate",
    "/en/o-kancelarii": "/en/about",
    "/en/kontakt": "/en/contact",
  };

  path = aliases[path] || path;
  if (ROUTE_BY_PATH[path]) return path;
  return fallbackHome ? "/" : null;
}

function routeInfoFromPath(pathname, options) {
  const path = normalizePath(pathname, options);
  return ROUTE_BY_PATH[path] || ROUTE_BY_PATH["/"];
}

function currentRouteInfo() {
  if (LEGACY_ROUTES[window.location.hash]) return routeInfoFromPath(LEGACY_ROUTES[window.location.hash]);
  return routeInfoFromPath(window.location.pathname, { fallbackHome: true });
}

function canonicalFor(path) {
  return `https://www.kuczynski.eu${path === "/" ? "/" : path}`;
}

function alternatePath(routeKey, targetLocale) {
  const route = ROUTES.find((item) => item.key === routeKey) || ROUTES[0];
  return route.paths[targetLocale];
}

window.alternatePath = alternatePath;

function setMeta(routeInfo) {
  const meta = routeInfo.meta[routeInfo.locale] || routeInfo.meta.pl;
  document.title = meta.title;
  document.documentElement.lang = routeInfo.locale;

  function upsertMeta(selector, attrs) {
    let tag = document.head.querySelector(selector);
    if (!tag) {
      tag = document.createElement("meta");
      document.head.appendChild(tag);
    }
    Object.entries(attrs).forEach(([key, value]) => tag.setAttribute(key, value));
  }

  function upsertLink(selector, attrs) {
    let tag = document.head.querySelector(selector);
    if (!tag) {
      tag = document.createElement("link");
      document.head.appendChild(tag);
    }
    Object.entries(attrs).forEach(([key, value]) => tag.setAttribute(key, value));
  }

  const canonical = canonicalFor(routeInfo.path);
  const plUrl = canonicalFor(routeInfo.paths.pl);
  const enUrl = canonicalFor(routeInfo.paths.en);
  upsertMeta('meta[name="description"]', { name: "description", content: meta.description });
  upsertMeta('meta[property="og:title"]', { property: "og:title", content: meta.title });
  upsertMeta('meta[property="og:description"]', { property: "og:description", content: meta.description });
  upsertMeta('meta[property="og:type"]', { property: "og:type", content: "website" });
  upsertMeta('meta[property="og:locale"]', { property: "og:locale", content: routeInfo.locale === "en" ? "en_US" : "pl_PL" });
  upsertMeta('meta[property="og:url"]', { property: "og:url", content: canonical });
  upsertMeta('meta[property="og:image"]', { property: "og:image", content: "https://www.kuczynski.eu/assets/banner-linkedin.png" });
  upsertMeta('meta[name="twitter:card"]', { name: "twitter:card", content: "summary_large_image" });
  upsertLink('link[rel="canonical"]', { rel: "canonical", href: canonical });
  upsertLink('link[rel="alternate"][hreflang="pl"]', { rel: "alternate", hreflang: "pl", href: plUrl });
  upsertLink('link[rel="alternate"][hreflang="en"]', { rel: "alternate", hreflang: "en", href: enUrl });
  upsertLink('link[rel="alternate"][hreflang="x-default"]', { rel: "alternate", hreflang: "x-default", href: plUrl });
}

function App() {
  const [routeInfo, setRouteInfo] = React.useState(currentRouteInfo());
  const [toast, setToast] = React.useState(null);

  React.useEffect(() => {
    if (LEGACY_ROUTES[window.location.hash]) {
      const cleanInfo = routeInfoFromPath(LEGACY_ROUTES[window.location.hash]);
      window.history.replaceState({}, "", window.sitePath(cleanInfo.path));
      setRouteInfo(cleanInfo);
    }
  }, []);

  React.useEffect(() => {
    setMeta(routeInfo);
  }, [routeInfo.path]);

  React.useEffect(() => {
    function navigate(nextInfo, href) {
      window.history.pushState({}, "", href || window.sitePath(nextInfo.path));
      setRouteInfo(nextInfo);
      window.scrollTo({ top: 0, left: 0 });
    }

    function onPopState() {
      setRouteInfo(currentRouteInfo());
      window.scrollTo({ top: 0, left: 0 });
    }

    function onHashChange() {
      if (!LEGACY_ROUTES[window.location.hash]) return;
      const nextInfo = routeInfoFromPath(LEGACY_ROUTES[window.location.hash]);
      window.history.replaceState({}, "", window.sitePath(nextInfo.path));
      setRouteInfo(nextInfo);
      window.scrollTo({ top: 0, left: 0 });
    }

    function onDocumentClick(event) {
      const anchor = event.target.closest && event.target.closest("a[href]");
      if (!anchor || anchor.target || anchor.hasAttribute("download")) return;

      const url = new URL(anchor.href, window.location.href);
      if (url.origin !== window.location.origin) return;
      if (anchor.getAttribute("href").startsWith("#")) return;

      const nextPath = normalizePath(url.pathname);
      const nextInfo = nextPath ? ROUTE_BY_PATH[nextPath] : null;
      if (!nextInfo) return;

      event.preventDefault();
      if (nextInfo.path === routeInfo.path && url.hash) {
        const target = document.querySelector(url.hash);
        target && target.scrollIntoView({ behavior: "smooth", block: "start" });
        return;
      }
      navigate(nextInfo, url.pathname + url.search + url.hash);
    }

    window.addEventListener("popstate", onPopState);
    window.addEventListener("hashchange", onHashChange);
    document.addEventListener("click", onDocumentClick);
    return () => {
      window.removeEventListener("popstate", onPopState);
      window.removeEventListener("hashchange", onHashChange);
      document.removeEventListener("click", onDocumentClick);
    };
  }, [routeInfo.path]);

  function pushToast(message) {
    const fallback = routeInfo.locale === "en"
      ? "Thank you - your message has been sent. I will reply within one business day."
      : "Dziękuję — wiadomość została wysłana. Skontaktuję się w ciągu 1 dnia roboczego.";
    setToast(message || fallback);
    setTimeout(() => setToast(null), 4200);
  }

  const props = { pushToast, locale: routeInfo.locale };
  let page;
  switch (routeInfo.key) {
    case "developers": page = <DeveloperPage {...props} />; break;
    case "portfolios": page = <PortfolioPage {...props} />; break;
    case "property":   page = <PropertyPage {...props} />; break;
    case "legaltech":  page = <LegalTechPage {...props} />; break;
    case "about":      page = <AboutPage {...props} />; break;
    case "contact":    page = <ContactPage {...props} />; break;
    default:           page = <HomePage {...props} />;
  }

  return (
    <>
      <Header route={routeInfo.path} routeKey={routeInfo.key} locale={routeInfo.locale} />
      <main>{page}</main>
      <Footer locale={routeInfo.locale} />
      <MobileCta locale={routeInfo.locale} />
      {toast ? <div className="uk-toast">{toast}</div> : null}
    </>
  );
}

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<App />);
