/**
 * Whistleblower System (Hinweisgebersystem) Types
 *
 * TypeScript definitions for Hinweisgeberschutzgesetz (HinSchG)
 * compliant Whistleblower/Hinweisgebersystem module
 */

// =============================================================================
// ENUMS & CONSTANTS
// =============================================================================

export type ReportCategory =
  | 'corruption'        // Korruption
  | 'fraud'             // Betrug
  | 'data_protection'   // Datenschutz
  | 'discrimination'    // Diskriminierung
  | 'environment'       // Umwelt
  | 'competition'       // Wettbewerb
  | 'product_safety'    // Produktsicherheit
  | 'tax_evasion'       // Steuerhinterziehung
  | 'other'             // Sonstiges

export type ReportStatus =
  | 'new'               // Neu eingegangen
  | 'acknowledged'      // Eingangsbestaetigung versendet
  | 'under_review'      // In Pruefung
  | 'investigation'     // Untersuchung laeuft
  | 'measures_taken'    // Massnahmen ergriffen
  | 'closed'            // Abgeschlossen
  | 'rejected'          // Abgelehnt

export type ReportPriority = 'low' | 'normal' | 'high' | 'critical'

// =============================================================================
// REPORT CATEGORY METADATA
// =============================================================================

export interface ReportCategoryInfo {
  category: ReportCategory
  label: string
  description: string
  icon: string
  color: string
  bgColor: string
}

export const REPORT_CATEGORY_INFO: Record<ReportCategory, ReportCategoryInfo> = {
  corruption: {
    category: 'corruption',
    label: 'Korruption',
    description: 'Bestechung, Bestechlichkeit, Vorteilsnahme oder Vorteilsgewaehrung',
    icon: '\u{1F4B0}',
    color: 'text-red-700',
    bgColor: 'bg-red-100'
  },
  fraud: {
    category: 'fraud',
    label: 'Betrug',
    description: 'Betrug, Untreue, Urkundenfaelschung oder sonstige Vermoegensstraftaten',
    icon: '\u{1F3AD}',
    color: 'text-orange-700',
    bgColor: 'bg-orange-100'
  },
  data_protection: {
    category: 'data_protection',
    label: 'Datenschutz',
    description: 'Verstoesse gegen Datenschutzvorschriften (DSGVO, BDSG)',
    icon: '\u{1F512}',
    color: 'text-blue-700',
    bgColor: 'bg-blue-100'
  },
  discrimination: {
    category: 'discrimination',
    label: 'Diskriminierung',
    description: 'Diskriminierung, Mobbing, sexuelle Belaestigung oder Benachteiligung',
    icon: '\u{26A0}\u{FE0F}',
    color: 'text-purple-700',
    bgColor: 'bg-purple-100'
  },
  environment: {
    category: 'environment',
    label: 'Umwelt',
    description: 'Umweltverschmutzung, illegale Entsorgung oder Verstoesse gegen Umweltauflagen',
    icon: '\u{1F33F}',
    color: 'text-green-700',
    bgColor: 'bg-green-100'
  },
  competition: {
    category: 'competition',
    label: 'Wettbewerb',
    description: 'Kartellrechtsverstoesse, unlauterer Wettbewerb, Marktmanipulation',
    icon: '\u{2696}\u{FE0F}',
    color: 'text-indigo-700',
    bgColor: 'bg-indigo-100'
  },
  product_safety: {
    category: 'product_safety',
    label: 'Produktsicherheit',
    description: 'Verstoesse gegen Produktsicherheitsvorschriften, mangelhafte Produkte, fehlende Warnhinweise',
    icon: '\u{1F6E1}\u{FE0F}',
    color: 'text-yellow-700',
    bgColor: 'bg-yellow-100'
  },
  tax_evasion: {
    category: 'tax_evasion',
    label: 'Steuerhinterziehung',
    description: 'Steuerhinterziehung, Steuerumgehung oder sonstige Steuerverstoesse',
    icon: '\u{1F4C4}',
    color: 'text-teal-700',
    bgColor: 'bg-teal-100'
  },
  other: {
    category: 'other',
    label: 'Sonstiges',
    description: 'Sonstige Verstoesse gegen geltendes Recht oder interne Richtlinien',
    icon: '\u{1F4CB}',
    color: 'text-gray-700',
    bgColor: 'bg-gray-100'
  }
}

// =============================================================================
// REPORT STATUS METADATA
// =============================================================================

export const REPORT_STATUS_INFO: Record<ReportStatus, { label: string; description: string; color: string; bgColor: string }> = {
  new: {
    label: 'Neu',
    description: 'Meldung ist eingegangen, Eingangsbestaetigung steht aus',
    color: 'text-blue-700',
    bgColor: 'bg-blue-100'
  },
  acknowledged: {
    label: 'Bestaetigt',
    description: 'Eingangsbestaetigung wurde an den Hinweisgeber versendet',
    color: 'text-cyan-700',
    bgColor: 'bg-cyan-100'
  },
  under_review: {
    label: 'In Pruefung',
    description: 'Meldung wird inhaltlich geprueft und bewertet',
    color: 'text-yellow-700',
    bgColor: 'bg-yellow-100'
  },
  investigation: {
    label: 'Untersuchung',
    description: 'Formelle Untersuchung des gemeldeten Sachverhalts laeuft',
    color: 'text-purple-700',
    bgColor: 'bg-purple-100'
  },
  measures_taken: {
    label: 'Massnahmen ergriffen',
    description: 'Folgemaßnahmen wurden eingeleitet oder abgeschlossen',
    color: 'text-orange-700',
    bgColor: 'bg-orange-100'
  },
  closed: {
    label: 'Abgeschlossen',
    description: 'Fall wurde abgeschlossen und dokumentiert',
    color: 'text-green-700',
    bgColor: 'bg-green-100'
  },
  rejected: {
    label: 'Abgelehnt',
    description: 'Meldung wurde als unbegrundet oder nicht zustaendig abgelehnt',
    color: 'text-red-700',
    bgColor: 'bg-red-100'
  }
}

// =============================================================================
// MAIN INTERFACES
// =============================================================================

export interface FileAttachment {
  id: string
  fileName: string
  fileSize: number
  mimeType: string
  uploadedAt: string
  uploadedBy: string
}

export interface AuditEntry {
  id: string
  action: string
  description: string
  performedBy: string
  performedAt: string
}

export interface AnonymousMessage {
  sentAt?: string
  id: string
  reportId: string
  senderRole: 'reporter' | 'ombudsperson'
  message: string
  createdAt: string
  isRead: boolean
}

export interface WhistleblowerMeasure {
  id: string
  reportId: string
  title: string
  description: string
  status: 'planned' | 'in_progress' | 'completed'
  responsible: string
  dueDate: string
  completedAt?: string
}

export interface WhistleblowerReport {
  id: string
  referenceNumber: string          // z.B. "WB-2026-000042"
  accessKey: string                // Anonymer Zugangscode fuer den Hinweisgeber
  category: ReportCategory
  status: ReportStatus
  priority: ReportPriority
  title: string
  description: string

  // Hinweisgeber-Info (optional bei anonymen Meldungen)
  isAnonymous: boolean
  reporterName?: string
  reporterEmail?: string
  reporterPhone?: string

  // Zuweisung
  assignedTo?: string

  // Zeitstempel
  receivedAt: string
  acknowledgedAt?: string

  // Fristen gemaess HinSchG
  deadlineAcknowledgment: string   // 7 Tage nach Eingang (ss 17 Abs. 1 S. 2)
  deadlineFeedback: string         // 3 Monate nach Eingang (ss 17 Abs. 2)
  closedAt?: string

  // Verknuepfte Daten
  measures: WhistleblowerMeasure[]
  messages: AnonymousMessage[]
  attachments: FileAttachment[]
  auditTrail: AuditEntry[]
}

// =============================================================================
// STATISTICS
// =============================================================================

export interface WhistleblowerStatistics {
  totalReports: number
  newReports: number
  underReview: number
  closed: number
  overdueAcknowledgment: number
  overdueFeedback: number
  byCategory: Record<ReportCategory, number>
  byStatus: Record<ReportStatus, number>
}

// =============================================================================
// DEADLINE TRACKING (HinSchG)
// =============================================================================

/**
 * Gibt die verbleibenden Tage bis zur Eingangsbestaetigung zurueck (7-Tage-Frist)
 * Negative Werte bedeuten ueberfaellig
 */
export function getDaysUntilAcknowledgment(report: WhistleblowerReport): number {
  if (report.acknowledgedAt || report.status !== 'new') {
    return 0
  }
  const deadline = new Date(report.deadlineAcknowledgment)
  const now = new Date()
  const diff = deadline.getTime() - now.getTime()
  return Math.ceil(diff / (1000 * 60 * 60 * 24))
}

/**
 * Gibt die verbleibenden Tage bis zur Rueckmeldungsfrist zurueck (3-Monate-Frist)
 * Negative Werte bedeuten ueberfaellig
 */
export function getDaysUntilFeedback(report: WhistleblowerReport): number {
  if (report.status === 'closed' || report.status === 'rejected') {
    return 0
  }
  const deadline = new Date(report.deadlineFeedback)
  const now = new Date()
  const diff = deadline.getTime() - now.getTime()
  return Math.ceil(diff / (1000 * 60 * 60 * 24))
}

/**
 * Prueft ob die Eingangsbestaetigungsfrist ueberschritten ist (7 Tage, HinSchG ss 17 Abs. 1)
 */
export function isAcknowledgmentOverdue(report: WhistleblowerReport): boolean {
  if (report.acknowledgedAt || report.status !== 'new') {
    return false
  }
  return new Date() > new Date(report.deadlineAcknowledgment)
}

/**
 * Prueft ob die Rueckmeldungsfrist ueberschritten ist (3 Monate, HinSchG ss 17 Abs. 2)
 */
export function isFeedbackOverdue(report: WhistleblowerReport): boolean {
  if (report.status === 'closed' || report.status === 'rejected') {
    return false
  }
  return new Date() > new Date(report.deadlineFeedback)
}

/**
 * Generiert einen anonymen Zugangscode im Format XXXX-XXXX-XXXX
 */
export function generateAccessKey(): string {
  const chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789' // Kein I, O, 0, 1 fuer Lesbarkeit
  let result = ''
  for (let i = 0; i < 12; i++) {
    if (i > 0 && i % 4 === 0) result += '-'
    result += chars.charAt(Math.floor(Math.random() * chars.length))
  }
  return result // Format: XXXX-XXXX-XXXX
}

// =============================================================================
// API TYPES
// =============================================================================

export interface ReportFilters {
  status?: ReportStatus | ReportStatus[]
  category?: ReportCategory | ReportCategory[]
  priority?: ReportPriority
  assignedTo?: string
  isAnonymous?: boolean
  search?: string
  dateFrom?: string
  dateTo?: string
}

export interface ReportListResponse {
  reports: WhistleblowerReport[]
  total: number
  page: number
  pageSize: number
}

export interface PublicReportSubmission {
  category: ReportCategory
  title: string
  description: string
  isAnonymous: boolean
  reporterName?: string
  reporterEmail?: string
  reporterPhone?: string
}

export interface ReportUpdateRequest {
  status?: ReportStatus
  priority?: ReportPriority
  category?: ReportCategory
  assignedTo?: string
}

export interface MessageSendRequest {
  senderRole: 'reporter' | 'ombudsperson'
  message: string
}

// =============================================================================
// HELPER FUNCTIONS
// =============================================================================

export function getCategoryInfo(category: ReportCategory): ReportCategoryInfo {
  return REPORT_CATEGORY_INFO[category]
}

export function getStatusInfo(status: ReportStatus) {
  return REPORT_STATUS_INFO[status]
}
