import SwiftUI

struct ChannelAvatarView: View {
    var channel: Channel?
    var video: Video?

    var subscribedBadge = true

    @ObservedObject private var accounts = AccountsModel.shared
    @ObservedObject private var subscribedChannels = SubscribedChannelsModel.shared

    @State private var url: URL?
    @State private var loaded = false

    var body: some View {
        ZStack(alignment: .bottomTrailing) {
            Group {
                Group {
                    if let url {
                        ThumbnailView(url: url)
                    } else {
                        ZStack {
                            if loaded {
                                Image(systemName: "person.circle")
                                    .imageScale(.large)
                                    .foregroundColor(.accentColor)
                            } else {
                                Color("PlaceholderColor")
                            }

                            if let video, video.isLocal {
                                Image(systemName: video.localStreamImageSystemName)
                                    .foregroundColor(.accentColor)
                                    .font(.system(size: 20))
                                    .contentShape(Rectangle())
                                    .imageScale(.small)
                            }
                        }
                        .onAppear(perform: updateURL)
                    }
                }
                .clipShape(Circle())

                if subscribedBadge,
                   accounts.app.supportsSubscriptions,
                   accounts.signedIn,
                   let channel,
                   subscribedChannels.isSubscribing(channel.id)
                {
                    Image(systemName: "star.circle.fill")
                    #if os(tvOS)
                        .background(Color.black)
                    #else
                        .background(Color.background)
                    #endif
                        .clipShape(Circle())
                        .foregroundColor(.secondary)
                        .imageScale(.small)
                }
            }
        }
    }

    func updateURL() {
        DispatchQueue.global(qos: .userInitiated).async {
            if let url = channel?.thumbnailURLOrCached {
                DispatchQueue.main.async {
                    self.url = url
                }
            }
            self.loaded = true
        }
    }
}

struct ChannelAvatarView_Previews: PreviewProvider {
    static var previews: some View {
        ChannelAvatarView(channel: Video.fixture.channel)
    }
}