'use client';

import { ReactNode, useEffect } from 'react';
import { useRouter } from 'next/navigation';
import useSWRImmutable from 'swr/immutable';

import { useAuth } from '@/services/hooks/useAuth';
import { httpClientFetcher, SWRHttpKey } from '@/services/http/client';
import { isResponseSuccess } from '@/lib/api-helper';
import { GetMeResponse } from '@/types/api/api-general';

// TODO: delete this later, DONT HARDCODE USER DATA
const DUMMY_USER = {
  id: 1,
  email: 'admin@mbugroup.id',
  npk: '0001',
  name: 'Super Admin',
  image: null,
  created_at: '2025-09-30T03:24:20.899229Z',
  updated_at: '2025-09-30T03:24:20.899229Z',
  roles: [
    {
      id: 1,
      key: 'mbu.super_admin',
      name: 'MBU Administrator',
      client: {
        id: 1,
        name: 'PT Mitra Berlian Unggas',
        alias: 'MBU',
      },
      permissions: [
        {
          id: 1,
          name: 'mbu:purchase:read',
          action: 'read',
          client: {
            id: 1,
            name: 'PT Mitra Berlian Unggas',
            alias: 'MBU',
          },
        },
        {
          id: 2,
          name: 'mbu:purchase:create',
          action: 'create',
          client: {
            id: 1,
            name: 'PT Mitra Berlian Unggas',
            alias: 'MBU',
          },
        },
        {
          id: 3,
          name: 'mbu:purchase:approve',
          action: 'approve',
          client: {
            id: 1,
            name: 'PT Mitra Berlian Unggas',
            alias: 'MBU',
          },
        },
      ],
    },
    {
      id: 2,
      key: 'lti.super_admin',
      name: 'LTI Administrator',
      client: {
        id: 2,
        name: 'PT Lumbung Telur Indonesia',
        alias: 'LTI',
      },
      permissions: [
        {
          id: 4,
          name: 'lti:purchase:read',
          action: 'read',
          client: {
            id: 2,
            name: 'PT Lumbung Telur Indonesia',
            alias: 'LTI',
          },
        },
        {
          id: 5,
          name: 'lti:purchase:create',
          action: 'create',
          client: {
            id: 2,
            name: 'PT Lumbung Telur Indonesia',
            alias: 'LTI',
          },
        },
        {
          id: 6,
          name: 'lti:purchase:approve',
          action: 'approve',
          client: {
            id: 2,
            name: 'PT Lumbung Telur Indonesia',
            alias: 'LTI',
          },
        },
      ],
    },
    {
      id: 3,
      key: 'manbu.super_admin',
      name: 'MANBU Administrator',
      client: {
        id: 3,
        name: 'PT Mandiri Berlian Unggas',
        alias: 'MANBU',
      },
      permissions: [
        {
          id: 7,
          name: 'manbu:purchase:read',
          action: 'read',
          client: {
            id: 3,
            name: 'PT Mandiri Berlian Unggas',
            alias: 'MANBU',
          },
        },
        {
          id: 8,
          name: 'manbu:purchase:create',
          action: 'create',
          client: {
            id: 3,
            name: 'PT Mandiri Berlian Unggas',
            alias: 'MANBU',
          },
        },
        {
          id: 9,
          name: 'manbu:purchase:approve',
          action: 'approve',
          client: {
            id: 3,
            name: 'PT Mandiri Berlian Unggas',
            alias: 'MANBU',
          },
        },
      ],
    },
  ],
};

interface RequireAuthProps {
  children?: ReactNode;
}

const RequireAuth = ({ children }: RequireAuthProps) => {
  const router = useRouter();
  const { setUser, setIsLoadingUser } = useAuth();

  const { data: userResponse, isLoading: isLoadingUserResponse } =
    useSWRImmutable<GetMeResponse & { ok?: boolean }, unknown, SWRHttpKey>(
      '/auth/sso/userinfo',
      httpClientFetcher,
      {
        shouldRetryOnError: false,
        revalidateOnFocus: false,
        revalidateOnReconnect: false,
        refreshInterval: 0,
      }
    );

  useEffect(() => {
    setIsLoadingUser(isLoadingUserResponse);
  }, [isLoadingUserResponse, setIsLoadingUser]);

  useEffect(() => {
    if (isResponseSuccess(userResponse)) {
      setUser(userResponse.data);
    } else {
      // router.replace(process.env.NEXT_PUBLIC_SSO_LOGIN_URL as string);
      // TODO: remove this later, DONT HARDCODE USER DATA
      setUser(DUMMY_USER);
    }
  }, [userResponse, setIsLoadingUser, setUser]);

  // TODO: uncomment this later
  // if (isLoadingUserResponse && !userResponse) {
  //   return (
  //     <div className='w-full flex flex-row justify-center items-center p-4'>
  //       <span className='loading loading-spinner loading-xl' />
  //     </div>
  //   );
  // }

  return <>{children}</>;
};

export default RequireAuth;
