import {
  evaluateGraphUserForAutoAdd,
  GraphUserForFilter,
} from '@/modules/meeting-attendance/services/outlook-attendee-auto-add-filter';

const realPerson: GraphUserForFilter = {
  accountEnabled: true,
  userType: 'Member',
  mail: 'alice.smith@ff.com',
  mailNickname: 'alice.smith',
  displayName: 'Alice Smith',
};

describe('evaluateGraphUserForAutoAdd - 硬过滤', () => {
  it('真人通过判定', () => {
    expect(evaluateGraphUserForAutoAdd(realPerson, 'alice.smith@ff.com')).toEqual({
      decision: 'eligible',
    });
  });

  it('accountEnabled=false → skipped_disabled', () => {
    const result = evaluateGraphUserForAutoAdd(
      { ...realPerson, accountEnabled: false },
      'alice.smith@ff.com',
    );
    expect(result.decision).toBe('skipped_disabled');
  });

  it('userType=Guest → skipped_guest', () => {
    const result = evaluateGraphUserForAutoAdd(
      { ...realPerson, userType: 'Guest' },
      'alice.smith@ff.com',
    );
    expect(result.decision).toBe('skipped_guest');
  });

  it('mail 为空 → skipped_no_mail', () => {
    const result = evaluateGraphUserForAutoAdd(
      { ...realPerson, mail: null },
      'alice.smith@ff.com',
    );
    expect(result.decision).toBe('skipped_no_mail');
  });

  it('mail 为空白字符 → skipped_no_mail', () => {
    const result = evaluateGraphUserForAutoAdd(
      { ...realPerson, mail: '   ' },
      'alice.smith@ff.com',
    );
    expect(result.decision).toBe('skipped_no_mail');
  });

  it('mail 与 requestedEmail 大小写不同时仍匹配', () => {
    const result = evaluateGraphUserForAutoAdd(
      { ...realPerson, mail: 'Alice.Smith@FF.com' },
      'ALICE.SMITH@ff.COM',
    );
    expect(result.decision).toBe('eligible');
  });

  it('mail 与 requestedEmail 不一致 → skipped_email_mismatch', () => {
    const result = evaluateGraphUserForAutoAdd(
      { ...realPerson, mail: 'someone-else@ff.com' },
      'alice.smith@ff.com',
    );
    expect(result.decision).toBe('skipped_email_mismatch');
  });
});

describe('evaluateGraphUserForAutoAdd - mailNickname 前缀黑名单', () => {
  const cases: Array<[string, string]> = [
    ['Conf_Floor2_Treehouse', 'mailNickname_prefix:conf_'],
    ['conf.room.A', 'mailNickname_prefix:conf.'],
    ['Room_3F_East', 'mailNickname_prefix:room_'],
    ['Equip_Projector_East', 'mailNickname_prefix:equip_'],
    ['Resource_Camera', 'mailNickname_prefix:resource_'],
    ['Shared_Sales', 'mailNickname_prefix:shared_'],
    ['Team_Engineering', 'mailNickname_prefix:team_'],
    ['svc-rapid7', 'mailNickname_prefix:svc-'],
    ['svc.adadmin', 'mailNickname_prefix:svc.'],
  ];

  it.each(cases)('mailNickname=%s → matchedRule=%s', (nickname, expectedRule) => {
    const result = evaluateGraphUserForAutoAdd(
      { ...realPerson, mailNickname: nickname, mail: 'x@ff.com' },
      'x@ff.com',
    );
    expect(result.decision).toBe('skipped_resource_naming');
    expect(result.matchedRule).toBe(expectedRule);
  });

  it('! 前缀（资源邮箱）拒绝', () => {
    const result = evaluateGraphUserForAutoAdd(
      { ...realPerson, mailNickname: '!Conf_Mommy_Room', mail: 'x@ff.com' },
      'x@ff.com',
    );
    expect(result).toEqual({
      decision: 'skipped_resource_naming',
      matchedRule: 'mailNickname_prefix:!',
    });
  });

  it('mailNickname 含 _svc 子串（如 my_svc.account）→ matchedRule mailNickname_contains:_svc', () => {
    const result = evaluateGraphUserForAutoAdd(
      { ...realPerson, mailNickname: 'my_svc.account', mail: 'x@ff.com' },
      'x@ff.com',
    );
    expect(result.matchedRule).toBe('mailNickname_contains:_svc');
  });
});

describe('evaluateGraphUserForAutoAdd - displayName 关键词黑名单', () => {
  it('displayName 含 (ServiceAccount) 即拒（即使 mailNickname 像真人）', () => {
    const result = evaluateGraphUserForAutoAdd(
      {
        ...realPerson,
        mailNickname: 'backupnotifications',
        displayName: 'Backup Account (ServiceAccount)',
        mail: 'backup.account@ff.com',
      },
      'backup.account@ff.com',
    );
    expect(result.decision).toBe('skipped_resource_naming');
    expect(result.matchedRule).toBe('displayName:serviceaccount');
  });

  it('displayName 含 Conference Room', () => {
    const result = evaluateGraphUserForAutoAdd(
      {
        ...realPerson,
        mailNickname: 'ffme.cr',
        displayName: 'FFME Conf Room',
        mail: 'ffme.cr@ff.com',
      },
      'ffme.cr@ff.com',
    );
    expect(result.decision).toBe('skipped_resource_naming');
    expect(result.matchedRule).toBe('displayName:conf room');
  });

  it('displayName 含中文 会议室', () => {
    const result = evaluateGraphUserForAutoAdd(
      { ...realPerson, displayName: '上海办公室会议室 A', mailNickname: 'sh.conf.a', mail: 'sh.conf.a@ff.com' },
      'sh.conf.a@ff.com',
    );
    // 注意 mailNickname `sh.conf.a` 不命中前缀（conf 前面有 sh.），但 displayName 含 "会议室"
    // 实际 mailNickname 不以 conf_ / conf. 开头，所以 prefix 不命中；displayName 命中"会议室"
    expect(result.decision).toBe('skipped_resource_naming');
    expect(result.matchedRule).toContain('displayName:');
  });

  it('z_archive_ 历史归档', () => {
    const result = evaluateGraphUserForAutoAdd(
      {
        ...realPerson,
        mailNickname: 'meetingsupport',
        displayName: 'z_archive_Meeting Support',
        mail: 'meetingsupport@ff.com',
      },
      'meetingsupport@ff.com',
    );
    expect(result.decision).toBe('skipped_resource_naming');
    // displayName 同时命中 "z_archive_" 和 "meeting" 相关 — 由黑名单顺序决定，z_archive_ 应优先命中
    expect(result.matchedRule).toBe('displayName:z_archive_');
  });
});

describe('evaluateGraphUserForAutoAdd - 乐观放行（含弱信号词的真人）', () => {
  it('Andy.admin（含 admin 但是真人）通过', () => {
    expect(
      evaluateGraphUserForAutoAdd(
        {
          accountEnabled: true,
          userType: 'Member',
          mail: 'andy.admin@ff.com',
          mailNickname: 'Andy.admin',
          displayName: 'Andy admin',
        },
        'andy.admin@ff.com',
      ),
    ).toEqual({ decision: 'eligible' });
  });

  it('Robert Holshouser (Contractor) 通过', () => {
    expect(
      evaluateGraphUserForAutoAdd(
        {
          accountEnabled: true,
          userType: 'Member',
          mail: 'robert.holshouser@ff.com',
          mailNickname: 'Robert.Holshouser',
          displayName: 'Robert Holshouser (Contractor)',
        },
        'robert.holshouser@ff.com',
      ),
    ).toEqual({ decision: 'eligible' });
  });

  it('cn-bin.qiao 中国员工真人通过', () => {
    expect(
      evaluateGraphUserForAutoAdd(
        {
          accountEnabled: true,
          userType: 'Member',
          mail: 'bin.qiao@ff.com',
          mailNickname: 'cn-bin.qiao',
          displayName: 'Bin Qiao (Consultant)',
        },
        'bin.qiao@ff.com',
      ),
    ).toEqual({ decision: 'eligible' });
  });

  it('andy.test 真人通过（test 是单词不进黑名单）', () => {
    expect(
      evaluateGraphUserForAutoAdd(
        {
          accountEnabled: true,
          userType: 'Member',
          mail: 'andy.test@ff.com',
          mailNickname: 'andy.test',
          displayName: 'Andy Test',
        },
        'andy.test@ff.com',
      ),
    ).toEqual({ decision: 'eligible' });
  });
});

describe('evaluateGraphUserForAutoAdd - 边界与防御', () => {
  it('mailNickname 缺失也走 displayName 检查', () => {
    const result = evaluateGraphUserForAutoAdd(
      {
        accountEnabled: true,
        userType: 'Member',
        mail: 'meeting@ff.com',
        mailNickname: null,
        displayName: 'Meeting Room',
      },
      'meeting@ff.com',
    );
    expect(result.decision).toBe('skipped_resource_naming');
    expect(result.matchedRule).toBe('displayName:meeting room');
  });

  it('displayName 缺失但 mailNickname 命中前缀', () => {
    const result = evaluateGraphUserForAutoAdd(
      {
        accountEnabled: true,
        userType: 'Member',
        mail: 'x@ff.com',
        mailNickname: 'Room_East',
        displayName: null,
      },
      'x@ff.com',
    );
    expect(result.decision).toBe('skipped_resource_naming');
    expect(result.matchedRule).toBe('mailNickname_prefix:room_');
  });

  it('全部字段都缺失（极端） → 走过硬过滤后无规则命中 → eligible', () => {
    const result = evaluateGraphUserForAutoAdd(
      {
        accountEnabled: true,
        userType: 'Member',
        mail: 'x@ff.com',
        mailNickname: null,
        displayName: null,
      },
      'x@ff.com',
    );
    expect(result.decision).toBe('eligible');
  });
});
