import type { IDomainError, CommonDomainErrorKind } from '@core/shared/errors';

export abstract class IdentityDomainError extends Error implements IDomainError<CommonDomainErrorKind> {
  readonly type = 'domain' as const;
  readonly context = 'identity-domain';
  abstract readonly kind: CommonDomainErrorKind;

  constructor(message: string) {
    super(message);
    Object.setPrototypeOf(this, new.target.prototype);
  }
}

export class IdentityDomainValidationError
  extends IdentityDomainError
  implements IDomainError<'validation'>
{
  readonly kind = 'validation' as const;

  constructor(message: string) {
    super(message);
  }
}

export class IdentityDomainInvariantError
  extends IdentityDomainError
  implements IDomainError<'invariant'>
{
  readonly kind = 'invariant' as const;

  constructor(message: string) {
    super(message);
  }
}