//
//  CoreExtensions.swift
//  RNSentianceCore
//
//  Created by Mohammed Aouf Zouag on 22/09/2025.
//

import SENTSDK

extension SENTSDK.SENTWaypoint: SentianceNamespaceWrappable {}
extension SENTSDK.SENTDate: SentianceNamespaceWrappable {}
extension TimeInterval: SentianceNamespaceWrappable {}

public protocol SentianceNamespaceWrappable {
    associatedtype T
    var sentiance: T { get }
}

extension SentianceNamespaceWrappable {
    public var sentiance: SentianceTypeWrapper<Self> {
        return SentianceTypeWrapper(value: self)
    }
}

public struct SentianceTypeWrapper<T> {
    public var value: T
    init(value: T) {
        self.value = value
    }
}

extension SentianceTypeWrapper where T == TimeInterval {
    /// Milliseconds since Unix epoch, truncating sub-millisecond fraction.
    public var millisecondsSince1970: Int64 {
        return Int64(value * 1_000)
    }
}

extension SentianceTypeWrapper where T == SENTDate {
    public var millisecondsSince1970: Int64 {
        return value.timeIntervalSince1970.sentiance.millisecondsSince1970
    }
}

extension SentianceTypeWrapper where T == SENTSDK.SENTWaypoint {
    public func asDictionary() -> [String: Any] {
        var dict: [String: Any] = [
            "latitude": value.latitude,
            "longitude": value.longitude,
            "accuracy": value.accuracyInMeters,
            "timestamp": value.timestamp.sentiance.millisecondsSince1970,
            "isSpeedLimitInfoSet": value.isSpeedLimitInfoSet,
            "hasUnlimitedSpeedLimit": value.isSpeedLimitUnlimited,
            "isSynthetic": value.isSynthetic,
        ]
        
        if value.isSpeedSet {
            dict["speedInMps"] = value.speedInMps
        }
        
        if value.isSpeedLimitInfoSet && !value.isSpeedLimitUnlimited {
            dict["speedLimitInMps"] = value.speedLimitInMps
        } else if value.isSpeedLimitUnlimited {
            dict["speedLimitInMps"] = Double.infinity
        }
        
        return dict
    }
}
