/**
 * 错误码清单与 docs/modules/site-attendance/08-error-codes.md 保持一一对应。
 */
export const SiteAttendanceErrorCodes = {
  // QR Token
  QR_TOKEN_MALFORMED: 'QR_TOKEN_MALFORMED',
  QR_TOKEN_INVALID: 'QR_TOKEN_INVALID',
  QR_TOKEN_EXPIRED: 'QR_TOKEN_EXPIRED',
  QR_TOKEN_MISSING: 'QR_TOKEN_MISSING',

  // Ticket
  TICKET_MALFORMED: 'TICKET_MALFORMED',
  TICKET_INVALID: 'TICKET_INVALID',
  TICKET_EXPIRED: 'TICKET_EXPIRED',
  TICKET_ALREADY_USED: 'TICKET_ALREADY_USED',
  TICKET_TARGET_MISMATCH: 'TICKET_TARGET_MISMATCH',
  TICKET_ORIGIN_NOT_ALLOWED: 'TICKET_ORIGIN_NOT_ALLOWED',

  // Dispatch
  DISPATCH_NOT_ENABLED: 'DISPATCH_NOT_ENABLED',
  DISPATCH_CHECKPOINT_NOT_FOUND: 'DISPATCH_CHECKPOINT_NOT_FOUND',
  DISPATCH_CHECKPOINT_INACTIVE: 'DISPATCH_CHECKPOINT_INACTIVE',
  DISPATCH_CHOICE_INVALID: 'DISPATCH_CHOICE_INVALID',
  DISPATCH_PARTNER_INACTIVE: 'DISPATCH_PARTNER_INACTIVE',

  // Partner
  PARTNER_NOT_FOUND: 'PARTNER_NOT_FOUND',
  PARTNER_TARGETURL_INVALID: 'PARTNER_TARGETURL_INVALID',
  PARTNER_TARGETURL_HOST_NOT_ALLOWED: 'PARTNER_TARGETURL_HOST_NOT_ALLOWED',
  PARTNER_COMPANYID_INVALID: 'PARTNER_COMPANYID_INVALID',
  PARTNER_CHECKPOINT_NOT_SHARED: 'PARTNER_CHECKPOINT_NOT_SHARED',

  // Checkpoint
  CHECKPOINT_NOT_FOUND: 'CHECKPOINT_NOT_FOUND',
  CHECKPOINT_QR_ROTATION_INVALID: 'CHECKPOINT_QR_ROTATION_INVALID',
  CHECKPOINT_QR_GRACE_INVALID: 'CHECKPOINT_QR_GRACE_INVALID',
  CHECKPOINT_SHARED_COMPANY_MISSING: 'CHECKPOINT_SHARED_COMPANY_MISSING',
  CHECKPOINT_SHARED_COMPANYID_INVALID: 'CHECKPOINT_SHARED_COMPANYID_INVALID',
  CHECKPOINT_ACCESSMODE_INVALID: 'CHECKPOINT_ACCESSMODE_INVALID',

  // Checkin state machine
  MUST_CHECK_IN_FIRST: 'MUST_CHECK_IN_FIRST',
  ALREADY_CHECKED_IN: 'ALREADY_CHECKED_IN',
  ALREADY_CHECKED_OUT: 'ALREADY_CHECKED_OUT',
  CHECKIN_RATE_LIMITED: 'CHECKIN_RATE_LIMITED',
} as const;

export const COMPANY_ID_PATTERN = /^[a-z0-9_-]+$/;
export const MIN_QR_ROTATION_SECONDS = 60;
