import Foundation

public enum AnalyticsGlobalContextOption {
    case countryByRegionIdentifier
    case preferredLanguage
}

class AnalyticsUtility {
    struct Context: Codable {
        let countryByRegionIdentifier: String?
        let preferredLanguage: String?

        func encode(to encoder: Encoder) throws {
            var container = encoder.container(keyedBy: CodingKeys.self)

            if let country = countryByRegionIdentifier {
                try container.encode(country, forKey: .countryByRegionIdentifier)
            }
            if let language = preferredLanguage {
                try container.encode(language, forKey: .preferredLanguage)
            }
        }
    }

    static func getGlobalContextJSON(options: [AnalyticsGlobalContextOption]) -> String {
        let values: [AnalyticsGlobalContextOption: String?] = [
            .countryByRegionIdentifier: Locale.current.region?.identifier,
            .preferredLanguage: Bundle.preferredLanguage(),
        ]

        let filteredValues = values.filter { options.contains($0.key) }

        let context = Context(
            countryByRegionIdentifier: filteredValues[.countryByRegionIdentifier] ?? nil,
            preferredLanguage: filteredValues[.preferredLanguage] ?? nil
        )

        let encoder = JSONEncoder()
        encoder.keyEncodingStrategy = .convertToSnakeCase
        encoder.outputFormatting = .prettyPrinted

        if let jsonData = try? encoder.encode(context),
           let jsonString = String(data: jsonData, encoding: .utf8)
        {
            return jsonString
        } else {
            log.telemetry.assertionFailure("Failed to encode JSON.")
            return ""
        }
    }
}
