import DocumentDetector

public struct StyleDeserializer: Decodable {
    private let style: DocumentDetectorLayout?
    private let colorConfiguration: ColorConfiguration?
    
    private enum CodingKeys: String, CodingKey {
        case style
    }
    
    private struct DocumentFeedbackColorsStruct: Decodable {
        let defaultColor: String
        let errorColor: String
        let successColor: String
    }
    
    private struct StyleStruct: Decodable {
        let primaryColor: String?
        let secondaryColor: String?
        let backgroundColor: String?
        let contentColor: String?
        let mediumColor: String?
        let feedbackColors: DocumentFeedbackColorsStruct?
    }
    
    public init (from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        
        let styleContainer = try container.decodeIfPresent(StyleStruct.self, forKey: .style)
        
        let layout = DocumentDetectorLayout()
        
        if let feedbackColors = styleContainer?.feedbackColors {
            layout.feedbackColors = DocumentFeedbackColors(
                defaultColor: UIColor(hex: feedbackColors.defaultColor) ?? .black,
                errorColor: UIColor(hex: feedbackColors.errorColor) ?? .red,
                successColor: UIColor(hex: feedbackColors.successColor) ?? .green
            )
        }
        
        style = layout
        
        let hasColors = styleContainer?.primaryColor != nil
            || styleContainer?.secondaryColor != nil
            || styleContainer?.backgroundColor != nil
            || styleContainer?.contentColor != nil
            || styleContainer?.mediumColor != nil
        colorConfiguration = hasColors ? ColorConfiguration(
            primaryColor: styleContainer?.primaryColor,
            secondaryColor: styleContainer?.secondaryColor,
            contentColor: styleContainer?.contentColor,
            backgroundColor: styleContainer?.backgroundColor,
            mediumColor: styleContainer?.mediumColor
        ) : nil
    }
    
    var getStyle: DocumentDetectorLayout? {
        style
    }
    var getColorConfiguration: ColorConfiguration? { colorConfiguration }  

}
