import { Checkbox, Textinput } from '@/components';
import Button from '@/components/ui/Button';
import Head from 'next/head';
import Link from 'next/link';
import { useRouter } from 'next/router';
import { Form } from 'react-bootstrap';
import { SubmitHandler, useForm } from 'react-hook-form';
import { useState } from 'react';
import { useCookies } from 'react-cookie';
import { yupResolver } from '@hookform/resolvers/yup';
import toast from 'react-hot-toast';
import { signIn } from 'next-auth/react';

import { loginSchema } from '@/lib/validator';
import { useLoginMutation } from '@/lib/redux/services/auth.api';
import errorHandler from '@/utils/request/errorHandler';

interface LoginUser {
  email: string;
  password: string;
}

const User = () => {
  const router = useRouter();
  const [isLoading, setLoading] = useState(false);
  const [rememberMe, setRememberMe] = useState(false);
  const [cookies, setCookie, removeCookie] = useCookies([
    'user_email',
    'remember_me_email',
    'user_role',
  ]);

  const [login] = useLoginMutation();

  const {
    register,
    handleSubmit,
    formState: { errors },
  } = useForm<LoginUser>({
    resolver: yupResolver(loginSchema),
    defaultValues: {
      email: cookies.remember_me_email || '',
      password: '',
    },
  });

  console.log(errors);

  const onSubmit: SubmitHandler<LoginUser> = async ({ email, password }) => {
    console.log('Form Submitted with:', { email, password });

    setLoading(true);
    try {
      const res = await login({ email, password }).unwrap();
      console.log('API Response:', res);

      if (res.success) {
        if (rememberMe) {
          console.log('Setting Remember Me Cookie');
          setCookie('remember_me_email', email);
        } else {
          console.log('Removing Remember Me Cookie');
          removeCookie('remember_me_email');
        }

        const response = await signIn("credentials", {
          accessToken: "",
          user: JSON.stringify({ ...res?.data }),
          redirect: false, // Prevent NextAuth from overriding navigation
        });

        console.log('signIn Response:', response);

        if (response?.error) {
          throw new Error(response.error);
        }

        toast.success('Login successful!');
        router.push('/user');
      } else {
        toast.error(res.error.message || 'Server Error');
        setLoading(false);
      }
    } catch (err: any) {
      console.error('Login Error:', err);

      if (err?.error?.message === 'Verify your account first!' && err?.status === 401) {
        toast.error(err?.error?.message || 'Failed to login');
        setLoading(false);
        removeCookie('user_email');
        setCookie('user_email', email);
        router.push('/auth/otp?s=not_verified');
      } else {
        setLoading(false);
        errorHandler(err)
      }
    }
  };

  return (
    <>
      <Head>
        <title>User Login | Deliver X</title>
      </Head>

      <div className="h-100 d-flex flex-column justify-content-center align-items-center">
        <h2 className="display-6 fw-bolder">Login</h2>
        <p>Please enter your email and password</p>

        <form onSubmit={handleSubmit(onSubmit)} className="w-100">
          {/* Email Field */}
          <Form.Group controlId="formEmail" className="mt-4">
            <Form.Label>Email address</Form.Label>
            <Textinput
              iconLeft={<img src="/images/icons/email.png" alt="email icon" />}
              type="email"
              placeholder="Enter email"
              register={register('email')}
              error={errors.email?.message}
            />
          </Form.Group>

          {/* Password Field */}
          <Form.Group controlId="formPassword" className="mt-4">
            <Form.Label>Password</Form.Label>
            <Textinput
              iconLeft={<img src="/images/icons/lock.png" alt="lock icon" />}
              iconRight={<img src="/images/icons/eye.png" alt="eye icon" />}
              type="password"
              placeholder="Enter password"
              register={register('password')}
              error={errors.email?.message}
            />
          </Form.Group>

          {/* Remember Me + Forgot Password */}
          <div className="d-flex justify-content-between align-items-center mt-4">
            <div className="d-flex justify-content-center align-items-center gap-3">
              <Checkbox
                label="Remember me"
                onChange={(checked) => setRememberMe(checked)}
              />
            </div>

            <Link
              href="/auth/forgot-password"
              className="text-primary-color fw-bold text-decoration-underline"
            >
              Forgot Password?
            </Link>
          </div>

          {/* Login Button */}
          <div className="d-flex justify-content-center align-items-center">
            <Button
              type="submit"
              size="lg"
              className="mt-5 btn btn-feature auth-btn"
              disabled={isLoading}
            >
              {isLoading ? 'Logging in...' : 'Login'}
            </Button>
          </div>
        </form>

        {/* Footer */}
        <div className="authFooter d-flex justify-content-center align-items-center gap-3 mt-5">
          <p className="pb-0 mb-0 fw-normal">Don’t have an account?</p>
          <Link href="/auth/select-user-type" className="text-primary-color fw-bold">
            Sign up
          </Link>
        </div>
      </div>
    </>
  );
};

export default User;
