using Back.Common;
using Microsoft.IdentityModel.Tokens;
using TaxCollectData.Library.Business;
using TaxCollectData.Library.Dto.Config;
using TaxCollectData.Library.Dto.Content;
using TaxCollectData.Library.Dto.Properties;
using TaxCollectData.Library.Dto.Transfer;
using TaxCollectData.Library.Enums;

namespace Back.Services
{
    public class ActionTaxPayer
    {
        private string _UniqueMemory;
        private string _PrivateKey;
        private readonly servCompany _servCompany;
        public ActionTaxPayer(servCompany servCompany)
        {
            _servCompany = servCompany;
        }
        public string GenerateTaxid(string FactorNo, string InvoiceDate)
        {
            return TaxApiService.Instance.TaxIdGenerator.GenerateTaxId(_UniqueMemory,
                   Convert.ToInt64(FactorNo), InvoiceDate.ToMiladi());
        }
        public async Task<InquiryResultModel> GetResultByUid(int CompanyID, string uid)
        {
            if (!await login(CompanyID))
                return null;
            var uidAndFiscalId = new UidAndFiscalId(uid, _UniqueMemory);
            var inquiryResultModels = TaxApiService.Instance.TaxApis.InquiryByUidAndFiscalId(new() { uidAndFiscalId });
            if (inquiryResultModels.Count > 0)
                return inquiryResultModels[0];
            return null;
        }
        public async Task<TaxCollectData.Library.Dto.HttpResponse<AsyncResponseModel>> SendInvoice(int CompanyID,InvoiceHeaderDto header, List<InvoiceBodyDto> InvoiceBody, PaymentDto payment)
        {
            if (!await login(CompanyID))
                return null;
            return await TaxApiService.Instance.TaxApis.SendInvoicesAsync(new List<InvoiceDto>()
          {
              new()
              {
                  Header =header,Body =InvoiceBody,Payments  = new() {payment}
              }
          }
            , null);
        }
        public async Task<EconomicCodeModel?> GetEconomicCodeInformation(string Item)
        {
            return await TaxApiService.Instance.TaxApis.GetEconomicCodeInformationAsync(Item);
        }
        //-------------------internal
        public async Task<bool> login(int CompanyID)
        {
            try
            {
                #region TokenTax
                var resquth = await _servCompany.GetTaxAuth(CompanyID);
                if (string.IsNullOrEmpty(resquth.UniqueMemory) || string.IsNullOrEmpty(resquth.PrivateKey))
                    return false;

                if (!string.IsNullOrEmpty(resquth.UniqueMemory) && !string.IsNullOrEmpty(resquth.PrivateKey))
                {
                    _UniqueMemory = resquth.UniqueMemory;
                    _PrivateKey = resquth.PrivateKey;
                    TaxApiService.Instance.Init(_UniqueMemory,
                                     new SignatoryConfig(_PrivateKey, null),
                                     new NormalProperties(ClientType.SELF_TSP), "https://tp.tax.gov.ir/req/api/");
                    await TaxApiService.Instance.TaxApis.GetServerInformationAsync();
                }
                #endregion

                if (TaxApiService.Instance.TaxApis.GetToken() is null)
                {
                    if (await TaxApiService.Instance.TaxApis.RequestTokenAsync() == null)
                        return false;
                }
                return true;
            }
            catch (Exception)
            {
                return false;
            }

        }

       
    }
}
