import SwiftUI
import UIKit

struct RotatingImageView: UIViewRepresentable {
    var image: UIImage
    var rpm: Double   // rotations per minute

    func makeUIView(context: Context) -> UIImageView {
        let view = UIImageView(image: image)
        view.contentMode = .scaleAspectFit
        view.setContentHuggingPriority(.defaultLow, for: .vertical)
        view.setContentHuggingPriority(.defaultLow, for: .horizontal)
        view.setContentCompressionResistancePriority(.defaultLow, for: .vertical)
        view.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
        startRotation(on: view)
        return view
    }

    func updateUIView(_ uiView: UIImageView, context: Context) {
        uiView.image = image

        // If SwiftUI reuses the view, make sure the animation is running,
        // but don't add duplicates.
        if uiView.layer.animation(forKey: "infiniteRotation") == nil {
            startRotation(on: uiView)
        }
    }

    private func startRotation(on view: UIView) {
        guard rpm > 0 else { return }

        let rotation = CABasicAnimation(keyPath: "transform.rotation.z")
        rotation.fromValue = 0
        rotation.toValue = 2 * Double.pi
        rotation.duration = 60.0 / rpm        // seconds per full turn
        rotation.repeatCount = .infinity
        rotation.isRemovedOnCompletion = false
        rotation.fillMode = .forwards

        view.layer.add(rotation, forKey: "infiniteRotation")
    }
}
