<?php

// https://stackoverflow.com/a/600306/9123061
function is_valid_note($check_note)
{
    if(!intval($check_note))
    {
        return false;
    }
    return ($check_note & ($check_note - 1)) == 0;
}

function is_valid_time($check_time)
{
    if(!is_string($check_time))
    {
        return false;
    }
    $check_time = remove_whitespace($check_time);
    $check_time_explode = explode("/", $check_time, 2);
    $check_time_explode[0] = intval($check_time_explode[0]);
    $check_time_explode[1] = intval($check_time_explode[1]);
    if(count($check_time_explode) != 2 || $check_time_explode[0] < 1 || $check_time_explode[1] < 1)
    {
        return false;
    }
    if(!is_valid_note($check_time_explode[1]))
    {
        return false;
    }
    $ratio = $check_time_explode[0] / $check_time_explode[1];
    $new_rhythm_length = intval(16 * $ratio); // 64 is a generic value. insert any valid note (8 and up should be good)
    if(!is_int($new_rhythm_length) || $new_rhythm_length == 0)
    {
        return false;
    }
    return true;
}

function is_valid_tempo($check_tempo)
{
    if(!is_string($check_tempo))
    {
        return false;
    }
    $check_tempo = remove_whitespace($check_tempo);
    $check_tempo_explode = explode("=", $check_tempo, 2);
    $check_tempo_explode[0] = intval($check_tempo_explode[0]);
    $check_tempo_explode[1] = intval($check_tempo_explode[1]);
    if(count($check_tempo_explode) != 2 || $check_tempo_explode[0] < 1 || $check_tempo_explode[1] < 1)
    {
        return false;
    }
    if(!is_valid_note($check_tempo_explode[0]))
    {
        return false;
    }
    return true;
}

function is_valid_bars($check_bars)
{
    if(!intval($check_bars))
    {
        return false;
    }
    $check_bars = intval($check_bars);
    if($check_bars < 1 || $check_bars > 64)
    {
        return false;
    }
    return true;
}

function is_valid_dynamic($check_dynamic)
{
    if(!is_string($check_dynamic))
    {
        return false;
    }
    $allowed_dynamics_regex = "/^(p{1,5}|f{1,5}|m(p|f)|s(p{1,2}|f{1,2})|fp|(s|r)fz)$/";
    if(!preg_match($allowed_dynamics_regex, $check_dynamic))
    {
        return false;
    }
    return true;
}

function validate_get_parameter()
{
    if(!(isset($_GET["time"]) && is_valid_time($_GET["time"])))
    {
        $_GET["time"] = "4/4";
    }
    $_GET["time"] = remove_whitespace($_GET["time"]);

    if(!(isset($_GET["tempo"]) && is_valid_tempo($_GET["tempo"])))
    {
        $_GET["tempo"] = "4=90";
    }
    $_GET["tempo"] = remove_whitespace($_GET["tempo"]);

    if(!(isset($_GET["bars"]) && is_valid_bars($_GET["bars"])))
    {
        $_GET["bars"] = "2";
    }

    if(!(isset($_GET["shortest_note"]) && is_valid_note($_GET["shortest_note"])))
    {
        $_GET["shortest_note"] = "8";
    }

    if(!(isset($_GET["dynamic_beat"]) && is_valid_dynamic($_GET["dynamic_beat"])))
    {
        $_GET["dynamic_beat"] = "pp";
    }
    if(!(isset($_GET["dynamic_rhythm"]) && is_valid_dynamic($_GET["dynamic_rhythm"])))
    {
        $_GET["dynamic_rhythm"] = "ff";
    }

    if(!(isset($_GET["id"]) && is_string($_GET["id"]) && strlen($_GET["id"]) > 1))
    {
        $_GET["id"] = md5(random_bytes(60));
    }
}

?>