import axios from '@/network/axios';
import { apis } from '@/utils/apis/apis';
import { SuccessResponse } from '@/utils/types/Responses';
import { UserList, UserModel } from '@/utils/types/User';

export const fetchUsers = async (params?: Record<string, unknown>) => {
  const response = await axios.get<SuccessResponse<UserList>>(
    apis.DASHBOARD.USER_MANAGEMENT.USERS,
    {
      params,
    },
  );
  return response.data?.data;
};

export const addUsers = async (data: FormData) => {
  const response = await axios.post<SuccessResponse<UserModel[]>>(
    apis.DASHBOARD.USER_MANAGEMENT.ADD_USER,
    data,
  );
  return response.data?.data;
};

export const fetchUserById = async (id: string) => {
  const response = await axios.get<SuccessResponse<UserModel>>(
    apis.DASHBOARD.USER_MANAGEMENT.USER(id),
  );
  return response.data?.data;
};

export const updateUsers = async (data: FormData, id: string) => {
  const response = await axios.post<SuccessResponse<UserModel>>(
    apis.DASHBOARD.USER_MANAGEMENT.UPDATE_USER(id),
    data,
  );
  return response.data?.data;
};

export type ArchiveSkipped = {
  self?: number[];
  privileged?: number[];
  not_found?: number[];
  [key: string]: number[] | undefined;
};

export type ArchiveResult = {
  archived?: number;
  unarchived?: number;
  requested?: number;
  ids?: number[];
  skipped?: ArchiveSkipped;
};

export const archiveUsers = async (ids: number[]) => {
  const response = await axios.post<SuccessResponse<ArchiveResult>>(
    apis.DASHBOARD.USER_MANAGEMENT.ARCHIVE,
    { ids },
  );
  return response.data?.data;
};

export const unarchiveUsers = async (ids: number[]) => {
  const response = await axios.post<SuccessResponse<ArchiveResult>>(
    apis.DASHBOARD.USER_MANAGEMENT.UNARCHIVE,
    { ids },
  );
  return response.data?.data;
};

export const fetchArchivedUsers = async (params?: Record<string, unknown>) => {
  const response = await axios.get<SuccessResponse<UserList>>(
    apis.DASHBOARD.USER_MANAGEMENT.ARCHIVED_LIST,
    { params },
  );
  return response.data?.data;
};
