/**
 * v1.3 Outlook 同步参会人自动入组 - 真人识别规则
 *
 * 输入 Graph user 对象 + 待入组邮箱，输出"是否能加入源组"的判定。
 * 详见 docs/modules/meeting-attendance/01-prd.md "自动入组真人参会人（v1.3 新增）"。
 */

export type AutoAddDecision =
  | 'eligible'
  | 'skipped_disabled'
  | 'skipped_guest'
  | 'skipped_no_mail'
  | 'skipped_email_mismatch'
  | 'skipped_resource_naming';

export interface GraphUserForFilter {
  accountEnabled?: boolean;
  userType?: string;
  mail?: string | null;
  mailNickname?: string | null;
  displayName?: string | null;
}

export interface AutoAddFilterResult {
  decision: AutoAddDecision;
  matchedRule?: string;
}

const NICKNAME_PREFIX_BLACKLIST = [
  'conf_', 'conf.',
  'room_', 'room.',
  'equip_',
  'res_', 'resource_',
  'shared_', 'team_', 'list_', 'distro_', 'group_',
  'svc-', 'svc_', 'svc.',
];

const NICKNAME_CONTAINS_BLACKLIST = ['.svc', '_svc'];

const DISPLAYNAME_PHRASE_BLACKLIST = [
  'service account',
  'serviceaccount',
  'shared credential',
  'shared login',
  'conference room',
  'conf room',
  'meeting room',
  'mfp mailbox',
  'z_archive_',
  'systemmailbox{',
  'discoverysearchmailbox{',
  '会议室',
];

export function evaluateGraphUserForAutoAdd(
  graphUser: GraphUserForFilter,
  requestedEmail: string,
): AutoAddFilterResult {
  if (graphUser.accountEnabled !== true) {
    return { decision: 'skipped_disabled' };
  }
  if (graphUser.userType !== 'Member') {
    return { decision: 'skipped_guest' };
  }

  const mail = graphUser.mail?.trim();
  if (!mail) {
    return { decision: 'skipped_no_mail' };
  }
  if (mail.toLowerCase() !== requestedEmail.trim().toLowerCase()) {
    return { decision: 'skipped_email_mismatch' };
  }

  const nick = (graphUser.mailNickname ?? '').toLowerCase();
  if (nick) {
    if (nick.startsWith('!')) {
      return { decision: 'skipped_resource_naming', matchedRule: 'mailNickname_prefix:!' };
    }
    for (const prefix of NICKNAME_PREFIX_BLACKLIST) {
      if (nick.startsWith(prefix)) {
        return {
          decision: 'skipped_resource_naming',
          matchedRule: `mailNickname_prefix:${prefix}`,
        };
      }
    }
    for (const fragment of NICKNAME_CONTAINS_BLACKLIST) {
      if (nick.includes(fragment)) {
        return {
          decision: 'skipped_resource_naming',
          matchedRule: `mailNickname_contains:${fragment}`,
        };
      }
    }
  }

  const display = (graphUser.displayName ?? '').toLowerCase();
  if (display) {
    for (const phrase of DISPLAYNAME_PHRASE_BLACKLIST) {
      if (display.includes(phrase.toLowerCase())) {
        return {
          decision: 'skipped_resource_naming',
          matchedRule: `displayName:${phrase}`,
        };
      }
    }
  }

  return { decision: 'eligible' };
}
