import { BadRequestException, ForbiddenException, UnauthorizedException } from '@nestjs/common';

export type SystemAccountProbe = {
  isSystemAccount?: boolean;
  linkedBotId?: string | null;
};

export const RESERVED_SYSTEM_USERNAMES = new Set(['botfather', 'getmyidbot', 'system-bot-owner']);

export function isProtectedSystemAccount(user: SystemAccountProbe | null | undefined): boolean {
  if (!user) return false;
  return Boolean(user.isSystemAccount || user.linkedBotId);
}

export function assertHumanAccount(
  user: SystemAccountProbe | null | undefined,
  options?: { message?: string; asAuth?: boolean }
): void {
  if (!isProtectedSystemAccount(user)) return;

  const message =
    options?.message ??
    (options?.asAuth
      ? 'Системные учётные записи не могут входить в систему'
      : 'Операция недоступна для системных учётных записей');

  if (options?.asAuth) {
    throw new UnauthorizedException(message);
  }
  throw new ForbiddenException(message);
}

export function assertNotReservedUsername(username: string | null | undefined): void {
  if (!username?.trim()) return;
  if (RESERVED_SYSTEM_USERNAMES.has(username.trim().toLowerCase())) {
    throw new BadRequestException('Этот username зарезервирован системой');
  }
}

export const HUMAN_USER_WHERE = {
  isSystemAccount: false,
  linkedBotId: null
} as const;
