import Foundation
import SwiftUI
import Adamantium
import AVFoundation
import AVKit

class VideoWatermarkingObservable: ObservableObject {
    
    @Published var player: AVPlayer?
    
    func processVideo() async throws {
        guard
            let videoURL = Bundle.main.url(forResource: "demo_input_video", withExtension: "mov"),
            let imageURL = Bundle.main.url(forResource: "white_skull_on_black", withExtension: "png"),
            let image = ImageUtility.ciImage(imageURL)
        else { return }
        
        let videoSession = try await VideoWatermarkUtility
            .createWatermarkedAsset(inputURL: videoURL, markImage: image, markTransform: .init(
            opacity: 0.5,
            widthRatioScale: .init(width: 0.1, height: 0.1),
            widthRatioTranslation: .zero
            ),
            markFadeOutDuration: 1.0)
        
        guard
            let videoSession,
            case .completed = videoSession.status,
            let outputURL = videoSession.outputURL
        else { return }
        DispatchQueue.main.async { [self] in
            player = .init(playerItem: .init(url: outputURL))
            player?.play()
        }
    }
}

struct VideoWatermarkingDemoView: View {
    
    @ObservedObject var observable = VideoWatermarkingObservable()
    
    var body: some View {
        Color.clear
        .background {
            if let player = observable.player {
                VideoPlayerView(player: player)
            } else {
                Color.black
            }
        }
        .task {
            try? await observable.processVideo()
        }
    }
}
