import Capacitor
import GameKit
import UIKit

/// GameKit leaderboards: score submission + the native leaderboard overlay.
internal class LeaderboardsModule: PgsModule, GKGameCenterControllerDelegate {
    func submit(_ call: CAPPluginCall) {
        guard let leaderboardID = call.getString("leaderboardId") else {
            call.reject("missing leaderboardId"); return
        }
        let scoreDouble = call.getDouble("score") ?? 0
        let score = Int(scoreDouble)

        GKLeaderboard.submitScore(
            score,
            context: 0,
            player: GKLocalPlayer.local,
            leaderboardIDs: [leaderboardID]
        ) { error in
            if let error = error {
                call.reject(error.localizedDescription, nil, error)
            } else {
                call.resolve()
            }
        }
    }

    func show(_ call: CAPPluginCall) {
        guard let leaderboardID = call.getString("leaderboardId") else {
            call.reject("missing leaderboardId"); return
        }
        DispatchQueue.main.async {
            guard let presenter = self.topViewController() else {
                call.reject("no presenter available"); return
            }
            let controller: GKGameCenterViewController
            if #available(iOS 14.0, *) {
                controller = GKGameCenterViewController(
                    leaderboardID: leaderboardID,
                    playerScope: .global,
                    timeScope: .allTime
                )
            } else {
                controller = GKGameCenterViewController()
                controller.viewState = .leaderboards
                controller.leaderboardIdentifier = leaderboardID
            }
            controller.gameCenterDelegate = self
            presenter.present(controller, animated: true) { call.resolve() }
        }
    }

    func showAll(_ call: CAPPluginCall) {
        DispatchQueue.main.async {
            guard let presenter = self.topViewController() else {
                call.reject("no presenter available"); return
            }
            let controller: GKGameCenterViewController
            if #available(iOS 14.0, *) {
                controller = GKGameCenterViewController(state: .leaderboards)
            } else {
                controller = GKGameCenterViewController()
                controller.viewState = .leaderboards
            }
            controller.gameCenterDelegate = self
            presenter.present(controller, animated: true) { call.resolve() }
        }
    }

    // MARK: - GKGameCenterControllerDelegate

    func gameCenterViewControllerDidFinish(_ controller: GKGameCenterViewController) {
        controller.dismiss(animated: true)
    }
}
