namespace Netina.Infrastructure.Services;

public class SmsService(
    IRestApiWrapper restApiWrapper,
    IOptionsSnapshot<SiteSettings> optionsSnapshot,
    ILogger<SmsService> logger,
    IHostEnvironment environment)
    : ISmsService
{
    private readonly SiteSettings _siteSettings = optionsSnapshot.Value;

    public async Task SendForgerPasswordAsync(string phoneNumber, string newPassword)
    {
        var rest = await restApiWrapper.KaveNegarRestApi.SendLookUp(_siteSettings.KaveNegarApiKey, phoneNumber, newPassword,
            null, null
            , null, null, "forgetPassword");

        if (rest.Return.status != 200)
            throw new BaseApiException(ApiResultStatusCode.SendSmsError, rest.Return.message);
    }

    public async Task SendVerifyCodeAsync(string phoneNumber, string verifyCode)
    {

        try
        {
            var rest = await restApiWrapper.KaveNegarRestApi.SendLookUp(_siteSettings.KaveNegarApiKey, phoneNumber, _siteSettings.LoginOtpTemplate,verifyCode);

            if (rest.Return.status != 200 && environment.IsProduction())
                throw new BaseApiException(ApiResultStatusCode.SendSmsError, rest.Return.message);
        }
        catch (ApiException apiException)
        {
            if (environment.IsProduction())
                throw;
            else
                logger.LogError(apiException.Message);
        }
        catch (Exception apiException)
        {
            if (environment.IsProduction())
                throw;
            else
                logger.LogError(apiException.Message);
        }
    }

    public async Task SendLookUpAsync(string phoneNumber, string template, string token, string? token2 = null, string? token3 = null, string? token10 = null, string? token20 = null)
    {
        try
        {
            var rest = await restApiWrapper.KaveNegarRestApi.SendLookUp(_siteSettings.KaveNegarApiKey, phoneNumber,template,token,token2,token3,token10,token20);

            if (rest.Return.status != 200)
                throw new BaseApiException(ApiResultStatusCode.SendSmsError, rest.Return.message);
        }
        catch (ApiException apiException)
        {
            logger.LogError(apiException.Message);
        }
        catch (Exception apiException)
        {
            logger.LogError(apiException.Message);
        }
    }

}