import Foundation
import Siesta

final class FavoriteResourceObserver: ObservableObject, ResourceObserver {
    @Published var contentItems = [ContentItem]()

    func resourceChanged(_ resource: Resource, event _: ResourceEvent) {
        // swiftlint:disable discouraged_optional_collection
        var newVideos: [Video]?
        var newItems: [ContentItem]?
        // swiftlint:enable discouraged_optional_collection

        var newChannel: Channel?
        var newChannelPlaylist: ChannelPlaylist?
        var newPlaylist: Playlist?
        var newPage: SearchPage?

        if let videos: [Video] = resource.typedContent() {
            newVideos = videos
        } else if let channel: Channel = resource.typedContent() {
            newChannel = channel
        } else if let playlist: ChannelPlaylist = resource.typedContent() {
            newChannelPlaylist = playlist
        } else if let playlist: Playlist = resource.typedContent() {
            newPlaylist = playlist
        } else if let page: SearchPage = resource.typedContent() {
            newPage = page
        } else if let items: [ContentItem] = resource.typedContent() {
            newItems = items
        }

        DispatchQueue.global(qos: .userInitiated).async {
            var newContentItems: [ContentItem] = []

            if let videos = newVideos {
                newContentItems = videos.map { ContentItem(video: $0) }
            } else if let channel = newChannel {
                newContentItems = channel.videos.map { ContentItem(video: $0) }
            } else if let playlist = newChannelPlaylist {
                newContentItems = playlist.videos.map { ContentItem(video: $0) }
            } else if let playlist = newPlaylist {
                newContentItems = playlist.videos.map { ContentItem(video: $0) }
            } else if let page = newPage {
                newContentItems = page.results
            } else if let items = newItems {
                newContentItems = items
            }

            DispatchQueue.main.async {
                if !newContentItems.isEmpty {
                    self.contentItems = newContentItems
                }
            }
        }
    }
}