"use client"

import { useState } from "react"
import Link from "next/link"
import { useRouter } from "next/navigation"
import { useDispatch } from "react-redux"
import { useForm } from "react-hook-form"
import { zodResolver } from "@hookform/resolvers/zod"
import { z } from "zod"
import { Loader2Icon } from "lucide-react"

import { Button } from "@/src/components/ui/button"
import { Input } from "@/src/components/ui/input"
import { PasswordField } from "@/src/components/ui/password-field"
import {
  Form,
  FormControl,
  FormField,
  FormItem,
  FormLabel,
  FormMessage,
} from "@/src/components/ui/form"
import {
  Dialog,
  DialogContent,
  DialogHeader,
  DialogTitle,
  DialogDescription,
} from "@/src/components/ui/dialog"
import OTPForm from "@/src/components/authentication/otp-form"
import { useLoginRestaurantMutation, useResendEmailOtpMutation, setCredentials } from "@/src/state/auth"
import type { AppDispatch } from "@/src/state/store"

const loginFormSchema = z.object({
  email: z
    .string()
    .email("Veuillez saisir une adresse e-mail valide")
    .transform((str) => str.toLowerCase().trim()),
  password: z.string().min(1, "Le mot de passe est requis"),
})

type LoginFormValues = z.infer<typeof loginFormSchema>

type ErrorResponse = {
  message?: string
  error_message?: string
  details?: { property: string; constraints: string[] }[]
}

export default function LoginForm() {
  const dispatch = useDispatch<AppDispatch>()
  const router = useRouter()
  const [otpDialogOpen, setOtpDialogOpen] = useState(false)

  const [loginRestaurant, { isLoading }] = useLoginRestaurantMutation()
  const [resendEmailOtp] = useResendEmailOtpMutation()


  const form = useForm<LoginFormValues>({
    resolver: zodResolver(loginFormSchema),
    defaultValues: { email: "", password: "" },
  })

  const handleSubmit = async (values: LoginFormValues) => {
    try {
      const response = await loginRestaurant(values).unwrap()
      if (response?.data) {
        dispatch(setCredentials(response.data))
        router.push("/", { scroll: false })
      }
    } catch (error) {
      const errorResponse = error as { status?: number; data?: ErrorResponse }
      const errMessage = errorResponse?.data?.error_message ?? errorResponse?.data?.message

      if (errMessage === "Email not verified, please verify your email and try again") {
        setOtpDialogOpen(true)
        return
      }

      const data = errorResponse?.data
      if (data?.message === "Validation failed" && data?.details?.length) {
        data.details.forEach((d) => {
          form.setError(d.property as keyof LoginFormValues, {
            type: "manual",
            message: d.constraints.join(", "),
          })
        })
        return
      }

      form.setError("root", {
        type: "submit",
        message: "E-mail ou mot de passe incorrect",
      })
    }
  }

  return (
    <>
      <div className="flex h-full flex-col items-center justify-center px-6 py-12">
        <div className="w-full max-w-sm space-y-8">
          <div className="space-y-1">
            <h1 className="text-2xl font-bold tracking-tight">Bon retour</h1>
            <p className="text-sm text-muted-foreground">
              Connectez-vous à votre compte pour continuer
            </p>
          </div>

          <Form {...form}>
            <form onSubmit={form.handleSubmit(handleSubmit)} className="space-y-4">
              {form.formState.errors.root && (
                <p className="text-sm text-destructive">{form.formState.errors.root.message}</p>
              )}

              <FormField
                control={form.control}
                name="email"
                render={({ field }) => (
                  <FormItem>
                    <FormLabel>E-mail</FormLabel>
                    <FormControl>
                      <Input
                        type="email"
                        placeholder="vous@exemple.com"
                        autoComplete="email"
                        disabled={isLoading}
                        {...field}
                      />
                    </FormControl>
                    <FormMessage />
                  </FormItem>
                )}
              />

              <FormField
                control={form.control}
                name="password"
                render={({ field }) => (
                  <FormItem>
                    <div className="flex justify-between items-center">
                      <FormLabel>Mot de passe</FormLabel>
                      <Link
                        href="/forgot-password"
                        className="text-sm text-muted-foreground hover:text-foreground transition-colors"
                      >
                        Mot de passe oublié ?
                      </Link>
                    </div>
                    <FormControl>
                      <PasswordField
                        placeholder="••••••••"
                        disabled={isLoading}
                        {...field}
                      />
                    </FormControl>
                    <FormMessage />
                  </FormItem>
                )}
              />

              <Button type="submit" size="lg" className="w-full" disabled={isLoading}>
                <span>Se connecter</span>
                {isLoading && <Loader2Icon className="animate-spin" />}
              </Button>
            </form>
          </Form>

          <p className="text-center text-sm text-muted-foreground">
            Vous n&apos;avez pas de compte ?{" "}
            <Link href="/register" className="font-medium text-primary hover:underline">
              S&apos;inscrire
            </Link>
          </p>
        </div>
      </div>

      {otpDialogOpen && (
        <Dialog open={otpDialogOpen} onOpenChange={setOtpDialogOpen}>
          <DialogContent
            className="sm:w-auto sm:max-w-full"
            onInteractOutside={(e) => e.preventDefault()}
          >
            <DialogHeader>
              <DialogTitle>Vérifiez votre e-mail</DialogTitle>
              <DialogDescription>
                Entrez le code de vérification envoyé à votre adresse e-mail.
              </DialogDescription>
            </DialogHeader>
            <OTPForm
              email={form.getValues("email")}
              onResend={async () => {
                await resendEmailOtp({ email: form.getValues("email") }).unwrap()
              }}
            />
          </DialogContent>
        </Dialog>
      )}
    </>
  )
}
