import os
import Foundation

public struct Country {
    public var name: String
    public var code: String
    public var flag: String
    public var regex: String
    public var prefix: String
    public var example: String
    public var prefixWithFlag: String { "\(flag) \(prefix)" }

    public static func fromMyPhone() -> Self {
        let all = all()

        guard let country = all.filter({ $0.code == Locale.current.regionCode }).first else {
            return all.filter { $0.code == "US" }.first!
        }

        return country
    }

    public static func all() -> [Self] {
        guard let url = Bundle.module.url(forResource: "country_codes", withExtension: "json"),
              let data = try? Data(contentsOf: url),
              let countries = try? JSONDecoder().decode([Country].self, from: data) else {
                  fatalError("Can't handle country codes json")
              }

        return countries
    }

    public static func findFrom(_ number: String) -> Self {
        all().first { country in
            let start = number.index(number.startIndex, offsetBy: number.count - 2)
            let end = number.index(start, offsetBy: number.count - (number.count - 2))

            return country.code == String(number[start ..< end])
        }!
    }
}

extension Country: Hashable {}
extension Country: Equatable {}
extension Country: Decodable {}