using AyCode.Core.Consts;
using AyCode.Core.Helpers;
using AyCode.Interfaces.Addresses;
using AyCode.Interfaces.Logins;
using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.ServiceProviders;
using AyCode.Interfaces.Users;

namespace AyCode.Services.Logins;

public class AcLoginServiceClient<TUser, TProfile, TCompany, TUserToServiceProvider, TProfileAddress>
    : AcLoginServiceBase<TUser, TProfile, TCompany, TUserToServiceProvider, TProfileAddress>, IAcLoginServiceClient<TUser, TProfile, TCompany, TUserToServiceProvider, TProfileAddress>

    where TUser : class, IAcUser<TProfile, TCompany, TUserToServiceProvider, TProfileAddress>
    where TProfile : class, IAcProfile<TProfileAddress>
    where TCompany : class, IAcCompanyBase
    where TUserToServiceProvider : class, IAcUserToCompanyBase
    where TProfileAddress : class, IAcAddress
{
    public virtual TUser? Login(string email, string password, out string accessToken)
    {
        throw new NotImplementedException();
    }

    public virtual Task<TUser?> LoginAsync(string email, string password)
    {
        return TaskHelper.ToThreadPoolTask(() => Login(email, password, out _));
    }

    public virtual bool Logout()
    {
        throw new NotImplementedException();
    }

    public virtual Task<bool> LogoutAsync()
    {
        return TaskHelper.ToThreadPoolTask(Logout);
    }

    public virtual AcErrorCode Registration(string email, string password, string? phoneNumber = null, Guid? referralId = null)
    {
        throw new NotImplementedException();
    }

    public virtual AcErrorCode Registration(Guid userId, string email, string password, string? phoneNumber = null, Guid? referralId = null)
    {
        throw new NotImplementedException();
    }

    public virtual Task<AcErrorCode> RegistrationAsync(string email, string password, string? phoneNumber = null, Guid? referralId = null)
    {
        return TaskHelper.ToThreadPoolTask(() => Registration(email, password, phoneNumber));
    }

    public virtual Task<AcErrorCode> RegistrationAsync(Guid userId, string email, string password, string? phoneNumber = null, Guid? referralId = null)
    {
        throw new NotImplementedException();
    }

    public virtual AcErrorCode ChangePassword(Guid userId, string oldPassword, string newPassword)
    {
        throw new NotImplementedException();
    }

    public virtual Task<AcErrorCode> ChangePasswordAsync(Guid userId, string oldPassword, string newPassword)
    {
        throw new NotImplementedException();
    }

    public AcErrorCode ForgotPassword(string email, string newPassword)
    {
        throw new NotImplementedException();
    }

    public async Task<AcErrorCode> ForgotPasswordAsync(string email, string newPassword)
    {
        throw new NotImplementedException();
    }
}