import SwiftUI
import UIKit.UIImage

public struct TabImage: View {
    let image: UIImage
    let isSelected: Bool
    let accentColor: CGColor

    public init(image: UIImage, isSelected: Bool, accentColor: CGColor) {
        self.image = image
        self.isSelected = isSelected
        self.accentColor = accentColor
    }

    var rounded: UIImage {
        let imageSize: CGSize = .init(width: 22, height: 22)
        let strokeSize: CGSize = .init(width: 25, height: 25)
        let frameSize: CGSize = .init(width: 26, height: 26)

        return UIGraphicsImageRenderer(size: frameSize).image { context in
            if isSelected {
                context.cgContext.setStrokeColor(accentColor)
                context.cgContext.setLineWidth(1)
                context.cgContext.strokeEllipse(in: .init(origin: .init(x: 0.5, y: 0.5), size: strokeSize))
            }

            let rect: CGRect = .init(origin: .init(x: 2, y: 2), size: imageSize)
            let clipPath = UIBezierPath(ovalIn: rect)
            clipPath.addClip()
            image.draw(in: rect)
        }
    }

    public var body: some View {
        Image(uiImage: rounded.withRenderingMode(.alwaysOriginal))
    }
}

private extension UIImage {
    func grayscale() -> UIImage {
        guard let filter = CIFilter(name: "CIPhotoEffectNoir") else { return self }
        filter.setValue(CIImage(image: self), forKey: kCIInputImageKey)

        let context = CIContext(options: nil)
        guard let output = filter.outputImage,
              let cgImage = context.createCGImage(output, from: output.extent)
        else { return self }

        return UIImage(cgImage: cgImage)
    }
}

public struct BadgedTabItem: View {
    let image: UIImage
    let isSelected: Bool
    let showBadge: Bool
    let accentColor: CGColor

    public init(image: UIImage, isSelected: Bool, showBadge: Bool, accentColor: CGColor) {
        self.image = image
        self.isSelected = isSelected
        self.showBadge = showBadge
        self.accentColor = accentColor
    }

    var badged: UIImage {
        let frameSize: CGSize = .init(width: 28, height: 28)
        let imageSize: CGSize = .init(width: 24, height: 24)

        return UIGraphicsImageRenderer(size: frameSize).image { context in
            context.cgContext.setFillColor(isSelected ? accentColor : UIColor.SemanticV1.iconSecondary.cgColor)
            let rect: CGRect = .init(
                origin: .init(
                    x: (frameSize.width - imageSize.width) / 2,
                    y: (frameSize.height - imageSize.height) / 2
                ),
                size: imageSize
            )
            image.draw(in: rect)

            if showBadge {
                context.cgContext.setFillColor(accentColor)
                context.cgContext.fillEllipse(in: .init(origin: .init(x: frameSize.height - 7, y: 4), size: .init(width: 5, height: 5)))
            }
        }
    }

    public var body: some View {
        Image(uiImage: badged.withRenderingMode(.alwaysOriginal))
    }
}
