import DocumentDetector

public struct ProxySettingsDeserializer: Decodable {
    private var proxySettings: DDProxySettings?
    
    private enum CodingKeys: String, CodingKey {
        case proxySettings
    }
    
    public struct AuthenticationStruct: Decodable {
        let user: String?
        let password: String?
    }
    
    public struct ProxySettingsStruct: Decodable {
        let hostname: String?
        let port: Int?
        let authentication: AuthenticationStruct?
    }
    
    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        
        let proxySettingsContainer = try container.decodeIfPresent(ProxySettingsStruct.self, forKey: .proxySettings)
        
        proxySettings = try createProxySettings(container: proxySettingsContainer)
    }
    
    var getProxySettings: DDProxySettings? {
        proxySettings
    }
    
    private func createProxySettings(container: ProxySettingsStruct?) throws -> DDProxySettings?  {
        if let hostname = container?.hostname, let port = container?.port {
            if let authentication = container?.authentication {
                guard let user = authentication.user, let password = authentication.password else {
                    return nil                }
                
                return DDProxySettings(hostname: hostname, port: port, user: user, password: password)
            } else {
                return DDProxySettings(hostname: hostname, port: port, user: nil, password: nil)
            }
        }
        
        return nil
    }
}
