import Combine
import Foundation
import SwiftUI

let isConsoleLoggingEnabled = false

#if DEBUG
    let prefixLength = 400
    func loggerMiddleware() -> Middleware<AppState, AppAction> {
        { state, action in
            let timeStr = dateFormatter.string(from: Date())
            var actionStr = "\(action)"
            actionStr = String(actionStr.prefix(prefixLength)) + " ..."
            var stateStr = "\(state)"
            stateStr = String(stateStr.prefix(prefixLength)) + " ..."

            let str = "\(timeStr) \u{EA86} \(actionStr)\n\(timeStr) \u{F129} \(stateStr)\n"

            print(str)
            if isConsoleLoggingEnabled {
                NSLog(str)
            }
            return Empty().eraseToAnyPublisher()
        }
    }
#else
    func loggerMiddleware() -> Middleware<AppState, AppAction> {
        { _, _ in
            Empty().eraseToAnyPublisher()
        }
    }
#endif

enum LogLevels: String {
    case info = "\u{F449}"
    case warning = "\u{F071}"
    case error = "\u{EA76}"
}

// For database errors logging
func logIt(_ level: LogLevels, _ message: String) {
    #if DEBUG
        let timeStr = dateFormatter.string(from: Date())
        let str = "\(timeStr) \(level.rawValue) \(message)"
        print(str)
        if isConsoleLoggingEnabled {
            NSLog(str)
        }
    #endif
}

private var dateFormatter: DateFormatter {
    let formatter = DateFormatter()
    formatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") as Locale
    formatter.dateFormat = "MM-dd HH:mm:ss.SSS"
    return formatter
}

// For thread debugging
func ptInfo(_ message: String) {
    #if DEBUG
        let timeStr = dateFormatter.string(from: Date())
        let str = "\(timeStr) \(message) -> \(Thread.current), \(String(validatingUTF8: __dispatch_queue_get_label(nil)) ?? "no queue label")"
        print(str)
        if isConsoleLoggingEnabled {
            NSLog(str)
        }
    #endif
}