using System.Security.Claims;
using e_suite.API.Common;
using e_suite.Service.Sentinel;
using e_suite.UnitTestCore;
using eSuite.API.Controllers;
using eSuite.API.SingleSignOn;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Moq;

namespace eSuite.API.UnitTests.Controllers.AccountControllerUnitTests;

public abstract class AccountControllerTestBase : TestBase
{
    protected AccountController _accountController = null!;
    protected Mock<IUserManager> _userManagerMock = null!;
    protected Mock<ISentinel> _sentinelMock = null!;
    protected Mock<ISingleSignOn> _singleSignOnMock = null!;
    protected Mock<ICookieManager> _cookieManagerMock = null!;

    public override async Task Setup()
    {
        await base.Setup();

        _userManagerMock = new Mock<IUserManager>();
        _sentinelMock = new Mock<ISentinel>();
        _singleSignOnMock = new Mock<ISingleSignOn>();
        _cookieManagerMock = new Mock<ICookieManager>();

        _accountController = new AccountController(_userManagerMock.Object,_sentinelMock.Object, _singleSignOnMock.Object, _cookieManagerMock.Object);
    }

    protected void AddAuthorisedUserToController(long id, string email, string displayName)
    {
        var user = new ClaimsPrincipal(new ClaimsIdentity(new Claim[]
        {
            new(ClaimTypes.PrimarySid, id.ToString()),
            new(ClaimTypes.Email, email),
            new(ClaimTypes.Name, displayName)
            // other required and custom claims
        }, "TestAuthentication"));

        _accountController.ControllerContext = new ControllerContext
        {
            HttpContext = new DefaultHttpContext { User = user }
        };
    }

}