import { createApi } from "@reduxjs/toolkit/query/react";
import { baseQueryWithAuth } from "@/core/auth-interceptor";
import type { AdminRole } from "@/core/authSlice";

export interface AdminUser {
  id: number;
  fullname: string;
  email: string;
  role: AdminRole;
  is_email_verified: boolean;
  is_active: boolean;
  last_login_at: string | null;
  created_at: string;
  updated_at: string;
}

export interface ListAdminsArgs {
  page?: number;
  limit?: number;
  q?: string;
}

export interface ListAdminsResponse {
  admins: AdminUser[];
  total: number;
  page: number;
  limit: number;
}

export interface InviteAdminRequest {
  fullname: string;
  email: string;
  role: AdminRole;
}

export interface InviteAdminResponse {
  admin: AdminUser;
  message: string;
}

export interface SetActiveArgs {
  id: number;
  is_active: boolean;
}

export interface SetRoleArgs {
  id: number;
  role: AdminRole;
}

export const adminService = createApi({
  reducerPath: "adminService",
  baseQuery: baseQueryWithAuth,
  tagTypes: ["Admin"],
  endpoints: (build) => ({
    listAdmins: build.query<ListAdminsResponse, ListAdminsArgs>({
      query: (args) => ({
        url: "/admins",
        method: "GET",
        params: { page: args.page, limit: args.limit, q: args.q },
      }),
      providesTags: ["Admin"],
    }),
    inviteAdmin: build.mutation<InviteAdminResponse, InviteAdminRequest>({
      query: (body) => ({ url: "/admins/invite", method: "POST", body }),
      invalidatesTags: ["Admin"],
    }),
    setAdminActive: build.mutation<AdminUser, SetActiveArgs>({
      query: ({ id, is_active }) => ({
        url: `/admins/${id}/active`,
        method: "PATCH",
        body: { is_active },
      }),
      invalidatesTags: ["Admin"],
    }),
    setAdminRole: build.mutation<AdminUser, SetRoleArgs>({
      query: ({ id, role }) => ({
        url: `/admins/${id}/role`,
        method: "PATCH",
        body: { role },
      }),
      invalidatesTags: ["Admin"],
    }),
    deleteAdmin: build.mutation<{ message: string }, number>({
      query: (id) => ({ url: `/admins/${id}`, method: "DELETE" }),
      invalidatesTags: ["Admin"],
    }),
  }),
});

export const {
  useListAdminsQuery,
  useInviteAdminMutation,
  useSetAdminActiveMutation,
  useSetAdminRoleMutation,
  useDeleteAdminMutation,
} = adminService;
