import AVFoundation
import SwiftUI

public struct VideoPreviewView: UIViewRepresentable {
    public let player: AVPlayer?
    public let resizeMode: AVLayerVideoGravity

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

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

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

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

    var playerLayer: AVPlayerLayer {
        return layer as! AVPlayerLayer
    }

    private let resizeMode: AVLayerVideoGravity

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

    init(player: AVPlayer?, resizeMode: AVLayerVideoGravity = .resizeAspectFill) {
        self.resizeMode = resizeMode
        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 = 20
        playerLayer.masksToBounds = true
    }

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