ComputerScreen.razor
@using Sandbox;
@using Sandbox.UI;
@inherits PanelComponent
@namespace CryptidHunt

<root>
    <div class="blackScreen" style="opacity: @(Computer.Started ? 0 : 0.9)"></div>
    @if (Computer.Started)
    {
        <div class="monkeybar">FPS: @FrameRate</div>
    }
    else
    {
        <div class="textContainer">
            <div class="text">
WELCOME TO THE NEXTBOT
PERSONALISED!
WHAT OR WHO DO YOU FEAR THE MOST?...
            </div>
            <div class="smallText" style="flex-direction: column">
                <label>(PRESS MOUSE1 TO FOCUS)</label>
                <label>(PRESS ENTER TO SEND)</label>
            </div>
        </div>
        <TextEntry @ref=Input
                   onsubmit=@Submit
                   onblur=@Close
                   Placeholder="For example, @(Random.Shared.FromArray(ExampleFears))"
                   MaxLength=@(20) />
        <div class="monkeyBar">MADE BY MONKEY BAR</div>
    }
</root>

@code
{
    public static readonly string[] ExampleFears = [
        "colonoscopy",
        "clowns",
        "grass",
        "aliens",
        "clowns",
        "heights",
        "bears",
        "drink and drive",
        "martians",
        "wendigo",
        "night",
        "vampires",
        "wolves",
        "dark basement",
        "broccoli",
        "ghosts",
        "skeletons",
        "ghouls",
        "cemetery",
        "dark castle",
        "peanuts"
    ];

    [Property]
    public CameraComponent TargetCamera { get; set; }
    [Property]
    public Computer Computer { get; set; }
    public TextEntry Input { get; set; }
    public string ExampleFear { get; set; }
    public int FrameRate = 15;

    TimeUntil _fpsReroll = 1;

    private static Texture _renderTarget;
    private RealTimeUntil _nextRender;

    protected override void OnStart()
    {
        base.OnStart();

        _renderTarget = Texture.CreateRenderTarget()
            .WithSize(new Vector2(512f, 512f * 0.6f))
            .WithScreenFormat()
            .Create();

        Open();
    }


    protected override void OnUpdate()
    {
        base.OnUpdate();

        if (!TargetCamera.IsValid() || !_nextRender)
            return;

        if (_fpsReroll)
        {
            FrameRate = Random.Shared.Int(10, 15);
            _fpsReroll = Random.Shared.Float(0.5f, 2f);
        }
        var frameRate = Computer.Playing ? FrameRate : 5;

        TargetCamera.RenderToTexture(_renderTarget);
        _nextRender = 1f / frameRate;

        Panel.Style.BackgroundImage = _renderTarget;

        if (Computer.Playing && !Computer.Started)
            Input?.Focus();
    }

    private void Submit()
    {
        var message = Input.Text.Trim();
        Input.Text = string.Empty;

        Close();

        if (string.IsNullOrWhiteSpace(message))
            return;

        Computer.Started = true;
        Computer.StopGameSequence();
        SetFear(message);
    }

    async void SetFear(string fear)
    {
        Computer.Fear = await Flickr.Get(fear);
    }

    public void Open()
    {
        Input?.Focus();
    }

    public void Close()
    {
        Input?.Blur();
        Input.Text = string.Empty;
    }

    protected override int BuildHash() => System.HashCode.Combine(Computer.Started, Computer.Started ? FrameRate : 0);
}