//
//  ImageProcessing.swift
//  DWP
//
//  Created by Ahmed Wahdan on 19/12/2024.
//

import UIKit
import CoreImage

class ImageProcessor {
    static let shared = ImageProcessor()
    private init() {}
    
    public func preprocessImage(_ ciImage: CIImage) -> UIImage? {
        let context = CIContext()
        
        // Step 1: Convert to Grayscale with Contrast
        guard let grayscaleFilter = CIFilter(name: "CIColorControls") else { return nil }
        grayscaleFilter.setValue(ciImage, forKey: kCIInputImageKey)
        grayscaleFilter.setValue(0.0, forKey: "inputSaturation")   // Remove color
        grayscaleFilter.setValue(0.0, forKey: "inputBrightness")  // Slight brightening
        grayscaleFilter.setValue(1.0, forKey: "inputContrast")    // Boost contrast
        guard let grayscaleImage = grayscaleFilter.outputImage else { return nil }
        
        // Step 2: Sharpen the Image
        guard let sharpenFilter = CIFilter(name: "CISharpenLuminance") else { return nil }
        sharpenFilter.setValue(grayscaleImage, forKey: kCIInputImageKey)
        sharpenFilter.setValue(1.0, forKey: "inputSharpness")  // Moderate sharpness
        guard let sharpenedImage = sharpenFilter.outputImage else { return nil }
        
        // Step 3: Apply Gaussian Blur to Smooth Noise
        guard let blurFilter = CIFilter(name: "CIGaussianBlur") else { return nil }
        blurFilter.setValue(sharpenedImage, forKey: kCIInputImageKey)
        blurFilter.setValue(0.5, forKey: "inputRadius") // Small blur to reduce noise
        guard let blurredImage = blurFilter.outputImage else { return nil }
        
        // Step 4: Apply Brightness and Edge Adjustment
        guard let adjustedFilter = CIFilter(name: "CIColorControls") else { return nil }
        adjustedFilter.setValue(blurredImage, forKey: kCIInputImageKey)
        adjustedFilter.setValue(0, forKey: "inputBrightness") // Reduce brightness for edge visibility
        adjustedFilter.setValue(1.2, forKey: "inputContrast")    // Final contrast enhancement
        guard let finalImage = adjustedFilter.outputImage else { return nil }
        
        // Convert to UIImage
        guard let cgImage = context.createCGImage(finalImage, from: ciImage.extent) else { return nil }
        return UIImage(cgImage: cgImage)
    }
}
