/**
 * Processing Activity Types (VVT / RoPA)
 *
 * Types for Art. 30 DSGVO processing activities:
 * - Enums for data categories, legal bases, transfer mechanisms
 * - Interfaces for processing activities and related structures
 */

import type {
  LocalizedText,
  Contact,
  ResponsibleParty,
} from './types-common'

// ==========================================
// ENUMS - VVT / PROCESSING ACTIVITIES
// ==========================================

export type ProcessingActivityStatus = 'DRAFT' | 'REVIEW' | 'APPROVED' | 'ARCHIVED'

export type ProtectionLevel = 'LOW' | 'MEDIUM' | 'HIGH'

export type DataSubjectCategory =
  | 'EMPLOYEES'           // Beschaeftigte
  | 'APPLICANTS'          // Bewerber
  | 'CUSTOMERS'           // Kunden
  | 'PROSPECTIVE_CUSTOMERS' // Interessenten
  | 'SUPPLIERS'           // Lieferanten
  | 'BUSINESS_PARTNERS'   // Geschaeftspartner
  | 'VISITORS'            // Besucher
  | 'WEBSITE_USERS'       // Website-Nutzer
  | 'APP_USERS'           // App-Nutzer
  | 'NEWSLETTER_SUBSCRIBERS' // Newsletter-Abonnenten
  | 'MEMBERS'             // Mitglieder
  | 'PATIENTS'            // Patienten
  | 'STUDENTS'            // Schueler/Studenten
  | 'MINORS'              // Minderjaehrige
  | 'OTHER'

export type PersonalDataCategory =
  | 'NAME'                // Name
  | 'CONTACT'             // Kontaktdaten
  | 'ADDRESS'             // Adressdaten
  | 'DOB'                 // Geburtsdatum
  | 'ID_NUMBER'           // Ausweisnummern
  | 'SOCIAL_SECURITY'     // Sozialversicherungsnummer
  | 'TAX_ID'              // Steuer-ID
  | 'BANK_ACCOUNT'        // Bankverbindung
  | 'PAYMENT_DATA'        // Zahlungsdaten
  | 'EMPLOYMENT_DATA'     // Beschaeftigungsdaten
  | 'SALARY_DATA'         // Gehaltsdaten
  | 'EDUCATION_DATA'      // Bildungsdaten
  | 'PHOTO_VIDEO'         // Fotos/Videos
  | 'IP_ADDRESS'          // IP-Adressen
  | 'DEVICE_ID'           // Geraete-Kennungen
  | 'LOCATION_DATA'       // Standortdaten
  | 'USAGE_DATA'          // Nutzungsdaten
  | 'COMMUNICATION_DATA'  // Kommunikationsdaten
  | 'CONTRACT_DATA'       // Vertragsdaten
  | 'LOGIN_DATA'          // Login-Daten
  // Besondere Kategorien Art. 9 DSGVO
  | 'HEALTH_DATA'         // Gesundheitsdaten
  | 'GENETIC_DATA'        // Genetische Daten
  | 'BIOMETRIC_DATA'      // Biometrische Daten
  | 'RACIAL_ETHNIC'       // Rassische/Ethnische Herkunft
  | 'POLITICAL_OPINIONS'  // Politische Meinungen
  | 'RELIGIOUS_BELIEFS'   // Religiose Ueberzeugungen
  | 'TRADE_UNION'         // Gewerkschaftszugehoerigkeit
  | 'SEX_LIFE'            // Sexualleben/Orientierung
  // Art. 10 DSGVO
  | 'CRIMINAL_DATA'       // Strafrechtliche Daten
  | 'OTHER'

export type RecipientCategoryType =
  | 'INTERNAL'            // Interne Stellen
  | 'GROUP_COMPANY'       // Konzernunternehmen
  | 'PROCESSOR'           // Auftragsverarbeiter
  | 'CONTROLLER'          // Verantwortlicher
  | 'AUTHORITY'           // Behoerden
  | 'OTHER'

export type LegalBasisType =
  // Art. 6 Abs. 1 DSGVO
  | 'CONSENT'             // lit. a - Einwilligung
  | 'CONTRACT'            // lit. b - Vertragsdurchfuehrung
  | 'LEGAL_OBLIGATION'    // lit. c - Rechtliche Verpflichtung
  | 'VITAL_INTEREST'      // lit. d - Lebenswichtige Interessen
  | 'PUBLIC_TASK'         // lit. e - Oeffentliche Aufgabe
  | 'LEGITIMATE_INTEREST' // lit. f - Berechtigtes Interesse
  // Art. 9 Abs. 2 DSGVO (besondere Kategorien)
  | 'ART9_CONSENT'        // lit. a - Ausdrueckliche Einwilligung
  | 'ART9_EMPLOYMENT'     // lit. b - Arbeitsrecht
  | 'ART9_VITAL_INTEREST' // lit. c - Lebenswichtige Interessen
  | 'ART9_FOUNDATION'     // lit. d - Stiftung/Verein
  | 'ART9_PUBLIC'         // lit. e - Offenkundig oeffentlich
  | 'ART9_LEGAL_CLAIMS'   // lit. f - Rechtsansprueche
  | 'ART9_PUBLIC_INTEREST'// lit. g - Oeffentliches Interesse
  | 'ART9_HEALTH'         // lit. h - Gesundheitsversorgung
  | 'ART9_PUBLIC_HEALTH'  // lit. i - Oeffentliche Gesundheit
  | 'ART9_ARCHIVING'      // lit. j - Archivzwecke

export type TransferMechanismType =
  | 'ADEQUACY_DECISION'   // Angemessenheitsbeschluss
  | 'SCC_CONTROLLER'      // SCC Controller-to-Controller
  | 'SCC_PROCESSOR'       // SCC Controller-to-Processor
  | 'BCR'                 // Binding Corporate Rules
  | 'DEROGATION_CONSENT'  // Ausdrueckliche Einwilligung
  | 'DEROGATION_CONTRACT' // Vertragserfuellung
  | 'DEROGATION_LEGAL'    // Rechtsansprueche
  | 'DEROGATION_PUBLIC'   // Oeffentliches Interesse
  | 'CERTIFICATION'       // Zertifizierung
  | 'CODE_OF_CONDUCT'     // Verhaltensregeln

export type DataSourceType =
  | 'DATA_SUBJECT'        // Betroffene Person selbst
  | 'THIRD_PARTY'         // Dritte
  | 'PUBLIC_SOURCE'       // Oeffentliche Quellen
  | 'AUTOMATED'           // Automatisiert generiert
  | 'EMPLOYEE'            // Mitarbeiter
  | 'OTHER'

// ==========================================
// INTERFACES - VVT / PROCESSING ACTIVITIES
// ==========================================

export interface LegalBasis {
  type: LegalBasisType
  description?: string
  reference?: string // z.B. "§ 26 BDSG"
}

export interface RecipientCategory {
  type: RecipientCategoryType
  name: string
  description?: string
  isThirdCountry?: boolean
  country?: string
}

export interface ThirdCountryTransfer {
  country: string // ISO 3166-1 alpha-2
  recipient: string
  transferMechanism: TransferMechanismType
  sccVersion?: string
  tiaCompleted?: boolean
  tiaDate?: Date
  additionalMeasures?: string[]
}

export interface RetentionPeriod {
  duration?: number // in Monaten
  durationUnit?: 'DAYS' | 'MONTHS' | 'YEARS'
  description: LocalizedText
  legalBasis?: string // z.B. "HGB § 257", "AO § 147"
  deletionProcedure?: string
}

export interface DataSource {
  type: DataSourceType
  description?: string
}

export interface SystemReference {
  systemId: string
  name: string
  description?: string
  type?: string // CRM, ERP, etc.
}

export interface DataFlow {
  sourceSystem?: string
  targetSystem?: string
  description: string
  dataCategories: PersonalDataCategory[]
}

export interface ProcessingActivity {
  id: string
  tenantId: string

  // Pflichtfelder Art. 30(1) DSGVO
  vvtId: string // Eindeutige VVT-Nummer (z.B. VVT-2024-001)
  name: LocalizedText
  responsible: ResponsibleParty
  dpoContact?: Contact
  purposes: LocalizedText[]
  dataSubjectCategories: DataSubjectCategory[]
  personalDataCategories: PersonalDataCategory[]
  recipientCategories: RecipientCategory[]
  thirdCountryTransfers: ThirdCountryTransfer[]
  retentionPeriod: RetentionPeriod
  technicalMeasures: string[] // TOM-Referenzen

  // Empfohlene Zusatzfelder
  legalBasis: LegalBasis[]
  dataSources: DataSource[]
  systems: SystemReference[]
  dataFlows: DataFlow[]
  protectionLevel: ProtectionLevel
  dpiaRequired: boolean
  dpiaJustification?: string
  subProcessors: string[] // Vendor-IDs
  legalRetentionBasis?: string

  // Workflow
  status: ProcessingActivityStatus
  owner: string
  lastReviewDate?: Date
  nextReviewDate?: Date

  createdAt: Date
  updatedAt: Date
}
