"use client";

import { useState, FormEvent } from "react";
import { z } from "zod";
import { useRouter } from "next/navigation";
import { useAuth } from "./useAuth";
import { AuthService } from "@/src/services/api/auth";

const schema = z
  .object({
    oldPassword: z.string().min(1, "A senha atual é obrigatória."),
    newPassword: z.string().min(6, "A nova senha deve ter pelo menos 6 caracteres."),
    confirmPassword: z.string(),
  })
  .refine((data) => data.newPassword === data.confirmPassword, {
    message: "As senhas não coincidem.",
    path: ["confirmPassword"],
  });

export function useChangePasswordForm() {
  const { user } = useAuth();
  const router = useRouter();
  const [oldPassword, setOldPassword] = useState("");
  const [newPassword, setNewPassword] = useState("");
  const [confirmPassword, setConfirmPassword] = useState("");
  const [error, setError] = useState("");
  const [success, setSuccess] = useState(false);
  const [isLoading, setIsLoading] = useState(false);

  async function handleSubmit(event: FormEvent) {
    event.preventDefault();
    setError("");
    setSuccess(false);

    const validation = schema.safeParse({ oldPassword, newPassword, confirmPassword });
    if (!validation.success) {
      setError(validation.error.issues[0].message);
      return;
    }

    if (!user?.email || !user?.usuariosCadastroId) {
      setError("Usuário não autenticado.");
      return;
    }

    setIsLoading(true);
    try {
      await AuthService.signIn({ username: user.email, password: oldPassword });

      await AuthService.changePassword({
        usuariosCadastroId: user.usuariosCadastroId,
        matricula: user.matricula ?? "",
        email: user.email,
        name: user.name ?? "",
        newPassword,
      });

      setSuccess(true);
      setTimeout(() => router.push("/"), 2000);
    } catch (err: unknown) {
      if (err && typeof err === "object" && "response" in err) {
        const axiosError = err as { response?: { status?: number } };
        if (axiosError.response?.status === 401) {
          setError("Senha atual incorreta.");
        } else {
          setError("Erro ao alterar senha. Tente novamente.");
        }
      } else {
        setError("Erro ao alterar senha. Tente novamente.");
      }
    } finally {
      setIsLoading(false);
    }
  }

  return {
    oldPassword,
    setOldPassword,
    newPassword,
    setNewPassword,
    confirmPassword,
    setConfirmPassword,
    error,
    success,
    isLoading,
    handleSubmit,
  };
}
