//
// Swiftfin is subject to the terms of the Mozilla Public
// License, v2.0. If a copy of the MPL was not distributed with this
// file, you can obtain one at https://mozilla.org/MPL/2.0/.
//
// Copyright (c) 2024 Jellyfin & Jellyfin Contributors
//

import Factory
import SwiftUI

// Want the default navigation bar `Image(systemName:)` styling
// but using within `ImageView.placeholder/failure` ruins it.
// Need to do manual checking of image loading.
struct SettingsBarButton: View {

    @State
    private var isUserImage = false

    let server: ServerState
    let user: UserState
    let action: () -> Void

    var body: some View {
        Button {
            action()
        } label: {
            Image(systemName: "gearshape.fill")
                .visible(!isUserImage)
                .overlay {
                    ZStack {
                        Color.clear

                        RedrawOnNotificationView(.didChangeUserProfileImage) {
                            ImageView(user.profileImageSource(
                                client: server.client,
                                maxWidth: 120
                            ))
                            .pipeline(.Swiftfin.branding)
                            .image { image in
                                image
                                    .posterBorder(ratio: 1 / 2, of: \.width)
                                    .onAppear {
                                        isUserImage = true
                                    }
                            }
                            .placeholder { _ in
                                Color.clear
                            }
                            .onDisappear {
                                isUserImage = false
                            }
                        }
                    }
                    .aspectRatio(contentMode: .fill)
                    .clipShape(.circle)
                }
        }
        .accessibilityLabel(L10n.settings)
    }
}
