import Flutter
import UIKit
import ActivityKit

@main
@objc class AppDelegate: FlutterAppDelegate {
    private var liveActivityChannel: FlutterMethodChannel?

    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        GeneratedPluginRegistrant.register(with: self)

        // Set up Live Activity channel
        setupLiveActivityChannel()

        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }

    private func setupLiveActivityChannel() {
        guard let controller = window?.rootViewController as? FlutterViewController else {
            return
        }

        liveActivityChannel = FlutterMethodChannel(
            name: "com.buyerkiosk.team/live_activity",
            binaryMessenger: controller.binaryMessenger
        )

        liveActivityChannel?.setMethodCallHandler { [weak self] (call, result) in
            switch call.method {
            case "areActivitiesSupported":
                if #available(iOS 16.2, *) {
                    result(ActivityAuthorizationInfo().areActivitiesEnabled)
                } else {
                    result(false)
                }

            case "areActivitiesEnabled":
                if #available(iOS 16.2, *) {
                    result(ActivityAuthorizationInfo().areActivitiesEnabled)
                } else {
                    result(false)
                }

            case "startShiftActivity":
                if #available(iOS 16.2, *) {
                    self?.startShiftActivity(arguments: call.arguments, result: result)
                } else {
                    result(FlutterError(code: "UNSUPPORTED", message: "iOS 16.2+ required", details: nil))
                }

            case "updateShiftActivity":
                if #available(iOS 16.2, *) {
                    self?.updateShiftActivity(arguments: call.arguments, result: result)
                } else {
                    result(FlutterError(code: "UNSUPPORTED", message: "iOS 16.2+ required", details: nil))
                }

            case "endShiftActivity":
                if #available(iOS 16.2, *) {
                    self?.endShiftActivity(arguments: call.arguments, result: result)
                } else {
                    result(FlutterError(code: "UNSUPPORTED", message: "iOS 16.2+ required", details: nil))
                }

            default:
                result(FlutterMethodNotImplemented)
            }
        }
    }

    // MARK: - Live Activity Methods

    @available(iOS 16.2, *)
    private func startShiftActivity(arguments: Any?, result: @escaping FlutterResult) {
        guard let args = arguments as? [String: Any],
              let shiftStart = args["shiftStart"] as? String,
              let shiftEnd = args["shiftEnd"] as? String,
              let position = args["position"] as? String,
              let storeName = args["storeName"] as? String,
              let totalHours = args["totalHours"] as? Double else {
            result(FlutterError(code: "INVALID_ARGS", message: "Missing required arguments", details: nil))
            return
        }

        // End any existing shift activities first to prevent duplicates
        Task {
            for activity in Activity<ShiftActivityAttributes>.activities {
                await activity.end(dismissalPolicy: .immediate)
            }

            // Create the activity attributes
            let attributes = ShiftActivityAttributes(
                shiftStart: shiftStart,
                shiftEnd: shiftEnd,
                position: position,
                storeName: storeName,
                totalHours: totalHours
            )

            // Initial state
            let initialState = ShiftActivityAttributes.ContentState(
                elapsedMinutes: 0,
                progress: 0.0,
                elapsedFormatted: "0m",
                remainingFormatted: "\(Int(totalHours))h remaining"
            )

            do {
                let activity = try Activity.request(
                    attributes: attributes,
                    content: .init(state: initialState, staleDate: nil),
                    pushType: nil
                )
                result(activity.id)
            } catch {
                result(FlutterError(code: "START_FAILED", message: error.localizedDescription, details: nil))
            }
        }
    }

    @available(iOS 16.2, *)
    private func updateShiftActivity(arguments: Any?, result: @escaping FlutterResult) {
        guard let args = arguments as? [String: Any],
              let activityId = args["activityId"] as? String,
              let elapsedMinutes = args["elapsedMinutes"] as? Int,
              let progress = args["progress"] as? Double,
              let elapsedFormatted = args["elapsedFormatted"] as? String,
              let remainingFormatted = args["remainingFormatted"] as? String else {
            result(FlutterError(code: "INVALID_ARGS", message: "Missing required arguments", details: nil))
            return
        }

        let newState = ShiftActivityAttributes.ContentState(
            elapsedMinutes: elapsedMinutes,
            progress: progress,
            elapsedFormatted: elapsedFormatted,
            remainingFormatted: remainingFormatted
        )

        Task {
            for activity in Activity<ShiftActivityAttributes>.activities {
                if activity.id == activityId {
                    await activity.update(using: newState)
                    result(true)
                    return
                }
            }
            result(FlutterError(code: "NOT_FOUND", message: "Activity not found", details: nil))
        }
    }

    @available(iOS 16.2, *)
    private func endShiftActivity(arguments: Any?, result: @escaping FlutterResult) {
        let args = arguments as? [String: Any]
        let message = args?["message"] as? String ?? "Shift complete!"

        let finalState = ShiftActivityAttributes.ContentState(
            elapsedMinutes: 0,
            progress: 1.0,
            elapsedFormatted: message,
            remainingFormatted: ""
        )

        // End ALL shift activities to ensure cleanup (handles orphaned activities)
        Task {
            var endedCount = 0
            for activity in Activity<ShiftActivityAttributes>.activities {
                await activity.end(using: finalState, dismissalPolicy: .default)
                endedCount += 1
            }
            result(endedCount > 0)
        }
    }
}
