//
//  View+AltWidget.swift
//  AltStore
//
//  Created by Riley Testut on 8/18/23.
//  Copyright © 2023 Riley Testut. All rights reserved.
//

import SwiftUI
import WidgetKit

extension View
{
    @ViewBuilder
    func widgetBackground(_ backgroundView: some View) -> some View
    {
        if #available(iOSApplicationExtension 17, *)
        {
            containerBackground(for: .widget) {
                backgroundView
            }
        }
        else
        {
            background(backgroundView)
        }
    }
    
    @ViewBuilder
    func invalidatableContentIfAvailable() -> some View
    {
        if #available(iOSApplicationExtension 17, *)
        {
            self.invalidatableContent()
        }
        else
        {
            self
        }
    }
    
    @ViewBuilder
    func activatesRefreshAllAppsIntent() -> some View
    {
        if #available(iOSApplicationExtension 17, *)
        {
            Button(intent: RefreshAllAppsWidgetIntent()) {
                self
            }
            .buttonStyle(.plain)
        }
        else
        {
            self
        }
    }

    @ViewBuilder
    func pageUpButton(_ widgetID: Int?, _ widgetKind: String) -> some View {
        if #available(iOSApplicationExtension 17, *) {
            Button(intent: PaginationIntent(widgetID, .up, widgetKind)){
                self
            }
            .buttonStyle(.plain)
        } else {
            self
        }
    }

    @ViewBuilder
    func pageDownButton(_ widgetID: Int?, _ widgetKind: String) -> some View {
        if #available(iOSApplicationExtension 17, *) {
            Button(intent: PaginationIntent(widgetID, .down, widgetKind)){
                self
            }
            .buttonStyle(.plain)
        } else {
            self
        }
    }

    /// Opts this view into the widget accent group on iOS 16+, which lets the
    /// system tint it with the user's chosen colour in tinted (accented) mode.
    /// No-op on older OS versions where the API does not exist.
    @ViewBuilder
    func widgetAccentableIfAvailable() -> some View
    {
        if #available(iOSApplicationExtension 16, *)
        {
            self.widgetAccentable()
        }
        else
        {
            self
        }
    }

    /// Applies `luminanceToAlpha()` only when the widget is rendering in
    /// accented (tinted) mode on iOS 16+. This converts the view's pixel
    /// brightness into opacity so the system can overlay the user's chosen
    /// tint colour correctly — without it, images appear as white rectangles
    /// in tinted mode. No-op in fullColor/dark/light mode and on older OS.
    @ViewBuilder
    func luminanceToAlphaInAccentedMode() -> some View
    {
        if #available(iOSApplicationExtension 16, *)
        {
            LuminanceToAlphaWrapper(content: self)
        }
        else
        {
            self
        }
    }

}

/// Helper view that reads widgetRenderingMode (iOS 16+) and conditionally
/// applies luminanceToAlpha(). Kept separate so the environment read is
/// cleanly scoped behind the @available gate.
@available(iOSApplicationExtension 16, *)
private struct LuminanceToAlphaWrapper<Content: View>: View
{
    let content: Content
    @Environment(\.widgetRenderingMode) private var renderingMode

    var body: some View {
        if renderingMode == .accented
        {
            content.luminanceToAlpha()
        }
        else
        {
            content
        }
    }
}
