/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2021-2021. All rights reserved.
 */

let AGCCloudDBLog = AGCCloudDBLogger(version: "1.0.0", service: "CordovaCloudDB")

/// Custom AGCCloudDBLogger Class to listen api log events from Cordova Side.
final class AGCCloudDBLogger {
    
    /// Info Types to declare success and failure scenarios.
    public enum InfoType{
        case call, success, fail
    }
    
    private var prefix: String = "AGCCloudDBLogger"
    private var version: String?
    private var service: String?
    
    /// Version and Service names may be added to give more detail in panel.
    /// - Parameters:
    ///   - version: Refers to version number of the framework.
    ///   - service: Refers to service declaration.
    public init(version: String? = nil, service: String? = nil) {
        self.version = version
        self.service = service
    }
    
    /// This function can be used during synchronized events. It gets the method name, calculates start end end times and reports to console as single events.
    /// - Parameters:
    ///   - file: Refers to file name that the function is in.
    ///   - line: Refers to line number.
    ///   - name: Refers to name of the function.
    ///   - message: Refers to message that can be added in the panel.
    ///   - block: Refers to function that will be used.
    /// - Returns: Void
    func debug(file: String = #file, line: Int = #line, name: String = #function, _ message: String, block:()->()) {
        showInPanel(file:file, line:line, name:name, message: message, type: .call)
        block()
        showInPanel(file:file, line:line, name:name, message: message, type: .success)
    }
    
    // MARK: - Private Functions
    
    /// Shows infos in panel
    func showInPanel(callTime: Double? = nil,
                     file: String = #file,
                     line: Int = #line,
                     name: String = #function,
                     message: String,
                     timeElapsed: Double? = nil,
                     type: AGCCloudDBLogger.InfoType) {
        switch type {
        case .call:
            printCall(message)
            return
        case .success:
            printStatus(message, true)
        case .fail:
            printStatus(message, false)
        }
    }
    
    /// Prints call messages among with the function names.
    private func printCall(_ message: String){
        print("call \(message)")
    }
    
    /// Print status messages.
    private func printStatus(_ name: String, _ status: Bool){
        let statusMsg = status ? "success" : "failure"
        print("\(name) \(statusMsg)")
    }
}
