//
//  LKFAufenthaltError.swift
//  lkfc
//
//  Created by Alexander Holzer on 21.08.18.
//  Copyright © 2018 Alexander Holzer. All rights reserved.
//

import Foundation
@_implementationOnly import LibLKF

public class LKFAufenthaltError : Identifiable {
    
    public let id = UUID()
    
    public let code : String
    public let text : String
    public let value : String
    
    init (aufenthalt: LKFAufenthalt, error: OpaquePointer!) {
        let ptr = UnsafeMutablePointer<CChar>.allocate(capacity: 256)
        let contextPtr = aufenthalt.context!.ptr
        LibLKF.lkf_satzart_getValue (contextPtr, error, 102, ptr, 256)
        code = String(cString:ptr).trimmingCharacters(in: .whitespaces)
        LibLKF.lkf_satzart_getValue (contextPtr, error, 105, ptr, 256)
        text = String(cString:ptr).trimmingCharacters(in: .whitespaces)
        LibLKF.lkf_satzart_getValue (contextPtr, error, 109, ptr, 256)
        value = String(cString:ptr).trimmingCharacters(in: .whitespaces)
        ptr.deallocate()
    }
    
    public static func getErrors (aufenthalt: LKFAufenthalt) -> [LKFAufenthaltError]? {
        
        var errorPtr = LibLKF.lkf_auf_getSatzartError(aufenthalt.ptr)
        
        if errorPtr == nil {
            return nil
        }

        var errors = [LKFAufenthaltError]()
        
        while errorPtr != nil {
            errors.append(LKFAufenthaltError(aufenthalt: aufenthalt, error: errorPtr!))
            errorPtr = LibLKF.lkf_auf_getNextSatzartError(errorPtr)
        }
        
        return errors
    }
}

public extension [LKFAufenthaltError] {
    func sorted() -> [LKFAufenthaltError] {
        return self.sorted { e0, e1 in
            if e0.code.first == e1.code.first {
                return e0.code < e1.code
            }
            if e0.code.first == "E" {
                return true
            }
            if e1.code.first == "E" {
                return false
            }
            if e0.code.first == "W" {
                return true
            }
            return false            
        }
    }
}
