import APIClient
import ComposableArchitecture
import Foundation
import Localization
import SwiftUI

public struct PublishSongPopUp: View {
    let clip: Clip
    let publishAction: () -> Void
    let dismissAction: () -> Void
    let isPublishing: Bool

    public init(clip: Clip, publishAction: @escaping () -> Void, dismissAction: @escaping () -> Void, isPublishing: Bool) {
        self.clip = clip
        self.publishAction = publishAction
        self.dismissAction = dismissAction
        self.isPublishing = isPublishing
    }

    public var body: some View {
        VStack(spacing: 0) {
            SongDetailsTile(clip: clip)
                .padding(.top, 30)
                .padding(.bottom, 20)
            publishSongHeadlineAndDescription
            buttonStack
                .padding(.bottom, 10)
        }
        .frame(maxWidth: .infinity)
        .padding(.horizontal, 20)
        .environment(\.colorScheme, .dark)
        .selfSizingPresentation()
        .background(
            Color.SemanticV1.backgroundSecondary
                .ignoresSafeArea()
        )
    }

    @ViewBuilder
    private var publishSongHeadlineAndDescription: some View {
        VStack(alignment: .center, spacing: 0) {
            Text(L10n.FeatureHooks.publishSong)
                .typographyV1(.publishSongHeadlineFont)
                .multilineTextAlignment(.center)
                .foregroundStyle(Color.SemanticV1.textPrimary)
                .padding(.bottom, 8)

            Text(L10n.FeatureHooks.publishSongDescription)
                .fixedSize(horizontal: false, vertical: true)
                .typographyV1(.publishSongDescriptionFont)
                .multilineTextAlignment(.center)
                .foregroundStyle(Color.SemanticV1.textTertiary)
                .padding(.bottom, 24)
        }
    }

    @ViewBuilder
    private var buttonStack: some View {
        VStack(spacing: 0) {
            Button {
                publishAction()
            } label: {
                if isPublishing {
                    GradientSpinner(size: .large)
                        .padding(.vertical, 16)
                        .frame(maxWidth: .infinity)
                        .background(Color.SemanticV1.textPrimary)
                        .cornerRadius(100)
                } else {
                    Text(L10n.FeatureHooks.publish)
                        .typographyV1(.buttonFont)
                        .foregroundStyle(Color.SemanticV1.backgroundPrimary)
                        .padding(.vertical, 16)
                        .frame(maxWidth: .infinity)
                        .background(Color.SemanticV1.textPrimary)
                        .cornerRadius(100)
                }
            }
            .padding(.bottom, 16)

            Button {
                dismissAction()
            } label: {
                Text(L10n.FeatureHooks.dismiss)
                    .typographyV1(.buttonFont)
                    .foregroundStyle(Color.SemanticV1.textPrimary)
            }
            .padding(.top, 16)
        }
    }
}

private extension TypographyV1 {
    static let publishSongHeadlineFont: TypographyV1 = .init(
        name: "Publish Song Headline Font",
        size: 24,
        style: .body,
        weight: .ppNeueMontrealBold,
        kerning: 0.48
    )

    static let publishSongDescriptionFont: TypographyV1 = .init(
        name: "Publish Song Description Font",
        size: 16,
        style: .body,
        weight: .ppNeueMontrealRegular,
        kerning: 0.32,
        lineHeight: 28
    )

    static let buttonFont: TypographyV1 = .init(
        name: "Button Font",
        size: 18,
        style: .body,
        weight: .ppNeueMontrealMedium,
        kerning: 0.36
    )
}
