@using System.ComponentModel.DataAnnotations
@using ImageBoardServerApp.Auth
@using ImageBoardServerApp.Data.Repository

@inject NavigationManager navigationManager
@inject IWebHostEnvironment env
@inject AuthenticationStateProvider authStateProvider

<div>
    <span>[</span>
    <a class="toggleOpened" onclick="@ToggleOpened">@toggleText</a>
    <span>]</span>
</div>
@if (opened)
{
    <div class="pd centered">
        <span>Comment on @post.Title in /@post.Board/</span>
        
        <div class="centered formContent">
            <div>
                <div class="pd centered marg">
                    <RadzenTextBox Placeholder="Username (Anonymous)" MaxLength="15" @bind-Value="@postUsername" Class="w-100"/>
                </div>

                <div class="pd centered marg">
                    <RadzenTextArea Placeholder="Comment..." @bind-Value="@postContent" Cols="30" Rows="6"  Class="w-100"/>
                </div>
            </div>
        </div>
        @if (hasErr)
            {
                <span class="postError">@postErr</span>
            }
        <div class="pd centered marg">
            <FormInfo/>
            <InputFile OnChange="@SingleUpload" type="file" accept="image/*"/>
            <RadzenButton class="pd" Click="@onPostClick" Text="Post!"></RadzenButton>
        </div>
    </div>
}


@code {

    private bool opened = false;

    private string toggleText = "Open Comment Formula";

    private void ToggleOpened()
    {
        opened = !opened;
        toggleText = opened ? "Close Comment Formula" : "Open Comment Formula";
    }

    [Parameter]
    [Required]
    public PostData post { get; set; }

    string postUsername { get; set; } = "Anonymous";
    string postContent { get; set; } = "";

    private IBrowserFile selectedFile;
    
    private async Task SingleUpload(InputFileChangeEventArgs e)
    {
        selectedFile = e.GetMultipleFiles()[0];
        this.StateHasChanged();
    }
    
    string postErr { get; set; }
    bool hasErr { get; set; } = false;

    private async Task onPostClick()
    {
        var cauthStateProvder = (CustomAuthenticationStateProvider)authStateProvider;
        var user = await cauthStateProvder.GetAuthenticationStateAsync();
        var usr = user.User;
        UserData foundusr = await UsersRepository.getUserByEmailAsync(usr.Identity.Name);
        if (foundusr == null)
        {
            hasErr = true;
            postErr = "You are not logged in.";
            return;
        }
        int userID = foundusr.UserID;
        if (DateTimeOffset.Now.ToUnixTimeMilliseconds() - foundusr.TimeBanned < 0)
        {
            foundusr.TimeBanned = -1;
        }

        if (foundusr.TimeBanned != -1)
        {
            hasErr = true;
            postErr = "You are banned and may not comment.";
            //Maybe redirect to /banned?
            return;
        }
        foundusr.lastActionTimeStamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
        await UsersRepository.updateUserAsync(foundusr);

        PostData updatedPost = await PostsRepository.getPostByIdAsync(post.PostID);
        if (updatedPost.IsLocked)
        {
            hasErr = true;
            postErr = "This Post is locked.";
            return;
        }

        BoardData b = await BoardsRepository.getBoardByTagAsync(post.Board);
        if (b.isLocked)
        {
            hasErr = true;
            postErr = "This board is currently locked.";
            return;
        }

        bool hasImage = selectedFile != null;
        if (postUsername == null || postUsername == "")
        {
            postUsername = "Anonymous";
        }
        int thisGET = b.NumberOfGETs + 1;
        b.NumberOfGETs++;
        await BoardsRepository.updateBoardAsync(b);
        CommentData commentToCreate;
        if (hasImage)
        {
            Stream stream = selectedFile.OpenReadStream(maxAllowedSize: 512000 * 4); // max 2MB
            var file = Path.GetRandomFileName() + "." + selectedFile.Name.Split(".")[selectedFile.Name.Split(".").Length - 1];
            var path = $"{env.WebRootPath}/img/dynamic/comment/{@post.Board}/{@file}";
            FileStream fs = File.Create(path);
            await stream.CopyToAsync(fs);
            stream.Close();
            fs.Close();
            
            
            var imageToUpload = new ImageData
            {
                Board = post.Board,
                ImageLocation = $"/img/dynamic/comment/{@post.Board}/{@file}"
            };
            int imageID = await ImagesRepository.createImageAsync(imageToUpload);
            commentToCreate = new CommentData()
            {
                PostID = post.PostID,
                UserID = userID,
                ImageID = imageID,
                Content = postContent,
                Username = postUsername,
                Board = post.Board,
                CreatedAt = DateTimeOffset.Now.ToUnixTimeMilliseconds(),
                GET = thisGET
            };
        }
        else
        {
            commentToCreate = new CommentData()
            {
                PostID = post.PostID,
                UserID = userID,
                Content = postContent,
                Username = postUsername,
                Board = post.Board,
                CreatedAt = DateTimeOffset.Now.ToUnixTimeMilliseconds(),
                GET = thisGET
            };
        }

        int commentId = await CommentsRepository.createCommentAsync(commentToCreate);
        if (commentId == -1)
        {
        //Open comment unsucessfull
            navigationManager.NavigateTo("/sys/UnSuccessfulPost");
            hasErr = true;
            postErr = "There was an error and the comment could not be created. Please notify the admin.";
            Console.WriteLine("Shit sucks and did not work.");
            return;
        }
        //comment successfull
        Console.WriteLine("Post created");
        navigationManager.NavigateTo($"/{post.Board}/thread/{post.PostID}", true, true);
        opened = false;
    }
}