import APIClient
import ComponentLibrary
import ComposableArchitecture
import CoreMedia
import Errors
import Foundation
import LyricsClient
import RequestState
import ShareAssetClient
import Utilities
import Waveform

@ObservableState
public struct AssetCreationState: Equatable {
    let clip: Clip
    var clipDuration: CMTime
    let shareURL: URL
    let targetDestination: ShareAssetCreationTarget
    let assetCreationPlayer = AssetCreationPlayerManager()
    @ObservationStateIgnored @ObservedBox var visualizerGallery: VisualizerGalleryReducer.State
    var selectedConfig: VisualizerAssetConfig?

    public init(
        clip: Clip,
        shareURL: URL,
        targetDestination: ShareAssetCreationTarget,
        lyricsData: LyricsDataV2,
        waveformData: WaveformData,
        lastGenerationURL: URL?
    ) {
        self.clip = clip
        self.shareURL = shareURL
        self.clipDuration = CMTime(seconds: clip.duration, preferredTimescale: 1000)
        self.targetDestination = targetDestination
        self.visualizerGallery = .init(
            clip: clip,
            lyricsData: lyricsData,
            lastGenerationURL: lastGenerationURL,
            targetDestination: targetDestination,
            waveformData: waveformData
        )

        let urlString = clip.playableSceneUrl?.absoluteString ?? clip.audioUrl
        guard let url = URL(string: urlString) else { return }
        assetCreationPlayer.setURL(url)
    }
}
