@page "/tools/scpsl/servernamecreator"
@using MudBlazor.Utilities
@using Color = System.Drawing.Color

<PageTitle>Server Name Creator | Jesus QC</PageTitle>

<h3>Faded Server Name Creator</h3>

<div style="background-color: @FirstColor; padding: 11px; border-radius: 10px">
    First Color
    <MudColorPicker @bind-Value="FirstColor" />
</div>
<br/>
<div style="background-color: @SecondColor; padding: 11px; border-radius: 10px">
    Second Color
    <MudColorPicker  @bind-Value="SecondColor" />
</div>
<br/>
<br/>
<MudTextField @bind-Value="Input" Label="Input" Variant="Variant.Outlined"></MudTextField>
<br/>
<br/>
<div style="text-align: center">
    <MudButton Variant="Variant.Filled" Color="MudBlazor.Color.Info" OnClick="Create">Create!</MudButton>
</div>
<br/>
<MudTextField @bind-Value="Output" Label="Output" Variant="Variant.Outlined" Disabled="true"></MudTextField>
<br/>
<div style="text-align: center; font-size: 20px; background-color: #181414; padding: 11px; border-radius: 10px">
    Preview:
    <br/>
    @((MarkupString)Html!)
</div>

@code {
    public MudColor FirstColor { get; set; } = "#594AE2";
    public MudColor OldColor { get; set; } = "#999";
    public MudColor SecondColor { get; set; } = "#FF4081";
    public MudColor OldSecondColor { get; set; } = "#999";
    
    public string Input { get; set; } = "Here goes your server name.";
    public string OldInput { get; set; } = "";
    public string Output { get; set; } = "Waiting.";
    public string? Html { get; set; }

    public void Create()
    {
        if(Input == OldInput && FirstColor == OldColor && SecondColor == OldSecondColor)
            return;
        
        Html = CreateGradient(Input, FirstColor, SecondColor, out var output);
        Output = output;
        OldInput = Input;
        OldColor = FirstColor;
        OldSecondColor = SecondColor;
    }
    
    string CreateGradient(string txt, MudColor color, MudColor finalColor, out string output)
    {
        int rMax = finalColor.R;
        int rMin = color.R;
        int gMax = finalColor.G;
        int gMin = color.G;
        int bMax = finalColor.B;
        int bMin = color.B;

        var size = txt.Length;
        var colorList = new List<Color>();
            
        for(int i = 0; i < size; i++)
        {
            var rAverage = rMin + (rMax - rMin) * i / size;
            var gAverage = gMin + (gMax - gMin) * i / size;
            var bAverage = bMin + (bMax - bMin) * i / size;
            colorList.Add(Color.FromArgb(rAverage, gAverage, bAverage));
        }

        var finalString = "";
        var finalHtml = "";
        
        for (int i = 0; i < size; i++)
        {
            if (txt[i] != ' ')
            {
                var colorr = HexConverter(colorList[i]);
                finalString += $"<color={colorr}>{txt[i]}</color>";
                finalHtml += $"<span style=\"color: {colorr}\">{txt[i]}</span>";
            }
            else
            {
                finalString += " ";
                finalHtml += "<span> </span>";
            }
        }

        output = finalString;
        return finalHtml;
    }
    
    string HexConverter(Color c)
    {
        var rtn = String.Empty;
        
        try
        {
            rtn = "#" + c.R.ToString("X2") + c.G.ToString("X2") + c.B.ToString("X2");
        }
        catch (Exception)
        {
            //doing nothing
        }

        return rtn;
    }
}