//Put this your C# file.
 
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;

namespace EvendApiClientCSharp
{
    public class ClientApiSignatureCls
    {
        /// <summary>
        /// This is how to use this class to generate the signature value for X-Signature header and also generate nonce.
        /// Call the HowToUseToGenerateSignatureAndNonce method to get the X-Signature and X-Nonce values.
        /// var (X_Signature, Nonce) = ClientApiSignatureCls.HowToUseToGenerateSignatureAndNonce();
        /// </summary>
        /// <returns></returns>
        public static (string X_Signature, string X_Nonce) HowToUseToGenerateSignatureAndNonce()
        {
            var (dataToSign, nonce) = GetHeaderDataToSign();
            string privateKey = GetPrivateKeyInXmlFormat();
            string X_Signature = GenerateRequestSignatureFromXmlString(dataToSign, privateKey);
            return (X_Signature, nonce);
        }

        public static string GenerateNonce(string noncePrefix)
        {
            // NoncePrefix(4) nonceDate(6) HHmm(4) random(10)
            DateTime currentDate = DateTime.Now;
            string formattedDate = currentDate.ToString("yyMMdd");
            string formattedTime = currentDate.ToString("HHmm");
            string rnd = GenerateRandomNumbers(10);
            string ret = "";
            ret = noncePrefix + formattedDate + formattedTime + rnd;
            return ret;
        }

        private static string GenerateRandomNumbers(int n)
        {
            //Note you can make this more secure by using RNGCryptoServiceProvider
            // Create a new instance of the Random class
            Random random = new Random();
            StringBuilder sb = new StringBuilder(n);
            for (int i = 0; i < n; i++)
            {
                sb.Append(random.Next(0, 10));
            }
            return sb.ToString();
        }

    
        private static (string DataToSign, string Nonce) GetHeaderDataToSign()
        {
            string apiKey = "aaaaaaaaaaaaaaaaaaaaa"; //TO DO: Please put your API Key here. Get it from the API Configuration Page.
            string noncePrefix = "1234"; //TO DO: Please put your API Key here. Get it from the API Configuration Page.

            string nonce = GenerateNonce(noncePrefix);

            string dataToSign = apiKey + nonce;
            return (dataToSign, nonce);
        }


        private static string GetPrivateKeyInXmlFormat()
        {
            //TO DO: Get This Value from your API Configuration Page.
            string privateKey = "<RSAKeyValue><Modulus>qCytdIqTRkU/7m40hiZNyaG5doci6K3p1081+6/j6xCMJ5yixjarXwZJo1p0Pnj4FMIpOknO3M4XxYEt9uvpURrOIDwORrAjfHF4AXakP3KAwRJvPlPnKECF/qIrYULqkGMDu9V/joeAnfOzkQk+AVZxlpeyW/mCZ3qZIaJq0ADxygXsQMg/xo/U1Iaf/xnXbhqZ23YbmDn4HU3OouJNdSA/CWA1c1DXuJ9gXQADpMJxTfSVGVpSw94a5UBhJUhh1QdLgxxOuUoP92XLTLJusccykg9THjbqc07Go530CywoVp5QEStsYhNAfb4jXb2QrLWO/y9YxTO2eeHwFTwQDQ==</Modulus><Exponent>AQAB</Exponent><P>1uqcPNruGO9kgvNRCG/DmvdP8pGITXfB/z6X5Y3NGF4nnXZ/D2LNS5hgk0bdg8vw+dXxPyqK9iQ1p+AKnTBPf0mtR3fMqX8hGD2Iz+tihrTj7V3PHf72FamoDhEwWBl+ThP89Er7k7S6ABu/gKAVeA+blbnsCXfSyToSxR+JDrc=</P><Q>yFKnDi7NwXvoGxZSD+ksQVlbCGvBQ4bEzgewBZEX3/q18gAhBT16tTPY0zbTLup1XG2t1kTpou27WOnaR3MRR0U6OJW/FfVV7DSB8hSdmViNRYOhIxu7K9H3Wev3Q9Aav6Xm/p6Igxf2TYyq9Q1iUN3Ai7yZ4vLh4HcReoe101s=</Q><DP>fa7aC6SklSR6jTIp81sY8ykqMdr18QfWBaTfQ7l3dYaqeCVyDNdk446K+9X3eTntBM4etSf1+BgY4MHesyorc27szNy8bWsROZHSznUDO2/R02CG3S3bT7PVudRHh13xRUvfJCYtlaWdGK8hgOEdbQcDn74I0UinllJF482bY2U=</DP><DQ>jYHNXnhzgmUb3d6Tk4e8amFLrBQqTqAp7/yAPD51ZhP9aPjsWn5GazA3z2QgJDkdNHCJ5x2BCUX0HOf8+JHxN65QZV5qwIEw9A1XagFkHsnt6ZgFQP665kaI+21zmuSrsIvqNB0bA7fulnNy5G5S8BrlhBBziFzYcK7Lmwm4yJc=</DQ><InverseQ>VjEJgla5gt4PKg1IQs9GD249llUqZ/+r/ynSU4gEuJZd2nG7N2eC46snsH+S1nRuJye8T+tzwjtHUcueXGv/2x/dqRRLdm8t4SXXd0vpbDoxiJ2hnTN88GZqahN/guGQbxr/2Hj1CIPsMkBsF6TzOIdhLH4pBuOSLlqO5FhyVmQ=</InverseQ><D>I2kw5sqtAw1ezk4fOiYDmBK5EgeXZqYECIWRyNq644qa8FZPgewN/pa816wasPLYzcoqUy8qYxz0LW6rZoQ7HwxFXc03dlPtTO05hxlbsU5jZQQEL3wMPtIDROARwUuNR3TJ2vmz/6dxghDH/SCUkUSJ61sqv6oUdsR+TPI9imlpEOGEf6pZBzPqbCMns2nAieywZ3i6gG2U9iyzwN2NV8OE46IX50fDtYgtaoNxd5cmTHE/Td9kz92scxk66MGDVOsp9KnJOQU1NlG6bg9Xdsvy6FY+PUaeEvU2uVdO7Fbksh6dsdVOtINevWN+vZCb5CMo6K8/9PgukXA7n5VBYw==</D></RSAKeyValue>";

            return privateKey;
        }

        /// <summary>
        /// This method generates the request signature using the provided data and private key in XML format.
        /// </summary>
        /// <param name="data"></param>
        /// <param name="privateKey"></param>
        /// <returns></returns>
        private static string GenerateRequestSignatureFromXmlString(string data, string privateKey)
        {
            using (RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(2048))
            {
                rsaProvider.FromXmlString(privateKey);

                byte[] dataBytes = Encoding.UTF8.GetBytes(data);
                byte[] signatureBytes = rsaProvider.SignData(dataBytes, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
                string signature = Convert.ToBase64String(signatureBytes);
                return signature;
            }
        }


    }
}