<?php
use Workerman\Protocols\Http\Response;
use Workerman\Protocols\Http\Request;

function init()
{
    global $world, $fortune, $update;
    $pdo = new PDO(
        'mysql:host=tfb-database;dbname=hello_world',
        'benchmarkdbuser',
        'benchmarkdbpass',
        [
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES    => false
        ]
    );
    $world   = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?');
    $fortune = $pdo->prepare('SELECT id,message FROM Fortune');
    $update  = $pdo->prepare('UPDATE World SET randomNumber=? WHERE id=?');
}

function router(Request $request)
{
    switch ($request->path()) {
        case '/plaintext':
            return new Response(200, [
                'Content-Type' => 'text/plain',
                'Date'         => Header::$date
            ], 'Hello, World!');

        case '/json':
            return new Response(200, [
                'Content-Type' => 'application/json',
                'Date'         => Header::$date
            ], json_encode(['message' => 'Hello, World!']));

        case '/db':
            return db();

        case '/fortunes':
            // By default use 'Content-Type: text/html; charset=utf-8';
            return fortune();

        case '/query':
            return query($request);

        case '/update':
            return updateraw($request);

/*        case '/info':
            ob_start();
            phpinfo();
            return new Response(200, ['Content-Type' => 'text/plain'], ob_get_clean());
 */
        default:
            return new Response(404, [], 'Error 404');
    }
}

function db()
{
    global $world;

    $world->execute([mt_rand(1, 10000)]);

    return new Response(200, [
        'Content-Type' => 'application/json',
        'Date'         => Header::$date
    ], json_encode($world->fetch()));
}

function query($request)
{
    global $world;

    $query_count = 1;
    $q = (int) $request->get('q');
    if ($q > 1) {
        $query_count = min($q, 500);
    }

    while ($query_count--) {
        $world->execute([mt_rand(1, 10000)]);
        $arr[] = $world->fetch();
    }

    return new Response(200, [
        'Content-Type' => 'application/json',
        'Date'         => Header::$date
    ], json_encode($arr));
}

function updateraw($request)
{
    global $world, $update;

    $query_count = 1;
    $q = (int) $request->get('q');
    if ($q > 1) {
        $query_count = min($q, 500);
    }

    while ($query_count--) {
        $id = mt_rand(1, 10000);
        $world->execute([$id]);
        $item = $world->fetch();
        $update->execute(
            [$item['randomNumber'] = mt_rand(1, 10000), $id]
        );

        $arr[] = $item;
    }

    // $pdo->beginTransaction();
    // foreach($arr as $world) {
    //     $update->execute([$world['randomNumber'], $world['id']]);
    // }
    // $pdo->commit();
    return new Response(200, [
        'Content-Type' => 'application/json',
        'Date'         => Header::$date
    ], json_encode($arr));
}

function fortune()
{
    global $fortune;

    $fortune->execute();

    $arr    = $fortune->fetchAll(PDO::FETCH_KEY_PAIR);
    $arr[0] = 'Additional fortune added at request time.';
    asort($arr);

    $html = '';
    foreach ($arr as $id => $message) {
        $message = htmlspecialchars($message, ENT_QUOTES, 'UTF-8');
        $html .= "<tr><td>$id</td><td>$message</td></tr>";
    }

    return new Response(200, [
        'Date'         => Header::$date
    ], "<!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>$html</table></body></html>"
    );
}
