import { ApiError } from '@/shared/utils/errors';
import { defaultStatus } from '@/shared/utils/responseCode/httpStatusAlias';
import { Types } from 'mongoose';
import { Company } from '@/modules/company/company.model';
import User from '@/modules/user/user.model';
import responseCodes from '@/shared/utils/responseCode/responseCode';
import { getObjectId } from '@/shared/utils/commonHelper';

const { TeamResponseCodes } = responseCodes;

interface ValidateTeamUsersOptions {
  company: Types.ObjectId;
  lead?: Types.ObjectId;
  members?: Types.ObjectId[];
}

export const validateTeamUsers = async ({
  company,
  lead,
  members = [],
}: ValidateTeamUsersOptions): Promise<void> => {
  if (lead && members.includes(lead))
    throw new ApiError(
      defaultStatus.BAD_REQUEST,
      'Lead cannot be part of members',
      true,
      '',
      TeamResponseCodes.LEAD_CANNOT_BE_MEMBER,
    );

  const companyExists = await Company.exists({ _id: company });
  if (!companyExists)
    throw new ApiError(
      defaultStatus.BAD_REQUEST,
      'Invalid company ID',
      true,
      '',
      TeamResponseCodes.INVALID_COMPANY,
    );

  const allUserIds = [...(lead ? [lead] : []), ...members];
  if (allUserIds.length > 0) {
    const users = await User.find({
      _id: { $in: allUserIds },
      'company.id': getObjectId(company),
    });
    if (users.length !== allUserIds.length)
      throw new ApiError(
        defaultStatus.BAD_REQUEST,
        'Lead or member(s) do not belong to the specified company',
        true,
        '',
        TeamResponseCodes.INVALID_TEAM_MEMBERS,
      );
  }
};
