import { Suspense, lazy, ElementType } from 'react';
import { Navigate, useRoutes, useLocation } from 'react-router-dom';
// layouts
import DashboardLayout from '../layouts/dashboard';
import LogoOnlyLayout from '../layouts/LogoOnlyLayout';
// components
import LoadingScreen from '../components/LoadingScreen';
import GuestGuard from '../guards/GuestGuard';
import { AuthProvider } from '../contexts/LaravelAuthContext';
import AuthGuard from '../guards/AuthGuard';
// import DialogDetailClaim from '../sections/dashboard/DialogDetailClaim';

// ----------------------------------------------------------------------

const Loadable = (Component: ElementType) => (props: any) => {
  // eslint-disable-next-line react-hooks/rules-of-hooks
  const { pathname } = useLocation();

  return (
    <Suspense fallback={<LoadingScreen isDashboard={pathname.includes('/dashboard')} />}>
      <Component {...props} />
    </Suspense>
  );
};

export default function Router() {
  return useRoutes([
    {
      path: 'auth',
      children: [
        {
          path: 'login',
          element: (
            <AuthProvider>
              <GuestGuard>
                <Login />
              </GuestGuard>
            </AuthProvider>
          ),
        },
      ],
    },
    {
      path: '/',
      element: (
        <AuthProvider>
          <AuthGuard>
            <DashboardLayout />
          </AuthGuard>
        </AuthProvider>
      ),
      children: [
        { element: <Navigate to="/dashboard" replace />, index: true },
        {
          path: 'dashboard',
          element: <Dashboard />,
        },
      ],
    },
    {
      path: 'user-profile/:id',
      element: (
        <AuthProvider>
          <AuthGuard>
            <DashboardLayout />
          </AuthGuard>
        </AuthProvider>
      ),
      children: [
        {
          element: <AlarmCenterUserProfile />,
          index: true,
        },
      ],
    },
    {
      path: '/employee-data',
      element: (
        <AuthProvider>
          <AuthGuard>
            <DashboardLayout />
          </AuthGuard>
        </AuthProvider>
      ),
      children: [
        {
          element: <EmployeeData />,
          index: true,
        },
        {
          path: '/employee-data/user-profile/:id',
          element: <EmployeeDataUserProfile />,
        },
      ],
    },
    {
      path: '/alarm-center',
      element: (
        <AuthProvider>
          <AuthGuard>
            <DashboardLayout />
          </AuthGuard>
        </AuthProvider>
      ),
      children: [
        {
          element: <AlarmCenter />,
          index: true,
        },
        {
          path: 'member/:id',
          element: <AlarmCenterMemberPerList />,
        },
        {
          path: 'member/:memberId/service-monitoring/:requestLogId',
          element: <AlarmCenterServiceMonitoring />,
        },
      ],
    },

    {
      path: '/claim-submit',
      element: (
        <AuthProvider>
          <AuthGuard>
            <DashboardLayout />
          </AuthGuard>
        </AuthProvider>
      ),
      children: [
        {
          element: <ClaimSubmit />,
          index: true,
        },
        {
          path: 'dialog-detail',
          element: <DialogDetailClaim />,
        },
      ],
    },
    {
      path: '/claim-request/:id',
      element: (
        <AuthProvider>
          <AuthGuard>
            <DashboardLayout />
          </AuthGuard>
        </AuthProvider>
      ),
      children: [
        {
          element: <ClaimRequest />,
          index: true,
        },
        {
          path: 'dialog-detail',
          element: <DialogDetailClaim />,
        },
      ],
    },
    {
      path: '/claim-report',
      element: (
        <AuthProvider>
          <AuthGuard>
            <DashboardLayout />
          </AuthGuard>
        </AuthProvider>
      ),
      children: [
        {
          element: <ClaimReport />,
          index: true,
        },
        {
          path: '/claim-report/detail/:id',
          element: <DetailClaimReport />,
        },
        {
          path: '/claim-report/detail-history/:id',
          element: <DetailHitoryClaimReport />,
        },
      ],
    },
    {
      path: '/claims',
      element: (
        <AuthProvider>
          <AuthGuard>
            <DashboardLayout />
          </AuthGuard>
        </AuthProvider>
      ),
      children: [
        {
          element: <Claims />,
          index: true,
        },
        {
          path: ':id',
          element: <ClaimShow />,
        },
      ],
    },
    {
      path: '/corporate',
      element: (
        <AuthProvider>
          <AuthGuard>
            <DashboardLayout />
          </AuthGuard>
        </AuthProvider>
      ),
      children: [
        {
          element: <Corporate />,
          index: true,
        },
        {
          path: 'edit',
          element: <CorporateEdit />,
        },
        {
          path: 'view',
          element: <CorporateShow />,
        },
      ],
    },
    {
      path: '*',
      element: <LogoOnlyLayout />,
      children: [
        { path: '404', element: <NotFound /> },
        { path: '*', element: <Navigate to="/404" replace /> },
      ],
    },
    { path: '*', element: <Navigate to="/404" replace /> },
  ]);
}

// Auth
const Login = Loadable(lazy(() => import('../pages/auth/Login')));

// Dashboard
const Dashboard = Loadable(lazy(() => import('../pages/Dashboard/Index')));
const NotFound = Loadable(lazy(() => import('../pages/Page404')));

// Employee Data
const EmployeeData = Loadable(lazy(() => import('../pages/EmployeeData/Index')));
const EmployeeDataUserProfile = Loadable(lazy(() => import('../pages/EmployeeData/UserProfile')));

// Alarm Center
const AlarmCenter = Loadable(lazy(() => import('../pages/AlarmCenter/Index')));
const AlarmCenterMemberPerList = Loadable(lazy(() => import('../pages/AlarmCenter/ListMember')));
const AlarmCenterServiceMonitoring = Loadable(
  lazy(() => import('../pages/AlarmCenter/ServiceMonitoring'))
);
const AlarmCenterUserProfile = Loadable(lazy(() => import('../pages/AlarmCenter/UserProfile')));

// Claim Report
const ClaimReport = Loadable(lazy(() => import('../pages/ClaimReport/Index')));
const Claims = Loadable(lazy(() => import('../pages/Claims/Index')));
const ClaimShow = Loadable(lazy(() => import('../pages/Claims/Show')));
const DialogDetailClaim = Loadable(lazy(() => import('../pages/ClaimReport/DialogDetailClaim')));
const DetailClaimReport = Loadable(lazy(() => import('../pages/ClaimReport/Detail')));
const DetailHitoryClaimReport = Loadable(lazy(() => import('../pages/ClaimReport/DetailHistory')));

// Claim submit
const ClaimSubmit = Loadable(lazy(() => import('../pages/ClaimSubmit/Index')));

// Claim Request
const ClaimRequest = Loadable(lazy(() => import('../pages/ClaimSubmit/DialogDetailClaim')));

// Corporate
const Corporate = Loadable(lazy(() => import('../pages/Corporate/Index')));
const CorporateEdit = Loadable(lazy(() => import('../pages/Corporate/Form')));
const CorporateShow = Loadable(lazy(() => import('../pages/Corporate/Show')));
