@using global::Shared.DTOs
@using System.Text
@inject HttpClient _hc
@inject IJSRuntime JS
<div class="contact-info-area pb-90"  id="TaxTools">
    <div class="container">
        <div class="row">
        </div>
    </div>
</div>
<div class="tp-project__area grey-bg pt-50 pb-50 fix" >
    <div class="container">
        <div class="row gx-0">
            <h5 class="inner-section-subtitle">ابزار/سامانه مودیان</h5>
        </div>
        <div class="row">
            <div class="col-12">
                <div class="popular-blog-title mb-40">
                    <h4>1)ساخت فایل CSR</h4>
                </div>
            </div>
        </div>
        <div class="row gx-0">
            <div class="contact-form-right-warp">
                <div class="postbox__comment-form">
                    <EditForm EditContext="editContext" OnValidSubmit="CreateCsrAndPrivateKey">
                        <DataAnnotationsValidator />
                        <div class="postbox__comment-input mb-35">
                            <ValidationMessage For="()=>modelTaxTools.cn" />
                            <ValidationMessage For="()=>modelTaxTools.sn" />
                            <ValidationMessage For="()=>modelTaxTools.company" />
                            <ValidationMessage For="()=>modelTaxTools.Mobile" />
                        </div>
                        <div class="row gx-20">
                            <div class="col-12">
                                <div class="postbox__comment-input mb-30">
                                    <InputText style="text-align:center" dir="ltr" @bind-Value="modelTaxTools.cn" id="cn" type="text" class="inputText" required="" />
                                    <span class="floating-label">نام شرکت به حالت فینگلیش</span>
                                </div>
                            </div>
                            <div class="col-12">
                                <div class="postbox__comment-input mb-30">
                                    <InputText style="text-align:center" @bind-Value="modelTaxTools.sn" id="sn" dir="ltr" type="number" class="inputText" required="" />
                                    <span class="floating-label">شناسه ملی شرکت</span>
                                </div>
                            </div>
                            <div class="col-12">
                                <div class="postbox__comment-input mb-35">
                                    <InputText style="text-align:center" @bind-Value="modelTaxTools.company" id="company" type="text" class="inputText" required="" />
                                    <span class="floating-label">نام شرکت به فارسی</span>
                                </div>
                            </div>
                            <div class="col-12">
                                <div class="postbox__comment-input mb-35">
                                    <InputText style="text-align:center" @bind-Value="modelTaxTools.Mobile" dir="ltr" id="Mobile" type="number" class="inputText" required="" />
                                    <span class="floating-label">موبایل</span>
                                </div>
                            </div>
                            <div class="col-xxl-6">

                                <div class="postbox__btn-box w-50">
                                    <Button Disabled="SpinnerVisible" Type="ButtonType.Submit" Color="ButtonColor.Primary">ایجاد CSR و PrivateKey</Button>
                                </div>

                            </div>
                            @*  <div class="col-xxl-6">
                            <div class="postbox__btn-box">
                            <a onclick="@ReadPublicKeyFromCER" class="btn btn-outline-primary">2)خواندن PublicKey</a>
                            </div>
                            </div> *@
                        </div>
                    </EditForm>
                    <br /> 
                        <Spinner Visible="SpinnerVisible" Color="SpinnerColor.Primary" />
             <br />
                    <div class="row">
                        <div class="col-12">
                            <div class="popular-blog-title mb-20">
                                <h4>2)خواندن کلید عمومی</h4>
                            </div>
                            <div class="row">
                            <label style="color:red">
                                @ErrorReadpublickey
                            </label>
                            </div>
                            <div class="row">
                                <label>
                                   حداکثر سایز مجاز فایل @maxFileSize بایت:
                                    <InputFile 
                                       
                                        hidden="@hidden" 
                                        
                                        OnChange="ReadPublicKeyFromCER" multiple />
                                </label>
                            </div>
                        </div>
                    </div>
                   
                 
                </div>
            </div>

        </div>
    </div>
</div>

@code {
    public string hidden { get; set; }
    public bool SpinnerVisible { get; set; } = false;
    private long maxFileSize = 1024 * 15;
    public string ErrorReadpublickey { get; set; }

    private EditContext? editContext;
    [SupplyParameterFromForm]
    private CsrPrivateKeyDto? modelTaxTools { get; set; } = new CsrPrivateKeyDto();

    private ValidationMessageStore? messageStore;

    protected override void OnInitialized()
    {
        SpinnerVisible = false;
        hidden = null;
        // modelTaxTools ??= new();
        // editContext = new(modelTaxTools);
        // editContext.OnValidationRequested += HandleValidationRequested;
        // messageStore = new(editContext);

        editContext = new EditContext(modelTaxTools);
        messageStore = new(editContext);

        base.OnInitialized();
    }

    // private void HandleValidationRequested(object? sender,
    //     ValidationRequestedEventArgs args)
    // {
    //     messageStore?.Clear();


    //      //   messageStore?.Add(() => modelTaxTools.Mobile, "Select at least one.");

    // }
}
@functions {
    private async Task CreateCsrAndPrivateKey()
    {
        hidden = "hidden";
        SpinnerVisible = true;
        var request = await _hc.PostAsJsonAsync("Base/CreateCsrAndPrivateKey", modelTaxTools);
        if (request.IsSuccessStatusCode)
        {
            messageStore?.Clear();
            var res = await request.Content.ReadFromJsonAsync<TaxToolsDTO>();
            await DownloadFileFromStream(res.Base64csr, $"{modelTaxTools.cn}.{res.typecsr}");
            await DownloadFileFromStream(res.Base64key, $"{modelTaxTools.cn}.{res.typekey}");
        }
        else
        {
            var error = await request.Content.ReadFromJsonAsync<List<string>>();
            messageStore?.Add(() => modelTaxTools.Mobile, error);

        }
        SpinnerVisible = false;
        hidden = null;
    }
    private async Task ReadPublicKeyFromCER(InputFileChangeEventArgs e)
    {
        hidden = "hidden";
        SpinnerVisible = true;
        ErrorReadpublickey = "";
        if (e.GetMultipleFiles()[0].Size <= maxFileSize)
        {
            string Base64Str = "";
            using (MemoryStream stream = new MemoryStream())
            {
                await e.GetMultipleFiles()[0].OpenReadStream(maxFileSize).CopyToAsync(stream);

                byte[] Array = stream.ToArray();
                Base64Str = Convert.ToBase64String(Array);

            }

            if (!string.IsNullOrEmpty(Base64Str))
            {
                var request = await _hc.PostAsJsonAsync("Base/ReadPublicKeyFromCER", Base64Str);
                if (request.IsSuccessStatusCode)
                {
                    var res = await request.Content.ReadFromJsonAsync<PublicKeyDTO>();
                    await DownloadFileFromStream(res.PublicKeyBase64, $"{modelTaxTools.cn}.{res.type}");
                }
                else
                {
                    ErrorReadpublickey = "خطایی در اجرای عملیات رخ داده";
                }
            }
        }
        else
        {
            ErrorReadpublickey = "حجم فایل بیشتر از حد مجاز می باشد";
        }
        hidden = null;
        SpinnerVisible = false;

    }
    private Stream GetFileStream(byte[] bytes)
    {
        hidden = "hidden";
        SpinnerVisible = true;
        var fileStream = new MemoryStream(bytes);
        SpinnerVisible=false;
        hidden = null;
        return fileStream;
    }
    private async Task DownloadFileFromStream(string Base64, string FileName)
    {
        hidden = "hidden";
        SpinnerVisible = true;
        byte[] bytes = System.Convert.FromBase64String(Base64);

        var fileStream = GetFileStream(bytes);
        // var fileName = "log.bin";

        using var streamRef = new DotNetStreamReference(stream: fileStream);
        SpinnerVisible = false  ;
        hidden = null;
        await JS.InvokeVoidAsync("downloadFileFromStream", FileName, streamRef);
    }
}
<script>
    window.downloadFileFromStream = async (fileName, contentStreamReference) => {
        const arrayBuffer = await contentStreamReference.arrayBuffer();
        const blob = new Blob([arrayBuffer]);
        const url = URL.createObjectURL(blob);
        const anchorElement = document.createElement('a');
        anchorElement.href = url;
        anchorElement.download = fileName ?? '';
        anchorElement.click();
        anchorElement.remove();
        URL.revokeObjectURL(url);
    }
</script>