import { ref } from "vue";
import type { Usuario } from "~/types/Usuario";
import type { ApiResponse } from "~/types/ApiResponse";

export const useUsuarios = () => {
  const usuarios = ref<Usuario[]>([]);
  const roles = useState<any[]>('usuarios_roles', () => []);
  const loading = ref(false);
  const error = ref<string | null>(null);

  const obtenerUsuarios = async () => {
    try {
      loading.value = true;
      error.value = null;

      const response = await useHttp<ApiResponse<Usuario[]>>("/admin/usuario", {
        method: "POST",
        body: {
          action: "index",
        },
      });

      usuarios.value = response.data;
      return response;
    } catch (err: any) {
      error.value = err?.data?.message ?? "Error al obtener usuarios";
      throw err;
    } finally {
      loading.value = false;
    }
  };

  const obtenerRoles = async () => {
    try {
      const response = await useHttp<ApiResponse<any[]>>("/admin/usuario", {
        method: "POST",
        body: {
          action: "roles",
        },
      });
      if (response.data && Array.isArray(response.data)) {
        roles.value = response.data.map((r: any) => ({
          ...r,
          id: r.nombre 
        }));
      } else {
        roles.value = [];
      }
      return response;
    } catch (err: any) {
      console.error(err);
      throw err;
    }
  };

  const crearUsuario = async (payload: Usuario) => {
    try {
      loading.value = true;
      error.value = null;

      const response = await useHttp<ApiResponse<Usuario>>("/admin/usuario", {
        method: "POST",
        body: {
          action: "store",
          ...payload,
        },
      });

      if (!response.success) {
        throw new Error(response.message);
      }
      return response;
    } catch (err: any) {
      console.error(err);
      throw err;
    } finally {
      loading.value = false;
    }
  };

  const editarUsuario = async (payload: any) => {
    try {
      loading.value = true;
      error.value = null;

      const response = await useHttp<ApiResponse<Usuario>>("/admin/usuario", {
        method: "POST",
        body: {
          action: "update",
          ...payload,
        },
      });

      if (!response.success) {
        throw new Error(response.message);
      }
      return response;
    } catch (err: any) {
      console.error(err);
      throw err;
    } finally {
      loading.value = false;
    }
  };

  const cambiarEstado = async (id: number) => {
    try {
      loading.value = true;
      error.value = null;

      const response = await useHttp<ApiResponse<any>>("/admin/usuario", {
        method: "POST",
        body: {
          action: "cambiar_estado",
          id,
        },
      });

      if (!response.success) {
        throw new Error(response.message);
      }
      return response;
    } catch (err: any) {
      console.error(err);
      throw err;
    } finally {
      loading.value = false;
    }
  };

  const buscarPorEstado = async (activo: boolean | null) => {
    try {
      loading.value = true;
      error.value = null;

      if (activo === null) {
        return await obtenerUsuarios();
      }

      const response = await useHttp<ApiResponse<Usuario[]>>("/admin/usuario", {
        method: "POST",
        body: {
          action: "buscar_por_estado",
          activo,
        },
      });

      usuarios.value = response.data || [];
      return response;
    } catch (err: any) {
      error.value = err?.data?.message ?? "Error al buscar usuarios";
      throw err;
    } finally {
      loading.value = false;
    }
  };

  return {
    usuarios,
    roles,
    loading,
    error,
    obtenerUsuarios,
    obtenerRoles,
    crearUsuario,
    editarUsuario,
    cambiarEstado,
    buscarPorEstado,
  };
};
