"use client";

import { AuthService, UserAlreadyHasAccessError } from "@/src/services/api/auth";
import { isDuplicateKeyError } from "@/src/services/api/http/factory";
import { useQuery, useQueryClient } from "@tanstack/react-query";
import { useState, FormEvent } from "react";
import { z } from "zod";
import { useLanguage } from "@/src/hooks/useLanguage";
import { isAxiosError } from "axios";


const registerSchema = z.object({
  name: z.string().min(2, "Nome deve ter pelo menos 2 caracteres.").max(100, "Nome muito longo."),
  email: z.email("E-mail inválido."),
});

export function useAdminPage() {
  const { t } = useLanguage();
  const queryClient = useQueryClient();
  const [name, setName] = useState("");
  const [email, setEmail] = useState("");
  const [error, setError] = useState("");
  const [isSubmitting, setIsSubmitting] = useState(false);
  const [deletingId, setDeletingId] = useState<number | null>(null);

  const { data, isLoading } = useQuery({
    queryKey: ["allUsers"],
    queryFn: async () => {
      const result = await AuthService.getAllUsers();
      return result.filter((u) => u.role === "EMBRAPA");
    },
  });

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

    const validation = registerSchema.safeParse({ name, email });
    if (!validation.success) {
      setError(validation.error.issues[0].message);
      return;
    }

    setIsSubmitting(true);

    try {
      await AuthService.registerUser(name, email);
      setName("");
      setEmail("");
      queryClient.invalidateQueries({ queryKey: ["allUsers"] });
    } catch (err: unknown) {
      console.error("Erro ao registrar usuário:", err);
      if (err instanceof UserAlreadyHasAccessError) {
        setError(t("admin.user_already_has_access"));
      } else if (isAxiosError(err) && isDuplicateKeyError(err.response?.data)) {
        setError(t("admin.email_already_registered"));
      } else {
        setError("Erro ao registrar usuário. Verifique os dados e tente novamente.");
      }
    } finally {
      setIsSubmitting(false);
    }
  }

  async function handleDelete(id: number) {
    if (!window.confirm(t("admin.delete_confirm"))) {
      return;
    }

    setDeletingId(id);
    try {
      await AuthService.deleteUser(String(id));
      queryClient.invalidateQueries({ queryKey: ["allUsers"] });
    } catch (err: unknown) {
      console.error("Erro ao deletar usuário:", err);
      alert(t("admin.delete_error"));
    } finally {
      setDeletingId(null);
    }
  }

  return {
    data,
    name,
    setName,
    email,
    setEmail,
    error,
    isLoading,
    isSubmitting,
    deletingId,
    handleSubmit,
    handleDelete,
  };
}
