<?php

namespace xmvc\cmd;

use xmvc\DB;
use xmvc\MVC;
use PhpMyAdmin\SqlParser\Parser;
use PhpMyAdmin\SqlParser\Exceptions\ParserException;

/**
 * composer require phpmyadmin/sql-parser
 */
// @codingStandardsIgnoreStart
class metadata
// @codingStandardsIgnoreEnd
{
    public function __construct()
    {
        if (!isset(MVC::$cfg['database'])) {
            MVC::$cfg['database'] = loadConfig('database');
        }
    }

    public function execute(string $op): string
    {
        switch ($op) {
            case '':
                return $this->opIndex();
            case 'database':
                return $this->opDatabase(I('dbKey'), I('tables', []));
            default:
                error('无效的网址');
        }
    }

    public function opIndex(): string
    {
        $html = [];
        $html[] = "<h1>Database Key</h1>";
        $html[] = "<ul>";
        $dbKeys = array_keys(MVC::$cfg['database']);
        foreach ($dbKeys as $dbKey) {
            $url = url('self', ['op' => 'database', 'dbKey' => $dbKey]);
            $html[] = "<li><a href='{$url}'>{$dbKey}</a></li>";
        }
        $html[] = "</ul>";
        return implode("\n", $html);
    }

    public function opDatabase(string $dbKey, array $selectTables = []): string
    {
        $db = new DB($dbKey);
        $databaseName = $db->getDatabaseName();
        if ($selectTables) {
            foreach ($selectTables as $selectTableName) {
                $this->createMetadata($db, $selectTableName);
            }
            header('Location: ' . url('self'));
            exit();
        }
        $sql = "SHOW TABLES FROM `{$databaseName}`";
        $tables = $db->query($sql)->all();
        $url = url('self');
        $csrfToken = getCsrfToken();
        $html = [];
        $html[] = "<h1>{$dbKey} - {$databaseName}</h1>";
        $html[] = "<form action='{$url}' method='post'>";
        $html[] = "<input type='hidden' name='csrf-token' value='{$csrfToken}'>";
        $html[] = '<div style="padding-left:1em"><input type="submit" value="生成元数据"></div>';
        $html[] = "<ul class='ul-tables'>";
        foreach ($tables as $i => $item) {
            $tableName = array_shift($item);
            $checked = in_array($tableName, $selectTables) ? " checked='true'" : '';
            $html[] = "<li><input type='checkbox' value='{$tableName}' name='tables[]' id='ck{$i}'{$checked}><label for='ck{$i}'>{$tableName}</label></li>";
        }
        $html[] = "</ul>";
        $html[] = "</form>";
        return implode("\n", $html);
    }

    public function createMetadata(DB $db, string $tableName)
    {
        $ddl = $this->getDDL($db, $tableName);
        $table = $this->parseDDL($ddl);
        dd($ddl, $table);
    }

    public function getDDL(DB $db, string $tableName)
    {
        $sql = "SHOW CREATE TABLE `{$tableName}`";
        $row = $db->query($sql)->row();
        return $row['Create Table'];
    }

    public function parseDDL(string $ddl): array
    {
        try {
            $parser = new Parser($ddl);
            $statements = (array)$parser->statements;
            $result = (array)$statements[0];
            return $result ?? [];
        } catch (ParserException $e) {
            error($e->getMessage());
        }
    }
}

$metadata = new metadata();
$html = $metadata->execute(I('op', ''));
?>

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charSet="utf-8" />
    <title>元数据</title>
    <style>
        html,
        body {
            font-size: 14px;
        }

        input[type="checkbox"] {
            transform: scale(1.5);
            margin: 5px;
        }

        .ul-tables {
            font-size: 1.3rem;
        }

        .ul-tables li{
            margin: 5px 0;
            list-style-type: none;
        }
    </style>
</head>

<body>
    <?= $html ?>
</body>

</html>