<?PHP

/* 


   The purpose of this script is to take a file from cc_files table, and insert it into
   the schedule table. DB columns at the time of writing are
 
 starts | ends | file_id | clip_length | fade_in | fade_out | cue_in | cue_out | media_item_played | instance_id
 
 an example of data in this row is:
 "9" | "2012-02-29 17:10:00" | "2012-02-29 17:15:05.037166" | 1 | "00:05:05.037166" | "00:00:00" | "00:00:00" | "00:00:00" | "00:05:05.037166" | FALSE | 5

*/

function query($conn, $query){
    $result = pg_query($conn, $query);
    if (!$result) {
        echo "Error executing query $query.\n";
        exit(1);
    }
    
    return $result;
}

function getFileFromCcFiles($conn){
    $query = "SELECT * from cc_files LIMIT 2";
    
    $result = query($conn, $query);
    
    $files = array();
    while ($row = pg_fetch_array($result)) {
        $files[] = $row;
    }
    
    if (count($files) == 0){
        echo "Library is empty. Could not choose random file.";
        exit(1);
    }
    
    return $files;
}

function insertIntoCcShow($conn){
    /* Step 1:
     * Create a show
     *  */

    $query = "INSERT INTO cc_show (name, url, genre, description, color, background_color) VALUES ('test', '', '', '', '', '')";
    echo $query.PHP_EOL;
    $result = query($conn, $query);

    $query = "SELECT currval('cc_show_id_seq');";
    $result = pg_query($conn, $query);
    if (!$result) {
      echo "Error executing query $query.\n";
      exit(1);
    }

    while ($row = pg_fetch_array($result)) {
      $show_id = $row["currval"];
    }
    
    return $show_id;
}

function insertIntoCcShowInstances($conn, $show_id, $starts, $ends, $files){
    /* Step 2:
     * Create a show instance.
     * Column values:
     * starts | ends | show_id | record | rebroadcast | instance_id | file_id | time_filled | last_scheduled | modified_instance
     *  */
     
    $nowDateTime = new DateTime("now", new DateTimeZone("UTC"));

    $now = $nowDateTime->format("Y-m-d H:i:s");

    $columns = "(starts, ends, show_id, record, rebroadcast, instance_id, file_id, time_filled, last_scheduled, modified_instance)";
    $values = "('$starts', '$ends', $show_id, 0, 0, NULL, NULL, TIMESTAMP '$ends' - TIMESTAMP '$starts', '$now', 'f')";
    $query = "INSERT INTO cc_show_instances $columns values $values ";
    echo $query.PHP_EOL;
     
    $result = query($conn, $query);

    $query = "SELECT currval('cc_show_instances_id_seq');";
    $result = pg_query($conn, $query);
    if (!$result) {
      echo "Error executing query $query.\n";
      exit(1);
    }

    while ($row = pg_fetch_array($result)) {
      $show_instance_id = $row["currval"];
    }
    
    return $show_instance_id;
}

/*
 * id | starts | ends | file_id | clip_length| fade_in | fade_out | cue_in | cue_out | media_item_played | instance_id
 * 1 | 2012-02-29 23:25:00 | 2012-02-29 23:30:05.037166 | 1 | 00:05:05.037166 | 00:00:00 | 00:00:00 | 00:00:00 | 00:05:05.037166 | f | 5
 */
function insertIntoCcSchedule($conn, $files, $show_instance_id, $p_starts, $p_ends){
    $columns = "(starts, ends, file_id, clip_length, fade_in, fade_out, cue_in, cue_out, media_item_played, instance_id)";
    
    $starts = $p_starts;
    
    foreach($files as $file){

        $endsDateTime = new DateTime($starts, new DateTimeZone("UTC"));
        $lengthDateInterval = getDateInterval($file["length"]);
        $endsDateTime->add($lengthDateInterval);
        $ends = $endsDateTime->format("Y-m-d H:i:s");

        $values = "('$starts', '$ends', $file[id], '$file[length]', '00:00:00', '00:00:00', '00:00:00', '$file[length]', 'f', $show_instance_id)";
        $query = "INSERT INTO cc_schedule $columns VALUES $values";
        echo $query.PHP_EOL;
        
        $starts = $ends;
        $result = query($conn, $query);        
    }
}

function getDateInterval($interval){
    list($length,) = explode(".", $interval);
    list($hour, $min, $sec) = explode(":", $length);
    return new DateInterval("PT{$hour}H{$min}M{$sec}S");
}

function getEndTime($startDateTime, $p_files){
    foreach ($p_files as $file){
        $startDateTime->add(getDateInterval($file['length']));
    }
    
    return $startDateTime;
}

function rabbitMqNotify(){
    $ini_file = parse_ini_file("/etc/airtime/airtime.conf", true);
    $url = "http://localhost/api/rabbitmq-do-push/format/json/api_key/".$ini_file["general"]["api_key"];

    echo "Contacting $url".PHP_EOL;
    $ch = curl_init($url);
    curl_exec($ch);
    curl_close($ch);    
}

$conn = pg_connect("host=localhost port=5432 dbname=airtime user=airtime password=airtime");
if (!$conn) {
    echo "Couldn't connect to Airtime DB.\n";
    exit(1);
}

if (count($argv) > 1){
    if ($argv[1] == "--clean"){    
        $tables = array("cc_schedule", "cc_show_instances", "cc_show");
        
        foreach($tables as $table){
            $query = "DELETE FROM $table";
            echo $query.PHP_EOL;
            query($conn, $query);
        }
        rabbitMqNotify();
        exit(0);
    } else { 
        $str = <<<EOD
This script schedules a file to play 30 seconds in the future. It 
modifies the database tables cc_schedule, cc_show_instances and cc_show.
You can clean up these tables using the --clean option.
EOD;
        echo $str.PHP_EOL;
        exit(0);
    }
}

$startDateTime = new DateTime("now + 30sec", new DateTimeZone("UTC"));
//$endDateTime = new DateTime("now + 1min 30sec", new DateTimeZone("UTC"));
$starts = $startDateTime->format("Y-m-d H:i:s");
//$ends = $endDateTime->format("Y-m-d H:i:s");

$files = getFileFromCcFiles($conn); 
$show_id = insertIntoCcShow($conn);

$endDateTime = getEndTime(clone $startDateTime, $files);
$ends = $endDateTime->format("Y-m-d H:i:s");

$show_instance_id = insertIntoCcShowInstances($conn, $show_id, $starts, $ends, $files);
insertIntoCcSchedule($conn, $files, $show_instance_id, $starts, $ends);

rabbitMqNotify();

echo PHP_EOL."Show scheduled for $starts (UTC)".PHP_EOL;