import Foundation
import DocumentDetector

public struct ErrorStatusCode {
    static let statusCode502: String = "502"
    static let statusCode500: String = "500"
    static let statusCode403: String = "403"
}

public struct ErrorMessage {
    static let invalidToken: String = "Invalid Token"
    static let serviceUnavailable: String = "Service Unavailable"
    static let permissionDenied: String = "Permission Denied"
    static let noStorageSpace: String = "No Storage Space"
    static let unableStartSDK: String = "Unable to Start SDK"
    static let unexpectedError: String = "Unexpected Error"
    static let documentStepsRequired: String = "documentSteps is required"
}

public struct ErrorReason {
    static let invalidTokenReason = "InvalidTokenReason"
    static let networkReason = "NetworkReason"
    static let serverReason = "ServerReason"
    static let permissionReason = "PermissionReason"
    static let storageReason = "StorageReason"
    static let libraryReason = "LibraryReason"
    static let unexpectedReason = "UnexpectedReason"
}

public struct JSONProperties {
    static let imagePath: String = "imagePath"
    static let imageUrl: String = "imageUrl"
    static let label: String = "label"
    static let quality: String = "quality"
    static let captures: String = "captures"
    static let type: String = "type"
    static let trackingId: String = "trackingId"
    static let statusCode: String = "statusCode"
    static let message: String = "message"
}

class EncodeJSON {
    static func createCaptureMap(result: DocumentDetectorResult) -> [String: Any] {
        var map = [String: Any]()
        var capturesArray = [[String: Any]]()
        
        for capture in result.captures {
            var captureMap = [String: Any]()
            captureMap[JSONProperties.imagePath] = capture.image
            captureMap[JSONProperties.imageUrl] = capture.imageUrl
            captureMap[JSONProperties.label] = capture.label
            captureMap[JSONProperties.quality] = capture.quality ?? 0.0
            capturesArray.append(captureMap)
        }
        
        map[JSONProperties.captures] = capturesArray
        map[JSONProperties.type] = result.type
        map[JSONProperties.trackingId] = result.trackingId
        
        return map
    }
    
    static func createErrorMap(sdkFailure: CafDocumentDetectorFailure) -> [String: String] {
        var map = [String: String]()
        
        var statusCode: String
        var message: String
        var type: String
        
        switch sdkFailure {
        case is CafInvalidTokenReason:
            statusCode = ErrorStatusCode.statusCode500
            message = ErrorMessage.invalidToken
            type = ErrorReason.invalidTokenReason
        case is CafNetworkReason:
            statusCode = ErrorStatusCode.statusCode502
            message = ErrorMessage.serviceUnavailable
            type = ErrorReason.networkReason
        case let serverReason as CafServerReason:
            statusCode = ErrorStatusCode.statusCode500
            message = serverReason.message
            type = ErrorReason.serverReason
        case is CafPermissionReason:
            statusCode = ErrorStatusCode.statusCode403
            message = ErrorMessage.permissionDenied
            type = ErrorReason.permissionReason
        case is CafLibraryReason:
            statusCode = ErrorStatusCode.statusCode500
            message = ErrorMessage.unableStartSDK
            type = ErrorReason.libraryReason
        default:
            statusCode = ErrorStatusCode.statusCode500
            message = ErrorMessage.unexpectedError
            type = ErrorReason.unexpectedReason
        }
        
        map[JSONProperties.statusCode] = statusCode
        map[JSONProperties.message] = message
        map[JSONProperties.type] = type
        
        return map
    }
}
