@page "/admin/list"
@inject ILogger<AdminList> Logger
@* @attribute [Authorize] *@


<PageTitle>管理员账号管理</PageTitle>

<Title Level="4">管理员帐号</Title>
<Card Class="">
    <Form @ref="searchForm" Model="search" Layout="FormLayout.Inline" Class="search-form" OnFinish="OnSearchFinish">
        <Row Justify="RowJustify.Start" Gutter="16">
            <Col>
            <FormItem Label="帐号">
                <Input @bind-Value="search.Username" Placeholder="帐号" AllowClear />
            </FormItem>
            </Col>

            <Col>
            <div class="ant-form-item" style="width:200px;display:flex;">
                <Button Type="ButtonType.Primary" HtmlType="submit">查询</Button>
                <Button Style="margin: 0 8px;" OnClick="OnSearchReset">重置</Button>
            </div>
            </Col>
        </Row>
    </Form>
</Card>
<br />
<Card Class="mt-3">
    <Table DataSource="PagingList.Items" PageSize="100" HidePagination="true" Resizable>
        <TitleTemplate>
            <Flex Justify="FlexJustify.SpaceBetween">
                帐号列表
                <div>
                    <AuthorizeView Policy="@Permissions.Admin.Edit">
                        <Authorized>
                            <Button Class="me-3" OnClick="OnCreateClick" Type="ButtonType.Primary">新增</Button>
                        </Authorized>
                        <NotAuthorized>
                            没有权限
                        </NotAuthorized>
                    </AuthorizeView>
                </div>
            </Flex>
        </TitleTemplate>
        <ColumnDefinitions>
            <PropertyColumn Property="c => c.Username" Title="帐号">
            </PropertyColumn>
            <PropertyColumn Property="c => c.Email" Title="邮件" Width="80px" Align="ColumnAlign.Center">

            </PropertyColumn>
            <PropertyColumn Property="c => c.Mobile" Title="手机号" Width="100px" />
            <PropertyColumn Property="c => c.Status" Title="状态" Width="80px" Align="ColumnAlign.Center">
                @if (context.Status == 1)
                {
                    <AntDesign.Text Type="TextElementType.Success"><Icon Type="check" Theme=" IconThemeType.Outline" Width="1.3em" Height="1.3em" /></AntDesign.Text>

                }
                else
                {
                    <Icon Type="close" Theme="IconThemeType.Outline" Width="1.3em" Height="1.3em" />
                }
            </PropertyColumn>
            <PropertyColumn Property="c => c.LastLogin" Title="最后登录" Width="190px" />
            <PropertyColumn Property="c => c.UpdateTime" Title="最后更新" Width="190px" />
            <ActionColumn Title="操作" Align="ColumnAlign.Right" Width="160px">
                <Space>
                    <SpaceItem>
                        <Dropdown Trigger="@(new Trigger[] { Trigger.Click })">
                            <Overlay>
                                <Menu>

                                    <MenuItem>
                                        <a @onclick="(e) => OnEditClick(context)"> <Icon Type="@IconType.Outline.Edit" /> 编辑</a>
                                    </MenuItem>
                                    <MenuDivider />
                                    <MenuItem>
                                        <Popconfirm Placement="@Placement.Left" Title="@("删除这条数据无法恢复，您确定要删除吗?")"
                                                    OnConfirm="@(e=>HandleDeleteConfirmAsync(e,context.Id))"
                                                    OkText="确定"
                                                    CancelText="取消">
                                            <a> <Icon Type="@IconType.Outline.Delete" /> 删除</a>
                                        </Popconfirm>
                                    </MenuItem>
                                </Menu>
                            </Overlay>
                            <ChildContent>
                                <a class="ant-dropdown-link" @onclick:preventDefault>
                                    <Icon Type="@IconType.Outline.Menu" />
                                </a>
                            </ChildContent>
                        </Dropdown>
                    </SpaceItem>
                </Space>
            </ActionColumn>
        </ColumnDefinitions>
    </Table>
</Card>

<Drawer Closable="true" Width="520" Visible="drawerVisible" Title='(model.Id == 0 ? "新增帐号" : "编辑帐号")' OnClose="_ => CloseDrawer()">
    <Form LabelColSpan="5" @ref="@editform" Model="@model" OnFinish="OnFormFinish">
        <FluentValidationValidator />
        <FormItem Label="帐号名称">
            <Input @bind-Value="model.Username" For="(()=>model.Username)" Placeholder="帐号名称" />
        </FormItem>
        <FormItem Label="电子邮件">
            <Input @bind-Value="model.Email" For="(()=>model.Email)" Placeholder="电子邮件" />
        </FormItem>
        <FormItem Label="手机号码">
            <Input @bind-Value="model.Mobile" For="(()=>model.Mobile)" Placeholder="手机号码" />
        </FormItem>
        @if (context.Id > 0)
        {
            <FormItem Label="密码设置">
                <Checkbox @bind-Value="@context.SetPassword" Disabled=false>
                    重置密码
                </Checkbox>
            </FormItem>
        }
        @if (context.Id == 0)
        {
            <FormItem Label="登录密码">
                <Input @bind-Value="@context.Password" Placeholder="登录密码" />
            </FormItem>
        }
        @if ((context.Id > 0 && context.SetPassword) || context.Id == 0)
        {

            <FormItem Label="新密码">
                <Input @bind-Value="@context.NewPassword" Placeholder="新登录密码" />
            </FormItem>
        }
        @if ((context.Id > 0 && context.SetPassword) || context.Id == 0)
        {

            <FormItem Label="确认密码">
                <Input @bind-Value="@context.RePassword" Placeholder="确认密码" />
            </FormItem>
        }
        <FormItem Label="可用状态">
            <RadioGroup @bind-Value="@context.Status">
                <Radio RadioButton Value=0>禁用</Radio>
                <Radio RadioButton Value=1>启用</Radio>
            </RadioGroup>
        </FormItem>
        <FormItem WrapperColOffset="4">
            <Button Type="ButtonType.Primary" HtmlType="submit" Style="width: 100%;">保存</Button>
        </FormItem>
    </Form>
</Drawer>

@code {
    [SupplyParameterFromQuery]
    int? Page { get; set; }

    [SupplyParameterFromQuery(Name = "size")]
    int? PageSize { get; set; }

    [SupplyParameterFromForm]
    AdminSearch search { get; set; } = new();
    Form<AdminSearch> searchForm = null!;

    [SupplyParameterFromForm]
    AdminModel model { get; set; } = new();
    Form<AdminModel> editform = null!;

    PagingList<Admin> PagingList = new();
    bool loading { get; set; } = true;
    bool searchExpand { get; set; } = false;

    bool drawerVisible;

    protected override void OnInitialized()
    {
        base.OnInitialized();
    }

    protected override void OnParametersSet()
    {

        loadQueryString();
        LoadList();

        base.OnParametersSet();
    }

    void loadQueryString()
    {
        var uri = new Uri(Navigation.Uri);
        var query = uri.Query;
        search.Username = query.GetQueryString("Username");
        search.Mobile = query.GetQueryString("Mobile");
        search.Email = query.GetQueryString("Email");
        search.RealName = query.GetQueryString("RealName");
        search.Status = query.GetQueryString("Status");

        var data = query.GetQueryString("RangeTime");
        if (!string.IsNullOrEmpty(data))
        {
            var rangetime = data.Split("-");
            if (rangetime != null && rangetime.Length > 0)
            {
                searchExpand = true;
                search.RangeTime[0] = rangetime[0].NumberToDateTime();
                search.RangeTime[1] = rangetime[1].NumberToDateTime();
                StateHasChanged();
            }
        }

    }


    private async void LoadList()
    {

        loading = true;
        var url = "/api/admin/search";
        var apiResult = await HttpService.GetPagingList<Admin>(url, search, Page.GetValueOrDefault(1), PageSize.GetValueOrDefault(20));
        if (apiResult.Success)
        {
            if (apiResult.Data != null)
            {
                PagingList = apiResult.Data;
            }
        }
        loading = false;
        StateHasChanged();
    }


    private void OnReset()
    {
        search = new();
        LoadList();
    }

    void OnSearchReset()
    {
        search = new();
        searchForm?.Reset();
        OnSearchFinish();
    }


    void OnSearchFinish()
    {
        Page = Page.GetValueOrDefault(1) - 1;

        OnSearch(Page.Value);
    }

    private void OnSearch(int page)
    {
        var queryString = search.BuildQueryString();
        if (string.IsNullOrEmpty(queryString))
        {
            if (page > 1)
            {
                Navigation.NavigateTo($"/admin/list?page={page}");
            }
            else
            {
                Navigation.NavigateTo($"/admin/list");
            }
        }
        else
        {
            if (page > 1)
            {
                Navigation.NavigateTo($"/admin/list?page={page}&{queryString}");
            }
            else
            {
                Navigation.NavigateTo($"/admin/list?{queryString}");
            }
        }
    }

    void OnCreateClick()
    {
        model = new();
        drawerVisible = true;
    }

    void OnEditClick(Admin admin)
    {
        this.model = admin.Adapt<AdminModel>();
        this.model.Password = string.Empty;
        drawerVisible = true;
    }

    async Task HandleDeleteConfirmAsync(MouseEventArgs e, long id)
    {
        var url = $"/api/admin/delete/{id}";
        var apiResult = await HttpService.Post<ApiResult<string>>(url, new());
        if (apiResult.Success)
        {
            LoadList();
            await ModalService.InfoAsync(new ConfirmOptions() { Title = "操作提示", Content = "删除数据成功" });
        }
        else
        {
            await ModalService.ErrorAsync(new ConfirmOptions() { Title = "操作提示", Content = $"数据删除失败.{apiResult.Message}" });
        }
    }

    async Task OnFormFinish()
    {
        if (editform.Validate())
        {

            var result = new ApiResult<string>();
            if (model.Id > 0)
            {
                var url = $"api/admin/edit";
                result = await HttpService.Post<ApiResult<string>>(url, model);
            }
            else
            {
                var url = $"api/admin/add";
                result = await HttpService.Post<ApiResult<string>>(url, model);
            }

            if (result.Code == (int)ResultCode.Success)
            {

                CloseDrawer();
                LoadList();
                await ModalService.InfoAsync(new ConfirmOptions() { Title = "提示", Content = "数据提交成功!" });
            }
            else
            {
                await ModalService.ErrorAsync(new ConfirmOptions() { Title = "服务异常", Content = result.Message });
            }
        }
    }

    private void OnPageChanged(int args)
    {
        OnSearch(args);
    }

    void CloseDrawer()
    {
        drawerVisible = false;
        editform.Reset();
    }
}