@page "/sys/report/{type}/{board}/{id}"
@using System.ComponentModel.DataAnnotations
@using System.Data
@using ImageBoardServerApp.Auth
@using ImageBoardServerApp.Data.Repository
@inject AuthenticationStateProvider authStateProvider
@inject IJSRuntime js
<AuthorizeView>
    <Authorized>
        <h3>Report @type#@id on /@board/</h3>
        <div>
            <select name="rule" id="rule" @bind="@selectedItem">
                <option value="none">Select</option>
                @foreach (var r in RulesConv.dict.Keys)
                {
                    <option value="@r">@RulesConv.dict[r]</option>
                }
            </select>
        </div>
        <span>@selectedItem</span>
        <br/>
        <span>Explain further (optional)</span>
        <div class="pd centered marg">
            <RadzenTextArea Placeholder="Specify..." @bind-Value="@explaination" Cols="30" Rows="6"  Class="w-100"/>
        </div>
        <RadzenButton class="pd" Click="@onReportClick" Text="Report"></RadzenButton>
    </Authorized>
    <NotAuthorized>
        <span>Please login to report</span>
    </NotAuthorized>
</AuthorizeView>

@code {
    private IEnumerable<Rule> rules;
    private string selectedItem;
    private string explaination;


    [Parameter]
    [Required]
    public string type { get; set; }
    
    [Parameter]
    [Required]
    public string board { get; set; }
    
    [Parameter]
    [Required]
    public string id { get; set; }


    private async Task onReportClick()
    {
        if (selectedItem == null || selectedItem == "none")
            return;
        var cauthStateProvder = (CustomAuthenticationStateProvider)authStateProvider;
        var user = await cauthStateProvder.GetAuthenticationStateAsync();
        var usr = user.User;
        UserData foundusr = await UsersRepository.getUserByEmailAsync(usr.Identity.Name);
        if (foundusr == null)
        {
            return;
        }
        
        if (foundusr.TimeBanned != -1)
        {
            return;
        }
        foundusr.lastActionTimeStamp = DateTimeOffset.UnixEpoch.ToUnixTimeMilliseconds();
        await UsersRepository.updateUserAsync(foundusr);
        int targetID = 0;
        if (type == "op")
        {
            var post = await PostsRepository.getPostByIdAsync(Int32.Parse(id));
            targetID = post.User.UserID;
        }
        else
        {
            var comment = await CommentsRepository.getCommentByIdAsync(Int32.Parse(id));
            targetID = comment.User.UserID;
        }

        ReportData reportData = new ReportData()
        {
            Type = type,
            ReportedCommentID = type == "op" ? null : Int32.Parse(id),
            ReportedPostID = type == "op" ? Int32.Parse(id) : null,
            UserReporterID = foundusr.UserID,
            UserReportedID = targetID,
            ReportReason = RulesConv.dict[RulesConv.dict2[selectedItem]],
            ReportExlaination = explaination
        };

        List<ReportData> submittedReports = foundusr.RecivedReports;
        foreach(var r in submittedReports)
        {
            if (r.ReportedPostID == reportData.ReportedPostID && r.ReportedCommentID == reportData.ReportedCommentID)
                return;
        }

        var reportID = await ReportsRepository.createReportAsync(reportData);
        js.InvokeVoidAsync("window.close");
    }
}