@using Front.Services
@using Shared
@using Shared.DTOs
@inject Fixedvalues fv;
@inject HttpClientController hc;
<ConfirmDialog @ref="dialog" />
<Grid @ref="grid"
    AllowRowClick="true"
      TItem="InvoicePaymentDTO"
      Class="table table-hover table-bordered table-striped mt-3"
      Data="invoice.payments"
      OnRowClick="OnRowClick"
      Responsive="true">

    <GridColumns>
        <GridColumn TItem="InvoicePaymentDTO" TextAlignment="Alignment.Center" HeaderTextAlignment="Alignment.Center" HeaderText="شماره سوییچ پرداخت" PropertyName="iinn">
            @context.iinn
        </GridColumn>
        <GridColumn TItem="InvoicePaymentDTO" TextAlignment="Alignment.Center" HeaderTextAlignment="Alignment.Center" HeaderText="شماره پذیرنده فروشگاهی" PropertyName="acn">
            @context.acn
        </GridColumn>
        <GridColumn TItem="InvoicePaymentDTO" TextAlignment="Alignment.Center" HeaderTextAlignment="Alignment.Center" HeaderText="شماره پایانه" PropertyName="trmn">
            @context.trmn
        </GridColumn>
        <GridColumn TItem="InvoicePaymentDTO" TextAlignment="Alignment.Center" HeaderTextAlignment="Alignment.Center" HeaderText="روش پرداخت" PropertyName="paymentMethod">
            @context.paymentMethod
        </GridColumn>
        <GridColumn TItem="InvoicePaymentDTO" TextAlignment="Alignment.Center" HeaderTextAlignment="Alignment.Center" HeaderText="شماره پیگیری/شماره مرجع" PropertyName="trn">
            @context.trn
        </GridColumn>
        <GridColumn TItem="InvoicePaymentDTO" TextAlignment="Alignment.Center" HeaderTextAlignment="Alignment.Center" HeaderText="شماره کارت" PropertyName="pcn">
            @context.pcn
        </GridColumn>
        <GridColumn TItem="InvoicePaymentDTO" TextAlignment="Alignment.Center" HeaderTextAlignment="Alignment.Center" HeaderText="شماره/شناسه ملی/کد فراگیر اتباع غیر ایرانی" PropertyName="pid">
            @context.pid
        </GridColumn>
        <GridColumn TItem="InvoicePaymentDTO" TextAlignment="Alignment.Center" HeaderTextAlignment="Alignment.Center" HeaderText="تاریخ" PropertyName="PaymentDateTime">
            @context.PaymentDateTime
        </GridColumn>
        <GridColumn TItem="InvoicePaymentDTO" TextAlignment="Alignment.Center" HeaderTextAlignment="Alignment.Center" HeaderText="مبلغ(ریال)" PropertyName="pv">
            @context.pv.Value.ToString("N0")
        </GridColumn>
    </GridColumns>
</Grid>
<div class="row g-3">
    <div class="form-group col-md-1">
        @if (add)
        {
            <label class="col-sm-6 col-form-label">جدید</label>
        }
        else
        {
            <label class="col-sm-6 col-form-label">اطلاعات پرداخت</label>
        }

    </div>
    <div class="form-group col-md-11">
        <hr class="hr" />
    </div>
</div>
<div class="row g-3">
    <div class="form-group col-md-4">
        <label class="col-sm-6 col-form-label">شماره سوییچ پرداخت</label>
        <InputText onkeypress="return event.charCode &gt;= 48 &amp;&amp; event.charCode &lt;= 57" style="text-align: center" maxlength="9" class="form-control" @bind-Value="item.iinn" Placeholder="شماره سوییچ پرداخت" />
    </div>
    <div class="form-group col-md-4">
        <label class="col-sm-6 col-form-label">شماره پذیرنده فروشگاهی</label>
        <InputText onkeypress="return event.charCode &gt;= 48 &amp;&amp; event.charCode &lt;= 57" style="text-align: center" maxlength="14" type="text" class="form-control" @bind-Value="item.acn" Placeholder="شماره پذیرنده فروشگاهی" />

    </div>
    <div class="form-group col-md-4">
        <label class="col-sm-6 col-form-label">شماره پایانه</label>
        <InputText onkeypress="return event.charCode &gt;= 48 &amp;&amp; event.charCode &lt;= 57" style="text-align: center" maxlength="8" type="text" class="form-control" @bind-Value="item.trmn" Placeholder="شماره پایانه" />
    </div>
</div>
<div class="row g-3">
    <div class="form-group col-md-4">
        <label class="col-sm-4 col-form-label" for="inputinvoicepmt">روش پرداخت</label>
        <select @bind="item.pmt" class="form-control" aria-label="Default select example" id="inputinvoicepmt">
            @if (!item.pmt.HasValue)
            {
                <option value="0" style="color: #b5b5b5" selected>انتخاب کنید...</option>
            }
            else
            {
                <option value="0" style="color: #b5b5b5">انتخاب کنید...</option>
            }


            @if (pmts != null)
            {
                foreach (var _item in pmts)
                {
                    if (item.pmt == Convert.ToInt32(_item.ID))
                    {
                        <option value="@_item.ID" selected>@_item.Title</option>
                    }
                    else
                    {
                        <option value="@_item.ID">@_item.Title</option>
                    }
                }
            }



        </select>
    </div>
    <div class="form-group col-md-4">
        <label class="col-sm-6 col-form-label">شماره پیگیری/شماره مرجع</label>
        <InputText onkeypress="return event.charCode &gt;= 48 &amp;&amp; event.charCode &lt;= 57" style="text-align: center" maxlength="14" type="text" class="form-control" @bind-Value="item.trn" Placeholder="شماره پیگیری/شماره مرجع" />

    </div>
    <div class="form-group col-md-4">
        <label class="col-sm-6 col-form-label">شماره کارت</label>
        <InputText onkeypress="return event.charCode &gt;= 48 &amp;&amp; event.charCode &lt;= 57" style="text-align: center" maxlength="16" type="text" class="form-control" @bind-Value="item.pcn" Placeholder="شماره کارت" />
    </div>
</div>
<div class="row g-3">
    <div class="form-group col-md-4">
        <label class="col-sm-10 col-form-label">شماره/شناسه ملی/کد فراگیر اتباع غیر ایرانی</label>
        <InputText onkeypress="return event.charCode &gt;= 48 &amp;&amp; event.charCode &lt;= 57" style="text-align: center" maxlength="12" type="text" class="form-control" @bind-Value="item.pid" Placeholder="شماره/شناسه ملی/کد فراگیر اتباع غیر ایرانی" />
    </div>
    <div class="form-group col-md-4">
        <label class="col-sm-6 col-form-label">تاریخ</label>
        <InputText type="text" style="text-align: center" class="form-control" @bind-Value="item.PaymentDateTime" Placeholder="تاریخ" />

    </div>
    <div class="form-group col-md-4">
        <label class="col-sm-6 col-form-label">مبلغ</label>
        <CurrencyInput TValue="long?" @bind-Value="item.pv" Locale="fa-Ir" Placeholder="مبلغ" style="text-align: center" />
    </div>
</div>
<br />
<div class="row g-3">
    <div class="form-group col-md-4">
        <Alert hidden="@Hidealert" Color="@alertColor" Dismissable="false">
            <Icon Name="@alertIconName" class="me-2"></Icon>
            @alertMessage
        </Alert>
    </div>
</div>


    @if (add)
    {
         <div class="row g-3">
        <div class="form-group col-md-6">
            <Button class="mt-3" Color="ButtonColor.Success" @onclick="AddPay" Type="ButtonType.Button">
                جدید
            </Button>
    </div>
    </div>
    }
    else
    {    <div class="row g-3">
            <div class="form-group col-md-6">
            <Button class="mt-3" Color="ButtonColor.Info" @onclick="UpdatePay" Type="ButtonType.Button">
                ویرایش
            </Button>
   
            <Button class="mt-3" Color="ButtonColor.Danger" @onclick="DeletePay" Type="ButtonType.Button">
                حذف
            </Button>
 
            <Button class="mt-3" Color="ButtonColor.Primary" @onclick="cancell" Type="ButtonType.Button">
                انصراف
            </Button>
    </div>
    </div>
    }
    


@code {
    private ConfirmDialog dialog = default!;
    bool add = true;
    [Parameter] public InvoiceDTO invoice { get; set; }
    Grid<InvoicePaymentDTO> grid = default!;
    InvoicePaymentDTO item;
    List<IdName<string>> pmts;
    // alert
    AlertColor alertColor = AlertColor.Primary;
    IconName alertIconName = IconName.CheckCircleFill;
    bool Hidealert = true;
    string alertMessage = "";

    protected override async Task OnParametersSetAsync()
    {
        item = new InvoicePaymentDTO();

        pmts = await fv.GetPaymentMethods();
        await base.OnParametersSetAsync();
    }
}
@functions {
    private async Task OnRowClick(GridRowEventArgs<InvoicePaymentDTO> args)
    {
        Hidealert = true;
        item = args.Item;
        add = false;
    }
    async Task cancell()
    {
        Hidealert = true;
        add = true;
        item = new InvoicePaymentDTO();
    }
    async Task AddPay()
    {
        Hidealert = true;
        if (await Validation())
        {
            var sentItem = new InvoiceItemAction<InvoicePaymentDTO>()
                {
                    invoiceID = invoice.ID,
                    item = item
                };
            var rsp = await hc.Post<InvoiceItemAction<InvoicePaymentDTO>>("InvoicePayment/AddPay", sentItem);
            if (rsp.IsSuccessStatusCode)
            {
                var request = await rsp.Content.ReadFromJsonAsync<InvoicePaymentDTO>();

                if (request != null && request.ID.HasValue)
                {
                    invoice.payments.Add(request);
                    await grid.RefreshDataAsync();
                    item = new InvoicePaymentDTO();
                    ShowSuccessAlert("پرداخت ثبت شد");
                }

                else ShowDangerAlert("خطایی در اجرای عملیات رخ داده");
            }
            else
            {

                var request = await rsp.Content.ReadFromJsonAsync<List<string>>();
                ShowDangerAlert(request[0]);
            }
        }



    }
    async Task UpdatePay()
    {
        Hidealert = true;
        if (await Validation())
        {
            var rsp = await hc.Put<InvoiceItemAction<InvoicePaymentDTO>>("InvoicePayment/UpdatePay", new InvoiceItemAction<InvoicePaymentDTO>()
                {
                    invoiceID = invoice.ID,
                    item = item
                });
            if (rsp.IsSuccessStatusCode)
            {
                var request = await rsp.Content.ReadFromJsonAsync<InvoicePaymentDTO>();

                if (request != null && request.ID.HasValue)
                {
                       invoice.payments.Remove(item);
                    invoice.payments.Add(request);
                    await grid.RefreshDataAsync();
                    item = new InvoicePaymentDTO();
                    add = true;
                    ShowSuccessAlert("تغییرات با موفقیت اعمال شد");
                }

                else ShowDangerAlert("خطایی در اجرای عملیات رخ داده");
            }
            else
            {

                var request = await rsp.Content.ReadFromJsonAsync<List<string>>();
                ShowDangerAlert(request[0]);
            }
        }
    }
    async Task DeletePay()
    {
        var confirmation = await dialog.ShowAsync(
                title: "عملیات حذف پرداخت",
                message1: $"از حذف پرداخت",
                message2: "اطمینان دارید?");

        if (confirmation)
        {
            Hidealert = true;
            if (item.ID.HasValue)
            {
                var rsp = await hc.Delete($"InvoicePayment/DeletePay/{item.ID.Value}");
                if (rsp.IsSuccessStatusCode)
                {
                    var request = await rsp.Content.ReadFromJsonAsync<bool>();

                    if (request)
                    {
                        invoice.payments.Remove(item);
                        await grid.RefreshDataAsync();
                        item = new InvoicePaymentDTO();
                        add = true;
                        ShowSuccessAlert("پرداخت خذف شد");
                    }

                    else ShowDangerAlert("خطایی در اجرای عملیات رخ داده");
                }
                else
                {

                    var request = await rsp.Content.ReadFromJsonAsync<List<string>>();
                    ShowDangerAlert(request[0]);
                }
            }
        }
       
    }
    private void ShowSuccessAlert(string msg)
    {
        Hidealert = false;
        alertColor = AlertColor.Success;
        alertIconName = IconName.CheckCircleFill;
        alertMessage = msg;
    }
    private void ShowDangerAlert(string msg)
    {
        Hidealert = false;
        alertColor = AlertColor.Danger;
        alertIconName = IconName.ExclamationTriangleFill;
        alertMessage = msg;
    }
    async Task<bool> Validation()
    {
        if (item.pv==null || item.pv <= 0)
        {
            ShowDangerAlert("مبلغ پرداختی باید بیشتر از صفر باشد."); 
            return false;
        }
        if (invoice.tbill < invoice.payments.Sum(s => s.pv) + item.pv)
        {
            ShowDangerAlert("مجموع مبلغ پرداختی نمی تواند از مجموع صورتحساب بیشتر باشد.");
            return false;
        }

        if (item.pmt.HasValue && item.pmt.Value > 0 && item.pmt.Value < 9)
        {
            if (string.IsNullOrEmpty(item.PaymentDateTime))
            {
                ShowDangerAlert("تاریخ نمیتواند خالی باشد");
                return false;
            }
            else
            {
                string paydate = item.PaymentDateTime.Replace("/", "");
                if (paydate.Length == 8 && int.TryParse(paydate, out int _paydate))
                {
                    var today = Convert.ToInt32(DateTime.Now.ConvertMiladiToShamsiinFront());
                    if (today >= _paydate)
                    {
                        if (Convert.ToInt32(invoice.InvoiceDate.Replace("/", "")) > _paydate)
                        {
                            ShowDangerAlert("تاریخ پرداخت نمیتواند از تاریخ صورتحساب عقبتر باشد");
                            return false;
                        }
                    }
                    else
                    {
                        ShowDangerAlert("تاریخ پرداخت نمی تواند از امروز جلوتر باشد"); return false;
                    }


                }
                else { ShowDangerAlert("تاریخ صحیح نمی باشد"); return false; }
            }

        }
        else { ShowDangerAlert("روش پرداخت مشخص نشده"); return false; }


        return true;
    }
}