import axiosInstance from '@/utills/axiosInstance';
import { removeEmptyKeys } from '@/utills/helper';

export async function getEmployees(filter?: any): Promise<any> {
  try {
    const filterValues = removeEmptyKeys({
      page: filter?.page,
      pageSize: filter?.pageSize,
      search: filter?.search,
      sortColumn: filter?.sortColumn,
      sortOrder: filter?.sortOrder,
      designation_id: filter?.designation_id,
      city_id: filter?.city_id,
      role_id: filter?.role_id,
      status: filter?.status,
      is_blocked: filter?.is_blocked,
      reporting_manager_id: filter?.reporting_manager_id,
      reporting_to: filter?.reporting_to,
      loginUser: filter?.loginUser,
      launch_ids: filter?.launch_ids,
      include_user_ids: filter?.include_user_ids,
    });
    const response = await axiosInstance.get('/api/v1/users', {
      params: filterValues,
    });

    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to fetch Employees');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
}

export async function getEmployeesForReassign(filter?: any): Promise<any> {
  try {
    const filterValues = removeEmptyKeys({
      page: filter?.page,
      pageSize: filter?.pageSize,
      search: filter?.search,
      sortColumn: filter?.sortColumn,
      sortOrder: filter?.sortOrder,
      designation_id: filter?.designation_id,
      city_id: filter?.city_id,
      role_id: filter?.role_id,
      status: filter?.status,
      reporting_manager_id: filter?.reporting_manager_id,
      reporting_to: filter?.reporting_to,
      loginUser: filter?.loginUser,
      userId: filter?.userId,
    });
    const response = await axiosInstance.get('/api/v1/users/users/others-user-dropdown-list', {
      params: filterValues,
    });

    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to fetch Employees');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
}

export async function getCities(_search: string | undefined = undefined): Promise<any> {
  try {
    const response = await axiosInstance.get('/api/v1/masters/cities', {
    });

    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to fetch employee cities');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
}
export async function getDesignation(): Promise<any> {
  return await axiosInstance.get('/api/v1/masters/designations');
}

export async function getCluster(search: string | undefined = undefined): Promise<any> {
  try {
    const response = await axiosInstance.get('/api/v1/masters/clusters', {
      params: {
        search,
      },
    });

    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to fetch employee clusters');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
}

export async function getRoles(): Promise<any> {
  try {
    const response = await axiosInstance.get('/api/v1/roles', {});

    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to fetch employee roles');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
}
export async function getEmployeeList(): Promise<any> {
  try {
    const response = await axiosInstance.get('/api/v1/users', {});

    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to fetch employee ');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
}

export async function getEmployee(id: number | string): Promise<any> {
  const response = await axiosInstance.get(`/api/v1/users/${id}`);
  return response.data;
}

export async function getInactiveValidation(id: number | string): Promise<any> {
  const response = await axiosInstance.get(`/api/v1/users/${id}/inactive-validation`);
  return response.data;
}

export async function addEmployee(data: any): Promise<any> {
  try {
    const response = await axiosInstance.post('/api/v1/users', data);
    if (response.status === 200) {
      return response.data;
    } else {
      throw new Error('Failed to add employee');
    }
  } catch (error) {
    console.error(error);
    throw error;
  }
}

export const updateEmployeeData = async(employeeId: number, employeeData: any): Promise<any> => {
  const response = await axiosInstance.patch(`/api/v1/users/${employeeId}`, employeeData);
  if (response.status === 200) {
    return response.data;
  } else {
    throw new Error('Failed to update employee');
  }
};
export const changePassword = async(data: any): Promise<any> => {
  return await axiosInstance.post(`/api/v1/auth/change-password-by-admin/${data.employeeId}`);
};

export const deleteEmployeeData = async(employeeId: number): Promise<any> => {
  const response = await axiosInstance.delete(`/api/v1/users/${employeeId}`);
  if (response.status === 200) {
    return response?.data;
  } else {
    throw new Error('Failed to delete employee');
  }
};

export const checkTransferValidation = async(id: number | string): Promise<any> => {
  const response = await axiosInstance.get(`/api/v1/users/transfer-validation/${id}`);
  return response.data;
};

export const getSubstitutes = async(userId: number | string, launchId: number | string, roleId: number | string): Promise<any> => {
  const response = await axiosInstance.get(`/api/v1/users/substitutes/${userId}/${launchId}/${roleId}`);
  return response.data;
};

export const resolvePair = async(data: any): Promise<any> => {
  const response = await axiosInstance.post('/api/v1/users/resolve-pair', data);
  return response.data;
};

export const transferSelfLeads = async(data: any): Promise<any> => {
  const response = await axiosInstance.post('/api/v1/users/transfer-self-leads', data);
  return response.data;
};


export const getLeadTransferPreview = async(
  userId: number | string,
  launchId: number | string,
  roleId: number | string,
  tabStatuses: string[],
  currentStatuses?: number[]
): Promise<any> => {
  const params: Record<string, string> = {};
  if (tabStatuses && tabStatuses.length > 0) params.tab_statuses = tabStatuses.join(',');
  if (currentStatuses && currentStatuses.length > 0) params.current_statuses = currentStatuses.join(',');
  const response = await axiosInstance.get(
    `/api/v1/users/lead-transfer-preview/${userId}/${launchId}/${roleId}`,
    { params }
  );
  return response.data;
};

export const getLeadTransferConfirmPreview = async(
  userId: number | string,
  launchId: number | string,
  roleId: number | string,
  tabCounts: Record<string, number>
): Promise<any> => {
  const response = await axiosInstance.post(
    `/api/v1/users/lead-transfer-confirm-preview/${userId}/${launchId}/${roleId}`,
    { tab_counts: tabCounts }
  );
  return response.data;
};

