@using System.ComponentModel.DataAnnotations
@using ImageBoardServerApp.Auth
@using ImageBoardServerApp.Data.Repository
@using ImageBoardServerApp.Util
@inject NavigationManager NavigationManager
@inject IWebHostEnvironment env
@inject AuthenticationStateProvider authStateProvider

<div class="toggler">
    <span>[</span>
    <button onclick="@ToggleOpened">@toggleText</button>
    <span>]</span>
</div>
@if (opened)
{
    <div class="pd centered">
        <span>Post to /@board.Tag/ - @board.Topic</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"> 
                    <RadzenTextBox Placeholder="Title" MaxLength="128" @bind-Value="@postTitle" Class="w-100"/>
                </div>
        
                <div class="pd centered marg"> 
                    <RadzenTextArea Placeholder="Content..." @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 Post Formula";

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

    [Parameter]
    [Required]
    public BoardData board { get; set; } = new BoardData();

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

    protected override async Task OnParametersSetAsync()
    {
        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;
        }
        postUsername = foundusr.LastUsedName;
        await base.OnParametersSetAsync();
    }


    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 post.";
            //Maybe redirect to /banned?
            return;
        }
        
        BoardData b = await BoardsRepository.getBoardByTagAsync(board.Tag);
        if (b.isLocked)
        {
            hasErr = true;
            postErr = "This board is currently locked.";
            return;
        }
        
        foundusr.lastActionTimeStamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
        if (postUsername == null || postUsername == "")
        {
            postUsername = "Anonymous";
        }
        foundusr.LastUsedName = postUsername;
        await UsersRepository.updateUserAsync(foundusr);
        
        
        //TODO Add check if data is image
        
        if (selectedFile == null || selectedFile.Size >= 512000 * 4)
        {
            hasErr = true;
            postErr = "You did not attach a file or the selected file is bigger then the 2MiB file limit.";
            return;
        }
        
        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/op/{@board.Tag}/{@file}";
        FileStream fs = File.Create(path);
        await stream.CopyToAsync(fs);
        stream.Close();
        fs.Close();
        
        var imageToUpload = new ImageData
        {
            Board = board.Tag,
            ImageLocation = $"/img/dynamic/op/{@board.Tag}/{@file}"
        };
        int imageID = await ImagesRepository.createImageAsync(imageToUpload);

        int thisGET = b.NumberOfGETs + 1;
        b.NumberOfGETs++;
        await BoardsRepository.updateBoardAsync(b);
        
        var postToPost = new PostData
        {
            UserID = userID,
            ImageID = imageID,
            Username = postUsername,
            Title = postTitle,
            Content = postContent,
            Interactions = 0,
            CreatedAt = DateTimeOffset.Now.ToUnixTimeMilliseconds(),
            Board = board.Tag,
            IsLocked = false,
            IsSticky = false,
            GET = thisGET
        };
        int postId = await PostsRepository.createPostAsync(postToPost);
        if (postId != -1)
        {
            //Open post successfull
            NavigationManager.NavigateTo($"/{board.Tag}/thread/{postId}", true, true);
            await TheManager.bumpThreads(board);
            Console.WriteLine("Post created");
        }
        else
        {
            //Open post unsucessfull
            hasErr = true;
            postErr = "There was an error and the post could not be created. Please notify the admin.";
            Console.WriteLine("Shit sucks and did not work.");
        }
    }
}