import Foundation
import FaceLiveness

private struct CafConfig {
    static let cafStage = "cafStage"
    static let filter = "filter"
    static let loadingScreen = "loadingScreen"
    static let imageUrlExpirationTime = "imageUrlExpirationTime"
    static let faceLivenessBaseUrl = "faceLivenessBaseUrl"
    static let authenticationBaseUrl = "authenticationBaseUrl"
    static let certificates = "certificates"
}

internal class CafFaceLivenessConfig {
    private var cafStage: CafEnvironment?
    private var filter: FaceLiveness.Filter?
    private var loadingScreen: Bool?
    private var imageUrlExpirationTime: FaceLiveness.Time?
    private var faceLivenessBaseUrl: String?
    private var authenticationBaseUrl: String?
    private var certificates: [String]?

    init(config: String) {
        if let data = config.data(using: .utf8) {
            var configDictionary: [String: Any]?
            configDictionary = try? JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
            
            if let cafStageValue = configDictionary?[CafConfig.cafStage] as? Int, let newCafStage = CafEnvironment(rawValue: cafStageValue) {
                self.cafStage = newCafStage
            }

            if let filterValue = configDictionary?[CafConfig.filter] as? Int, let newFilter = FaceLiveness.Filter(rawValue: filterValue) {
                self.filter = newFilter
            }

            if let loadingScreen = configDictionary?[CafConfig.loadingScreen] as? Bool {
                self.loadingScreen = loadingScreen
            }

            if let imageUrlExpirationTime = configDictionary?[CafConfig.imageUrlExpirationTime] as? Int {
                switch(imageUrlExpirationTime) {
                case 0: 
                    self.imageUrlExpirationTime = FaceLiveness.Time.threeHours
                case 1:
                    self.imageUrlExpirationTime = FaceLiveness.Time.thirtyDays
                case 2:
                    self.imageUrlExpirationTime = FaceLiveness.Time.thirtyMin
                default:
                    self.imageUrlExpirationTime = nil
                }
            }
            
            if let faceLivenessBaseUrl = configDictionary?[CafConfig.faceLivenessBaseUrl] as? String {
                self.faceLivenessBaseUrl = faceLivenessBaseUrl
            }
            
            if let authenticationBaseUrl = configDictionary?[CafConfig.authenticationBaseUrl] as? String {
                self.authenticationBaseUrl = authenticationBaseUrl
            }
            
            if let certificates = configDictionary?[CafConfig.certificates] as? [String] {
                self.certificates = certificates
            }
        }
    }
    
    var getCafStage: CafEnvironment? {
        cafStage
    }
    
    var getFilter: FaceLiveness.Filter? {
        filter
    }
    
    var getLoadingScreen: Bool? {
        loadingScreen
    }
    
    var getImageUrlExpirationTime: FaceLiveness.Time? {
        imageUrlExpirationTime ?? .threeHours
    }
    
    var getFaceLivenessBaseUrl: String? {
        faceLivenessBaseUrl
    }
    
    var getAuthenticationBaseUrl: String? {
        authenticationBaseUrl
    }
    
    var getCertificates: [String]? {
        certificates
    }
}

