using System.Threading.Tasks;
using AchiesUtilities.Web.Models;
using NebulaAuth.Model.Entities;
using NebulaAuth.Model.Mafiles;
using SteamLib.Api.Mobile;
using SteamLib.Authentication;
using SteamLib.Authentication.LoginV2;
using SteamLib.Exceptions.Authorization;
using SteamLib.Factory.Helpers;
using SteamLib.SteamMobile;
using SteamLibForked.Models.Session;

namespace NebulaAuth.Model;

public partial class SessionHandler //API
{
    public static async Task RefreshMobileToken(HttpClientHandlerPair chp, Mafile mafile)
    {
        if (mafile.SessionData is not {RefreshToken.IsExpired: false})
            throw new SessionPermanentlyExpiredException(SessionInvalidException.SESSION_NULL_MSG);

        var mobileToken = await SteamMobileApi.RefreshJwt(chp.Client, mafile.SessionData.RefreshToken.Token,
            mafile.SessionData.SteamId);
        Shell.Logger.Info("MobileToken on {name} {steamid} successfully refreshed", mafile.AccountName,
            mafile.SessionData.SteamId);

        var newToken = SteamTokenHelper.Parse(mobileToken);
        mafile.SessionData.SetMobileToken(newToken);

        //Trigger PropertyChanged event for PortableMaClient handling session updated from MaClient
        mafile.SetSessionData(mafile.SessionData);
        await Storage.UpdateMafileAsync(mafile);
        chp.Handler.CookieContainer.SetSteamMobileCookiesWithMobileToken(mafile.SessionData);
    }

    public static async Task LoginAgain(HttpClientHandlerPair chp, Mafile mafile, string password, bool savePassword)
    {
        var sgGenerator = new SteamGuardCodeGenerator(mafile.SharedSecret);
        var options = new LoginV2ExecutorOptions(StaticLoginConsumer.Instance, chp.Client)
        {
            Logger = Shell.ExtensionsLogger,
            AuthProviders = [sgGenerator],
            DeviceDetails = DeviceDetailsDefaultBuilder.GetMobileDefaultDevice(),
            WebsiteId = "Mobile"
        };
        chp.Handler.CookieContainer.ClearMobileSessionCookies();
        var result = await LoginV2Executor.DoLogin(options, mafile.AccountName, password);
        Shell.Logger.Info("Logged in again on {name} {steamid}", mafile.AccountName, result.SteamId);
        AdmissionHelper.TransferCommunityCookies(chp.Handler.CookieContainer);

        //Triggers PropertyChanged event for PortableMaClient handling session updated from MaClient
        mafile.SetSessionData((MobileSessionData) result);
        if (PHandler.IsPasswordSet)
            mafile.Password = savePassword ? PHandler.Encrypt(password) : null;
        await Storage.UpdateMafileAsync(mafile);
    }
}