//
//  LKFAnonymizationContext.swift
//  LKF
//
//  Created by Alexander Holzer on 16.06.23.
//  Copyright © 2023 Alexander Holzer. All rights reserved.
//

import Foundation
@_implementationOnly import LibLKF

open class LKFAnonymizationContext {
    
    public let settings: LKFAnonymizationSettings
    public let targetContext: LKFContext
    public private(set) var keyMapping : [String:LKFAufenthalt]?
    var ptr : OpaquePointer?
    
    public init? (settings: LKFAnonymizationSettings, targetContext: LKFContext, aufenthalte:[LKFAufenthalt]? = nil, sourceContext: LKFContext? = nil, flags: Int32? = nil) {
        
        guard let contextPtr = targetContext.ptr else {
            return nil
        }
        
        self.settings = settings
        self.targetContext = targetContext
        
        self.ptr = LibLKF.lkf_create_anonymisation_context(contextPtr, settings.createCommandLine().cString(using: .utf8))
        
        
        if let sourceContext {
            addlines(from: sourceContext, flags: settings.copyFlag)
        }
        
        if let aufenthalte {
            if settings.nextkey != nil {
                var keyMapping = [String:LKFAufenthalt]()
                for auf in aufenthalte {
                    if let created = add(aufenthalt: auf) {
                        keyMapping[auf.key] = created
                    }
                }
                self.keyMapping = keyMapping
            }
            else {
                for auf in aufenthalte {
                    _ = add(aufenthalt: auf)
                }
            }
        }
        self.targetContext.flags = LibLKF.lkf_get_contextflags(contextPtr)
    }
    
    deinit {
        if ptr != nil {
            lkf_free_anonymisation_context(ptr!)
            ptr = nil
        }
    }

    public func addlines (from source: LKFContext, flags: Int32? = nil) {
        
        guard let targetPtr = targetContext.ptr, let sourcePtr = source.ptr else {
            return
        }
        LibLKF.lkf_copy_addlines (targetPtr, sourcePtr, flags ?? settings.copyFlag);
    }
    
    public func add (aufenthalt: LKFAufenthalt) -> LKFAufenthalt? {
        
        
        if let ptr, let createdAuf = lkf_anonymisation_add_aufenthalt(ptr, aufenthalt.ptr) {
            return LKFAufenthalt(context: targetContext, ptr: createdAuf)
        }
        return nil
    }
}
