/**
 * @file Scanner Errors
 * @description Error classes for Scanner
 * @module core/errors
 */

/**
 * Scanner specific error
 */
export class ScannerError extends Error {
  /**
   * Error code
   */
  public code: string;
  /**
   * Module that threw the error
   */
  public module?: string;

  /**
   * Create a ScannerError
   * @param message Error message
   * @param code Error code
   * @param module Module name
   */
  constructor(message: string, code: string, module?: string) {
    super(message);
    this.name = 'ScannerError';
    this.code = code;
    this.module = module;
  }
}

/**
 * Camera access error
 */
export class CameraAccessError extends Error {
  constructor(message = 'Camera access denied') {
    super(message);
    this.name = 'CameraAccessError';
  }
}

/**
 * Device error
 */
export class DeviceError extends Error {
  constructor(message = 'Device error') {
    super(message);
    this.name = 'DeviceError';
  }
}

/**
 * Resource load error
 */
export class ResourceLoadError extends Error {
  public readonly id?: string;
  constructor(message = 'Failed to load resource', id?: string) {
    super(message);
    this.name = 'ResourceLoadError';
    this.id = id;
  }
}

/**
 * Face detection error
 */
export class FaceDetectionError extends Error {
  constructor(message = 'Face detection failed') {
    super(message);
    this.name = 'FaceDetectionError';
  }
}

/**
 * Face comparison error
 */
export class FaceComparisonError extends Error {
  constructor(message = 'Face comparison failed') {
    super(message);
    this.name = 'FaceComparisonError';
  }
}

/**
 * Initialization error
 */
export class InitializationError extends Error {
  constructor(message = 'Initialization failed') {
    super(message);
    this.name = 'InitializationError';
  }
}

/**
 * Liveness detection error
 */
export class LivenessDetectionError extends Error {
  constructor(message = 'Liveness detection failed') {
    super(message);
    this.name = 'LivenessDetectionError';
  }
}

/**
 * Error codes for Scanner
 */
export const ErrorCodes = {
  /** Scanner not initialized */
  NOT_INITIALIZED: 'SCANNER_001',
  /** Module not found */
  MODULE_NOT_FOUND: 'SCANNER_002',
  /** Detection failed */
  DETECTION_FAILED: 'SCANNER_003',
  /** Camera access denied */
  CAMERA_ACCESS_DENIED: 'CAMERA_001',
  /** Camera not available */
  CAMERA_NOT_AVAILABLE: 'CAMERA_002',
} as const;

/**
 * Type for error codes
 */
export type ErrorCode = typeof ErrorCodes[keyof typeof ErrorCodes];