# ── AppIntent.swift ──
//
//  AppIntent.swift
//  RamonWidgets
//
//  Created by Marc Fawaz on 16/03/2026.
//

import WidgetKit
import AppIntents

struct ConfigurationAppIntent: WidgetConfigurationIntent {
    static var title: LocalizedStringResource { "Configuration" }
    static var description: IntentDescription { "This is an example widget." }

    // An example configurable parameter.
    @Parameter(title: "Favorite Emoji", default: "😃")
    var favoriteEmoji: String
}


# ── Info.plist ──
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>NSExtension</key>
	<dict>
		<key>NSExtensionPointIdentifier</key>
		<string>com.apple.widgetkit-extension</string>
	</dict>
</dict>
</plist>


# ── RamonWidgets.swift ──
//  RamonWidgets/RamonWidgets.swift
import WidgetKit
import SwiftUI

struct RamonEntry: TimelineEntry {
    let date: Date
    let event: WidgetEvent?
}

struct RamonProvider: TimelineProvider {

    func placeholder(in context: Context) -> RamonEntry {
        RamonEntry(
            date: Date(),
            event: WidgetEvent(
                title: "No Events",
                subtitle: "Waiting",
                timestamp: Date()
            )
        )
    }

    func getSnapshot(in context: Context, completion: @escaping (RamonEntry) -> ()) {
        completion(load())
    }

    func getTimeline(in context: Context, completion: @escaping (Timeline<RamonEntry>) -> ()) {

        let entry = load()

        let timeline = Timeline(
            entries: [entry],
            policy: .after(Date().addingTimeInterval(60))
        )

        completion(timeline)
    }

    private func load() -> RamonEntry {

        RamonEntry(
            date: Date(),
            event: WidgetEventStore.load()
        )
    }
}


# ── RamonWidgetsBundle.swift ──
//
//  RamonWidgets/RamonWidgetsBundle.swift
//


@main
struct RamonWidgets: WidgetBundle {

    var body: some Widget {
        RamonWidget()
    }

}


# ── RamonWidgetsControl.swift ──
//
//  RamonWidgetsControl.swift
//  RamonWidgets
//
//  Created by Marc Fawaz on 16/03/2026.
//

import AppIntents
import SwiftUI
import WidgetKit

struct RamonWidgetsControl: ControlWidget {
    static let kind: String = "fawaxx.Ramon.RamonWidgets"

    var body: some ControlWidgetConfiguration {
        AppIntentControlConfiguration(
            kind: Self.kind,
            provider: Provider()
        ) { value in
            ControlWidgetToggle(
                "Start Timer",
                isOn: value.isRunning,
                action: StartTimerIntent(value.name)
            ) { isRunning in
                Label(isRunning ? "On" : "Off", systemImage: "timer")
            }
        }
        .displayName("Timer")
        .description("A an example control that runs a timer.")
    }
}

extension RamonWidgetsControl {
    struct Value {
        var isRunning: Bool
        var name: String
    }

    struct Provider: AppIntentControlValueProvider {
        func previewValue(configuration: TimerConfiguration) -> Value {
            RamonWidgetsControl.Value(isRunning: false, name: configuration.timerName)
        }

        func currentValue(configuration: TimerConfiguration) async throws -> Value {
            let isRunning = true // Check if the timer is running
            return RamonWidgetsControl.Value(isRunning: isRunning, name: configuration.timerName)
        }
    }
}

struct TimerConfiguration: ControlConfigurationIntent {
    static let title: LocalizedStringResource = "Timer Name Configuration"

    @Parameter(title: "Timer Name", default: "Timer")
    var timerName: String
}

struct StartTimerIntent: SetValueIntent {
    static let title: LocalizedStringResource = "Start a timer"

    @Parameter(title: "Timer Name")
    var name: String

    @Parameter(title: "Timer is running")
    var value: Bool

    init() {}

    init(_ name: String) {
        self.name = name
    }

    func perform() async throws -> some IntentResult {
        // Start the timer…
        return .result()
    }
}


# ── RamonWidgetsLiveActivity.swift ──
//
//  RamonWidgetsLiveActivity.swift
//  RamonWidgets
//
//  Created by Marc Fawaz on 16/03/2026.
//

import ActivityKit
import WidgetKit
import SwiftUI

struct RamonWidgetsAttributes: ActivityAttributes {
    public struct ContentState: Codable, Hashable {
        // Dynamic stateful properties about your activity go here!
        var emoji: String
    }

    // Fixed non-changing properties about your activity go here!
    var name: String
}

struct RamonWidgetsLiveActivity: Widget {
    var body: some WidgetConfiguration {
        ActivityConfiguration(for: RamonWidgetsAttributes.self) { context in
            // Lock screen/banner UI goes here
            VStack {
                Text("Hello \(context.state.emoji)")
            }
            .activityBackgroundTint(Color.cyan)
            .activitySystemActionForegroundColor(Color.black)

        } dynamicIsland: { context in
            DynamicIsland {
                // Expanded UI goes here.  Compose the expanded UI through
                // various regions, like leading/trailing/center/bottom
                DynamicIslandExpandedRegion(.leading) {
                    Text("Leading")
                }
                DynamicIslandExpandedRegion(.trailing) {
                    Text("Trailing")
                }
                DynamicIslandExpandedRegion(.bottom) {
                    Text("Bottom \(context.state.emoji)")
                    // more content
                }
            } compactLeading: {
                Text("L")
            } compactTrailing: {
                Text("T \(context.state.emoji)")
            } minimal: {
                Text(context.state.emoji)
            }
            .widgetURL(URL(string: "http://www.apple.com"))
            .keylineTint(Color.red)
        }
    }
}

extension RamonWidgetsAttributes {
    fileprivate static var preview: RamonWidgetsAttributes {
        RamonWidgetsAttributes(name: "World")
    }
}

extension RamonWidgetsAttributes.ContentState {
    fileprivate static var smiley: RamonWidgetsAttributes.ContentState {
        RamonWidgetsAttributes.ContentState(emoji: "😀")
     }
     
     fileprivate static var starEyes: RamonWidgetsAttributes.ContentState {
         RamonWidgetsAttributes.ContentState(emoji: "🤩")
     }
}

#Preview("Notification", as: .content, using: RamonWidgetsAttributes.preview) {
   RamonWidgetsLiveActivity()
} contentStates: {
    RamonWidgetsAttributes.ContentState.smiley
    RamonWidgetsAttributes.ContentState.starEyes
}


# ── WidgetDefinition.swift ──
//  RamonWidgets/WidgetDefinition.swift
struct RamonWidget: Widget {

    let kind: String = "RamonWidget"

    var body: some WidgetConfiguration {

        StaticConfiguration(
            kind: kind,
            provider: RamonProvider()
        ) { entry in
            RamonWidgetView(entry: entry)
        }
        .configurationDisplayName("Ramon Events")
        .description("Recent activity")
        .supportedFamilies([
            .systemSmall,
            .systemMedium,
            .accessoryRectangular
        ])
    }
}

# ── WidgetView.swift ──
//  RamonWidgets/WidgetView.swift
struct RamonWidgetView: View {

    var entry: RamonProvider.Entry

    var body: some View {

        if let event = entry.event {

            VStack(alignment: .leading) {

                Text(event.title)
                    .font(.headline)

                Text(event.subtitle)
                    .font(.caption)
                    .foregroundColor(.secondary)

                Spacer()

                Text(event.timestamp, style: .time)
                    .font(.caption2)

            }

        } else {

            Text("No Events")
        }
    }
}

