import SwiftUI
import AVFoundation
import AVKit

struct InlineVideoPlayer: View {
    @State private var player: AVPlayer?
    @State private var isLooping: Bool = true
    let videoAssetName: String
    let cornerRadius: CGFloat
    let onTimeUpdate: ((Double, Double) -> Void)?
    let onPlayerReady: ((AVPlayer) -> Void)?
    let isMuted: Bool
    
    init(videoAssetName: String = "sunohook_edited", cornerRadius: CGFloat = 8, onTimeUpdate: ((Double, Double) -> Void)? = nil, onPlayerReady: ((AVPlayer) -> Void)? = nil, isMuted: Bool = false) {
        self.videoAssetName = videoAssetName
        self.cornerRadius = cornerRadius
        self.onTimeUpdate = onTimeUpdate
        self.onPlayerReady = onPlayerReady
        self.isMuted = isMuted
    }
    
    var body: some View {
        VideoPlayer(player: player)
            .onAppear {
                setupVideoPlayer()
            }
            .onDisappear {
                player?.pause()
            }
            .clipShape(RoundedRectangle(cornerRadius: cornerRadius))
    }
    
    private func setupVideoPlayer() {
        // Try to get video as data asset first
        if let asset = NSDataAsset(name: videoAssetName) {
            let tempURL = FileManager.default.temporaryDirectory.appendingPathComponent("\(videoAssetName).mov")
            do {
                // Remove existing temp file if it exists
                if FileManager.default.fileExists(atPath: tempURL.path) {
                    try FileManager.default.removeItem(at: tempURL)
                }
                try asset.data.write(to: tempURL)
                
                player = AVPlayer(url: tempURL)
                player?.isMuted = isMuted
                setupLooping()
                setupTimeObserver()
                player?.play()
                onPlayerReady?(player!)
                print("🎬 Video player setup complete from data asset: \(videoAssetName) (muted: \(isMuted))")
                return
            } catch {
                print("❌ Failed to write video data asset: \(error)")
            }
        }
        
        // Fallback to bundle resources
        if let url = Bundle.main.url(forResource: videoAssetName, withExtension: "mov") {
            player = AVPlayer(url: url)
            player?.isMuted = isMuted
            setupLooping()
            setupTimeObserver()
            player?.play()
            onPlayerReady?(player!)
            print("🎬 Video player setup complete from bundle: \(videoAssetName) (muted: \(isMuted))")
        } else if let url = Bundle.main.url(forResource: videoAssetName, withExtension: "mp4") {
            player = AVPlayer(url: url)
            player?.isMuted = isMuted
            setupLooping()
            setupTimeObserver()
            player?.play()
            onPlayerReady?(player!)
            print("🎬 Video player setup complete from bundle: \(videoAssetName) (muted: \(isMuted))")
        } else {
            print("❌ Could not find video file: \(videoAssetName)")
        }
    }
    
    private func setupLooping() {
        guard let player = player else { return }
        
        // Set up looping
        NotificationCenter.default.addObserver(
            forName: .AVPlayerItemDidPlayToEndTime,
            object: player.currentItem,
            queue: .main
        ) { _ in
            if isLooping {
                player.seek(to: .zero)
                player.play()
            }
        }
    }
    
    private func setupTimeObserver() {
        guard let player = player else { return }
        
        // Add periodic time observer
        let timeScale = CMTimeScale(NSEC_PER_SEC)
        let time = CMTime(seconds: 0.1, preferredTimescale: timeScale)
        
        player.addPeriodicTimeObserver(forInterval: time, queue: .main) { [weak player] time in
            guard let player = player else { return }
            
            let currentTime = CMTimeGetSeconds(time)
            let duration = CMTimeGetSeconds(player.currentItem?.duration ?? CMTime.zero)
            
            if !currentTime.isNaN && !duration.isNaN && duration > 0 {
                onTimeUpdate?(currentTime, duration)
            }
        }
    }
    
    func play() {
        player?.play()
    }
    
    func pause() {
        player?.pause()
    }
}

#Preview {
    InlineVideoPlayer()
        .frame(width: 200, height: 250)
        .background(Constants.Colors.Background.primary)
}