using System;

namespace BilibiliMiniGame
{
    public sealed partial class BilibiliMiniGameSdk
    {
        public BilibiliMiniGameRequest BL_CheckScene(
            Action<CheckSceneResult> onSuccess,
            Action<BilibiliMiniGameError> onFail = null,
            Action onComplete = null)
        {
            return BL_CheckScene(
                BilibiliMiniGameScene.Sidebar,
                onSuccess,
                onFail,
                onComplete);
        }

        public BilibiliMiniGameRequest BL_CheckScene(
            string scene,
            Action<CheckSceneResult> onSuccess,
            Action<BilibiliMiniGameError> onFail = null,
            Action onComplete = null)
        {
            return BilibiliMiniGameBridge.BL_CheckScene(
                this,
                scene,
                BL_ResolveTimeout(),
                response => onSuccess?.Invoke(
                    new CheckSceneResult(response.IsExist, response.ErrorMessage)),
                onFail,
                onComplete);
        }

        public BilibiliMiniGameRequest BL_NavigateToScene(
            Action<NavigateToSceneResult> onSuccess = null,
            Action<BilibiliMiniGameError> onFail = null,
            Action onComplete = null)
        {
            return BL_NavigateToScene(
                BilibiliMiniGameScene.Sidebar,
                onSuccess,
                onFail,
                onComplete);
        }

        public BilibiliMiniGameRequest BL_NavigateToScene(
            string scene,
            Action<NavigateToSceneResult> onSuccess = null,
            Action<BilibiliMiniGameError> onFail = null,
            Action onComplete = null)
        {
            return BilibiliMiniGameBridge.BL_NavigateToScene(
                this,
                scene,
                BL_ResolveTimeout(),
                response => onSuccess?.Invoke(
                    new NavigateToSceneResult(response.ErrorMessage)),
                onFail,
                onComplete);
        }

        public BilibiliMiniGameRequest BL_AddShortcut(
            Action<AddShortcutResult> onSuccess = null,
            Action<BilibiliMiniGameError> onFail = null,
            Action onComplete = null)
        {
            return BilibiliMiniGameBridge.BL_AddShortcut(
                this,
                BL_ResolveTimeout(),
                response => onSuccess?.Invoke(
                    new AddShortcutResult(response.ErrorMessage)),
                onFail,
                onComplete);
        }

        public BilibiliMiniGameRequest BL_CheckShortcut(
            Action<CheckShortcutResult> onSuccess,
            Action<BilibiliMiniGameError> onFail = null,
            Action onComplete = null)
        {
            return BilibiliMiniGameBridge.BL_CheckShortcut(
                this,
                BL_ResolveTimeout(),
                response => onSuccess?.Invoke(
                    new CheckShortcutResult(response.IsExist, response.ErrorMessage)),
                onFail,
                onComplete);
        }

        public BilibiliMiniGameRequest BL_RequestRecharge(
            string orderId,
            string payInfo,
            string devOrderId = null,
            Action<RequestRechargeResult> onSuccess = null,
            Action<BilibiliMiniGameError> onFail = null,
            Action onComplete = null)
        {
            return BilibiliMiniGameBridge.BL_RequestRecharge(
                this,
                orderId,
                payInfo,
                devOrderId,
                BL_ResolveTimeout(),
                response => onSuccess?.Invoke(
                    new RequestRechargeResult(response.ErrorCode, response.ErrorMessage)),
                onFail,
                onComplete);
        }
    }
}
