import AVFoundation
import SwiftUI

/*
 This is used to display looping video covers. The URL is passed in as a player item from VideoCoverClient.
 */
public struct VideoCoverView: UIViewRepresentable {
    public let player: AVPlayer?
    public let resizeMode: AVLayerVideoGravity
    public let cornerRadius: CGFloat

    public func makeUIView(context _: Context) -> VideoCoverUIView {
        return VideoCoverUIView(player: player, resizeMode: resizeMode, cornerRadius: cornerRadius)
    }

    public func updateUIView(_ uiView: VideoCoverUIView, context _: Context) {
        uiView.player = player
    }

    public init(player: AVPlayer?, resizeMode: AVLayerVideoGravity = .resizeAspectFill, cornerRadius: CGFloat = 20) {
        self.player = player
        self.resizeMode = resizeMode
        self.cornerRadius = cornerRadius
    }
}

public class VideoCoverUIView: UIView {
    public var player: AVPlayer? {
        get { playerLayer.player }
        set { playerLayer.player = newValue }
    }

    var playerLayer: AVPlayerLayer {
        return layer as! AVPlayerLayer
    }

    private let resizeMode: AVLayerVideoGravity
    private let cornerRadius: CGFloat

    override public static var layerClass: AnyClass {
        return AVPlayerLayer.self
    }

    init(player: AVPlayer?, resizeMode: AVLayerVideoGravity = .resizeAspectFill, cornerRadius: CGFloat = 20) {
        self.resizeMode = resizeMode
        self.cornerRadius = cornerRadius
        super.init(frame: .zero)
        self.player = player
        setupLayer()
    }

    @available(*, unavailable)
    required init?(coder _: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func setupLayer() {
        playerLayer.videoGravity = resizeMode
        playerLayer.backgroundColor = UIColor.clear.cgColor
        playerLayer.cornerRadius = cornerRadius
        playerLayer.masksToBounds = true
    }

    override public func layoutSubviews() {
        super.layoutSubviews()
        playerLayer.frame = bounds
    }
}
