import { Navigate, Outlet, RouterProvider, createBrowserRouter } from "react-router-dom";
import {
  DealerLayout,
  DealersList,
  ErrorPage,
  LoginPageWithLanguageSelector as LoginPage,
  LogoutPage,
  QuoteCreate,
  QuoteEdit,
  SettingsEditor,
  SettingsLayout,
} from "./app";
import { CatalogLayout, CatalogList } from "./app/catalog";
import { DashboardPage } from "./app/dashboard";
import { QuotesLayout } from "./app/quotes";
import { QuotesList } from "./app/quotes/list";
import { ProtectedRoute } from "./components";

export const Routes = () => {
  // Define public routes accessible to all users
  const routesForPublic = [
    {
      path: "/",
      element: <Navigate to='/quotes' replace={true} />,
    },
  ];

  const routesForErrors = [
    {
      path: "*",
      Component: ErrorPage,
    },
  ];

  // Define routes accessible only to authenticated users
  const routesForAuthenticatedOnly = [
    {
      path: "/home",
      element: (
        <ProtectedRoute>
          <DashboardPage />
        </ProtectedRoute>
      ),
    },
    {
      path: "/catalog",
      element: (
        <CatalogLayout>
          <Outlet />
        </CatalogLayout>
      ),
      children: [
        {
          index: true,
          element: <CatalogList />,
        },
      ],
    },
    {
      path: "/dealers",
      element: (
        <DealerLayout>
          <Outlet />
        </DealerLayout>
      ),
      children: [
        {
          index: true,
          element: <DealersList />,
        },
      ],
    },
    {
      path: "/quotes",
      element: (
        <QuotesLayout>
          <Outlet />
        </QuotesLayout>
      ),
      children: [
        {
          index: true,
          element: <QuotesList />,
        },
        {
          path: "add",
          element: <QuoteCreate />,
        },
        {
          path: "edit/:id",
          element: <QuoteEdit />,
        },
      ],
    },
    {
      path: "/settings",
      element: (
        <SettingsLayout>
          <Outlet />
        </SettingsLayout>
      ),
      children: [
        {
          index: true,
          element: <SettingsEditor />,
        },
      ],
    },
    {
      path: "/logout",
      element: <LogoutPage />,
    },
  ];

  // Define routes accessible only to non-authenticated users
  const routesForNotAuthenticatedOnly = [
    {
      path: "/login",
      Component: LoginPage,
    },
  ];

  // Combine and conditionally include routes based on authentication status
  const router = createBrowserRouter(
    [
      ...routesForPublic,
      ...routesForAuthenticatedOnly,
      ...routesForNotAuthenticatedOnly,
      ...routesForErrors,
    ],
    {
      //basename: "/app",
    }
  );

  // Provide the router configuration using RouterProvider
  return <RouterProvider router={router} />;
};
