import Foundation
import DocumentDetector

class DocumentDetectorBuilder {
    public func buildDocumentDetectorBuilder(mobileToken: String, personId: String, configDictionary: [String: Any]) throws -> DocumentDetectorSdk.CafBuilder {
        var formattedConfig: DocumentDetectorDecoder? = nil
        
        if !configDictionary.isEmpty {
            do {
                formattedConfig = try DocumentDetectorDecoder(configDictionary: configDictionary)
            } catch SDKError.invalidFormatMessage(let invalidFormatMessage) {
                throw SDKError.invalidFormatMessage(invalidFormatMessage)
            } catch {
                throw error
            }
        }
        
        let mDocumentDetectorBuilder = DocumentDetectorSdk.CafBuilder(mobileToken: mobileToken, enableMultiLanguage: formattedConfig?.getEnableMultiLanguage ?? true)
        
        if let documentSteps = formattedConfig?.getDocumentDetectorFlow {
            _ = mDocumentDetectorBuilder.setDocumentCaptureFlow(flow: documentSteps)
        }
        
        if let cafStage = formattedConfig?.getCafStage {
            _ = mDocumentDetectorBuilder.setStage(stage: cafStage)
        }
        
        if let personId = formattedConfig?.getPersonId {
            _ = mDocumentDetectorBuilder.setPersonId(personId: personId)
        }
        
        if let analyticsSettings = formattedConfig?.getAnalyticsSettings {
            _ = mDocumentDetectorBuilder.setAnalyticsSettings(useAnalytics: analyticsSettings)
        }
        
        if let popupSettings = formattedConfig?.getPopupSettings {
            _ = mDocumentDetectorBuilder.setPopupSettings(show: popupSettings)
        }
        
        if let networkSettings = formattedConfig?.getNetworkSettings {
            _ = mDocumentDetectorBuilder.setNetworkSettings(requestTimeout: networkSettings)
        }
        
        if let sensorSettings = formattedConfig?.getSensorSettings {
            if let luminositySensor = sensorSettings.luminositySensor {
                _ = mDocumentDetectorBuilder.setLuminositySensorSettings(luminosityThreshold: luminositySensor)
            }
            
            if let orientationSensor = sensorSettings.orientationSensor {
                _ = mDocumentDetectorBuilder.setOrientationSensorSettings(orientationThreshold: orientationSensor)
            }
            
            if let stabilitySensor = sensorSettings.stabilitySensor?.threshold {
                _ = mDocumentDetectorBuilder.setStabilitySensorSettings(stabilityThreshold: stabilitySensor)
            }
        }
        
        if let proxySettings = formattedConfig?.getProxySettings {
            _ = mDocumentDetectorBuilder.setProxySettings(proxySettings: proxySettings)
        }
        
        if let previewSettings = formattedConfig?.getPreviewSettings, let show = previewSettings.show {
            _ = mDocumentDetectorBuilder.showPreview(show)

            _ = mDocumentDetectorBuilder.setCustomStrings(customStrings: [
                DDPreviewCustomization(
                    title: previewSettings.title,
                    message: previewSettings.subtitle,
                    okButton: previewSettings.confirmLabel,
                    tryAgainButton: previewSettings.retryLabel
                )
            ])
        }
        
        if let compressSettings = formattedConfig?.getCompressSettings {
            _ = mDocumentDetectorBuilder.setCompressSettings(compressionQuality: compressSettings)
        }
        
        if let manualCaptureSettings = formattedConfig?.getManualCaptureSettings {
            _ = mDocumentDetectorBuilder.setManualCaptureSettings(
                enable: manualCaptureSettings.enable,
                time: manualCaptureSettings.time
            )
        }
        
        if let imageUrlExpireTime = formattedConfig?.getImageUrlExpireTime {
            _ = mDocumentDetectorBuilder.setGetImageUrlExpireTime(imageUrlExpireTime)
        }
        
        if let currentStepDoneDelay = formattedConfig?.getCurrentStepDoneDelay {
            _ = mDocumentDetectorBuilder.setCurrentStepDoneDelay(currentStepDoneDelay: currentStepDoneDelay)
        }
        
        if let resolutionSettings = formattedConfig?.getResolutionSettings {
            _ = mDocumentDetectorBuilder.setResolutionSettings(resolution: resolutionSettings)
        }
        
        if let allowedPassportList = formattedConfig?.getAllowedPassportList {
            _ = mDocumentDetectorBuilder.setAllowedPassportList(passportList: allowedPassportList)
        }
        
        if let uploadSettings = formattedConfig?.getUploadSettings {
            _ = mDocumentDetectorBuilder.setUploadSettings(uploadSettings: uploadSettings)
        }
        
        if let messageSettings = formattedConfig?.getMessageSettings {
            _ = mDocumentDetectorBuilder.setMessageSettings(
                waitMessage: messageSettings.waitMessage,
                fitTheDocumentMessage: messageSettings.fitTheDocumentMessage,
                verifyingQualityMessage: messageSettings.verifyingQualityMessage,
                lowQualityDocumentMessage: messageSettings.lowQualityDocumentMessage,
                uploadingImageMessage: messageSettings.uploadingImageMessage,
                popupDocumentSubtitleMessage: messageSettings.popupDocumentSubtitleMessage,
                unsupportedDocumentMessage: messageSettings.unsupportedDocumentMessage,
                sensorLuminosityMessage: messageSettings.sensorLuminosityMessage,
                sensorOrientationMessage: messageSettings.sensorOrientationMessage,
                sensorStabilityMessage: messageSettings.sensorStabilityMessage,
                predictorScanDocumentMessage: messageSettings.predictorScanDocumentMessage,
                predictorGetCloserMessage: messageSettings.predictorGetCloserMessage,
                predictorCentralizeMessage: messageSettings.predictorCentralizeMessage,
                predictorMoveAwayMessage: messageSettings.predictorMoveAwayMessage,
                predictorAlignDocumentMessage: messageSettings.predictorAlignDocumentMessage,
                predictorTurnDocumentMessage: messageSettings.predictorTurnDocumentMessage,
                predictorCapturedMessage: messageSettings.predictorCapturedMessage
            )
        }
        
        if let style = formattedConfig?.getStyle {
            _ = mDocumentDetectorBuilder.setLayout(layout: style)
            
            if let colorConfig = formattedConfig?.getColorConfiguration {
                _ = mDocumentDetectorBuilder.setColorConfiguration(colorConfig: colorConfig)
            }
        }
        
        if let documentDetectorFlow = formattedConfig?.getDocumentDetectorFlow, !documentDetectorFlow.isEmpty {
            return mDocumentDetectorBuilder
        } else {
            throw SDKError.requiredMethodMessage(ErrorMessage.documentStepsRequired)
        }
    }
}
