import ComponentLibrary
import Foundation
import Localization
import SwiftUI
import Utilities

public struct HooksPostVideoPreview: View {
    let localVideoURL: URL?
    @Binding var isVideoPlaying: Bool
    let isLoadingClip: Bool
    let didTapPreview: () -> Void
    let restartTrigger: Int

    public init(
        localVideoURL: URL?,
        isVideoPlaying: Binding<Bool>,
        isLoadingClip: Bool = false,
        didTapPreview: @escaping () -> Void,
        restartTrigger: Int = 0
    ) {
        self.localVideoURL = localVideoURL
        self._isVideoPlaying = isVideoPlaying
        self.isLoadingClip = isLoadingClip
        self.didTapPreview = didTapPreview
        self.restartTrigger = restartTrigger
    }

    public var body: some View {
        videoPlayerButton
    }

    @ViewBuilder
    private var videoPlayerButton: some View {
        Button {
            didTapPreview()
        } label: {
            ZStack {
                if let localVideoURL {
                    videoPlayer(url: localVideoURL)
                } else {
                    fallbackGradient
                }
                previewLabel

                if isLoadingClip {
                    loadingOverlay
                }
            }
        }
    }

    @ViewBuilder
    private func videoPlayer(url: URL) -> some View {
        LoopingVideoPlayer(
            playableUrl: url,
            isPlaying: $isVideoPlaying,
            isMuted: true,
            videoGravity: .resizeAspectFill,
            fallbackView: {
                Color.gray
            },
            restartTrigger: restartTrigger
        )
        .clipped()
    }

    @ViewBuilder
    private var fallbackGradient: some View {
        AuraShaderView(
            id: "omniplayer_tooltip",
            colorSet: .custom(
                .custom(1.0846897, 0.07778742, 0.4651054),
                .custom(1.0, 0.28235295, 0.16078432),
                .custom(1.0, 0.69803923, 0.003921569)
            ),
            morphSpeed: 0.05,
            scale: 0.820,
            seed: 2.000
        )
    }

    @ViewBuilder
    private var previewLabel: some View {
        VStack {
            HStack {
                Text(L10n.FeatureHooks.preview)
                    .typographyV1(.caption5.size { _ in 12.0 })
                    .foregroundColor(.SemanticV1.textPrimary)
                    .padding(.vertical, 8)
                    .padding(.horizontal, 12)
                    .background(
                        RoundedRectangle(cornerRadius: 60)
                            .fill(.ultraThinMaterial)
                    )
                    .padding(.leading, 16)
                    .padding(.top, 16)
                    .disabled(isLoadingClip)
                Spacer()
            }
            Spacer()
        }
    }

    @ViewBuilder
    private var loadingOverlay: some View {
        ZStack {
            Color.black.opacity(0.3)
            GradientSpinner(size: .large,
                            startColor: .SemanticV2.backgroundDarkOverlay,
                            endColor: .SemanticV2.foregroundPrimary)
        }
    }
}
