import Foundation
import ComplyCubeMobileSDK

public final class DocumentTypeParser {
    private let countryExtractor: CountryExtractor
    public init(countryExtractor: CountryExtractor) { self.countryExtractor = countryExtractor }

    // snake_case keys; value = Bool OR [String] country codes
    public func parse(_ map: [String: Any]) -> [DocumentTypes] {
        if map.isEmpty {
            return [
                .passport,
                .drivingLicence(ComplyUtils.allCountries()),
                .nationalIdentityCard(ComplyUtils.allCountries()),
                .residencePermitCard(ComplyUtils.allCountries())
            ]
        }
        var out: [DocumentTypes] = []
        var pickedCountries: [String]? = nil
        func enable(_ v: Any, push: () -> Void) {
            switch v {
            case let b as Bool where b: push()
            case let arr as [Any]:
                let codes = arr.compactMap { $0 as? String }
                guard !codes.isEmpty else { return } // do not enable on empty array
                pickedCountries = countryExtractor.extractCountries(codes)
                push()
            default: break
            }
            pickedCountries = nil
        }
        for (k, v) in map {
            switch k {
            case "passport":
                enable(v) { out.append(.passport) }

            case "driving_license":
                enable(v) {
                    out.append(.drivingLicence(pickedCountries ?? ComplyUtils.allCountries()))
                }

            case "national_identity_card":
                enable(v) {
                    out.append(.nationalIdentityCard(pickedCountries ?? ComplyUtils.allCountries()))
                }

            case "residence_permit":
                enable(v) {
                    out.append(.residencePermitCard(pickedCountries ?? ComplyUtils.allCountries()))
                }

            default:
                break
            }
        }
        return out
    }
}
