import type { IncomingMessage } from "http";
import { SessionProvider } from "next-auth/react";
import type { AppContextType } from "next/dist/shared/lib/utils";
import React, { useEffect } from "react";
import CacheProvider from "react-inlinesvg/provider";

import { trpc } from "@calcom/trpc/react";

import type { AppProps } from "@lib/app-providers";
import PlainChat from "@lib/plain/dynamicProvider";

import "../styles/globals.css";

function MyApp(props: AppProps) {
  const { Component, pageProps } = props;

  useEffect(() => {
    if (typeof window !== "undefined" && "serviceWorker" in navigator) {
      navigator.serviceWorker.register("/service-worker.js");
    }
  }, []);

  return (
    <SessionProvider session={pageProps.session ?? undefined}>
      <PlainChat />
      {/* @ts-expect-error FIXME remove this comment when upgrading typescript to v5 */}
      <CacheProvider>
        {Component.PageWrapper ? <Component.PageWrapper {...props} /> : <Component {...pageProps} />}
      </CacheProvider>
    </SessionProvider>
  );
}

declare global {
  interface Window {
    calNewLocale: string;
  }
}

MyApp.getInitialProps = async (ctx: AppContextType) => {
  const { req } = ctx.ctx;

  let newLocale = "en";

  if (req) {
    const { getLocale } = await import("@calcom/features/auth/lib/getLocale");
    // eslint-disable-next-line @typescript-eslint/no-explicit-any
    newLocale = await getLocale(req as IncomingMessage & { cookies: Record<string, any> });
  } else if (typeof window !== "undefined" && window.calNewLocale) {
    newLocale = window.calNewLocale;
  }

  return {
    pageProps: {
      newLocale,
    },
  };
};

const WrappedMyApp = trpc.withTRPC(MyApp);

export default WrappedMyApp;
