import Foundation
import os.log

func logger(_ level: CapLogger.Level, message: String) {
    CapLogger.log(level, message: message)
}

public struct CapLogger {
    static var level = Level.important
    private static var prefix = "CSLIBCAP"

    // SwiftLint: désactivez le privé strict
    fileprivate static func log(_ level: Level, message: String) {
        #if !TESTING
            if level >= CapLogger.level {
                let message = "\(CapLogger.prefix) \(level.prefix) \(message)"
                os_log("%{public}@", type: level.osLogType, message)
            }
        #endif
    }

    // SwiftLint: activez le privé strict

    public enum Level: Int, Comparable {
        case verbose
        case info
        case error
        case important

        var prefix: String {
            switch self {
            case .verbose:
                return "💬 Verbose:"
            case .info:
                return "ℹ️ Info:"
            case .error:
                return "🔴 Error:"
            case .important:
                return "ℹ️ Info:"
            }
        }

        var osLogType: OSLogType {
            switch self {
            case .error:
                return OSLogType.error
            default:
                // En l'absence d'une meilleure raison, nous utilisons .info car il n'est pas stocké sur le disque, il est donc plus performant
                return OSLogType.info
            }
        }

        public static func < (lhs: CapLogger.Level, rhs: CapLogger.Level) -> Bool {
            lhs.rawValue < rhs.rawValue
        }
    }
}
