import Foundation

public final class CountryExtractor: CountryExtracting {
    private var extractedCodes = Set<String>()
    private let extractedCodesLock = NSLock()

    public init() {}

    public func clear() {
        extractedCodesLock.lock()
        defer { extractedCodesLock.unlock() }
        extractedCodes.removeAll()
    }

    public func extractCountries(_ codes: [String]) -> [String] {
        let filtered = codes.filter { !$0.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty }
        let normalizedCodes = filtered.map { $0.uppercased() }

        extractedCodesLock.lock()
        defer { extractedCodesLock.unlock() }
        normalizedCodes.forEach { extractedCodes.insert($0) }

        return filtered
    }

    public func getAllExtractedCountries() -> [Country] {
        extractedCodesLock.lock()
        defer { extractedCodesLock.unlock() }
        let snapshot = extractedCodes
        return snapshot.sorted().map { Country(code: $0) }
    }

    // Conformance for top-level countries
    public func extract(from raw: Any) throws -> [Country] {
        guard let arr = raw as? [String] else {
            throw ConfigurationError.invalidType(field: "countries", expected: "[String]", actual: String(describing: type(of: raw)))
        }
        _ = extractCountries(arr)
        return arr.map { Country(code: $0) }
    }
}
