#!/usr/bin/env php
<?php
/**
 * Chupito Reserve — Provisioning Script
 * Creates a new restaurant instance after successful payment
 * 
 * Usage: php provision.php <customer_id>
 */

define('SAAS_DB_HOST', 'localhost');
define('SAAS_DB_NAME', 'chupito_saas');
define('SAAS_DB_USER', 'chupito_saas');
define('SAAS_DB_PASS', 'SaaS2026x!');

define('TEMPLATE_DIR', '/var/www/html/chupito-reserve');
define('SITES_DIR',    '/var/www/html');
define('APACHE_SITES', '/etc/apache2/sites-available');
define('SSL_CERT',     '/etc/letsencrypt/live/reserve.chupito.sk/fullchain.pem');
define('SSL_KEY',      '/etc/letsencrypt/live/reserve.chupito.sk/privkey.pem');
define('BASE_DOMAIN',  'reserve.chupito.sk');

function saasDb(): PDO {
    static $pdo;
    if (!$pdo) $pdo = new PDO(
        'mysql:host='.SAAS_DB_HOST.';dbname='.SAAS_DB_NAME.';charset=utf8mb4',
        SAAS_DB_USER, SAAS_DB_PASS,
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
    );
    return $pdo;
}

function rootDb(): PDO {
    static $pdo;
    if (!$pdo) $pdo = new PDO(
        'mysql:host=localhost;charset=utf8mb4',
        'root', '',
        [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
    );
    return $pdo;
}

function log_step(int $customerId, string $step, string $status, string $message = ''): void {
    saasDb()->prepare("INSERT INTO provisioning_log (customer_id, step, status, message) VALUES (?,?,?,?)")
        ->execute([$customerId, $step, $status, $message]);
    echo "[".date('H:i:s')."] [$status] $step" . ($message ? ": $message" : "") . "\n";
}

function provision(int $customerId): bool {
    $db = saasDb();
    $stmt = $db->prepare("SELECT * FROM customers WHERE id=?");
    $stmt->execute([$customerId]);
    $c = $stmt->fetch(PDO::FETCH_ASSOC);
    if (!$c) { echo "Customer $customerId not found\n"; return false; }

    echo "\n=== Provisioning: {$c['restaurant_name']} ({$c['subdomain']}) ===\n\n";

    // ── 1. Create MySQL DB + User ─────────────────────────────────────────
    try {
        $root = rootDb();
        $root->exec("CREATE DATABASE IF NOT EXISTS `{$c['db_name']}` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
        $root->exec("CREATE USER IF NOT EXISTS '{$c['db_user']}'@'localhost' IDENTIFIED BY '{$c['db_pass']}'");
        $root->exec("GRANT ALL PRIVILEGES ON `{$c['db_name']}`.* TO '{$c['db_user']}'@'localhost'");
        $root->exec("FLUSH PRIVILEGES");
        log_step($customerId, 'create_db', 'ok', "DB: {$c['db_name']}");
    } catch (Exception $e) {
        log_step($customerId, 'create_db', 'error', $e->getMessage());
        return false;
    }

    // ── 2. Create DB Schema ───────────────────────────────────────────────
    try {
        $newDb = new PDO(
            "mysql:host=localhost;dbname={$c['db_name']};charset=utf8mb4",
            $c['db_user'], $c['db_pass'],
            [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
        );
        $schema = file_get_contents('/var/www/html/chupito-saas/schema_reserve.sql');
        foreach (explode(';', $schema) as $sql) {
            $sql = trim($sql);
            if ($sql) $newDb->exec($sql);
        }

        // Insert restaurant record
        $settings = json_encode([
            'spaces'       => [],
            'hours_from'   => '11:00',
            'hours_to'     => '22:00',
            'hold_minutes' => 15,
            'custom_fields'=> [
                ['id'=>'special_setup','label'=>'Prestretý stôl','type'=>'toggle'],
                ['id'=>'decoration','label'=>'Farba dekorácie','type'=>'text','depends_on'=>'special_setup']
            ]
        ]);
        $newDb->prepare("INSERT INTO restaurants (name, slug, api_key, settings) VALUES (?,?,?,?)")
            ->execute([$c['restaurant_name'], $c['slug'], $c['api_key'], $settings]);

        log_step($customerId, 'create_schema', 'ok');
    } catch (Exception $e) {
        log_step($customerId, 'create_schema', 'error', $e->getMessage());
        return false;
    }

    // ── 3. Copy & Configure Files ─────────────────────────────────────────
    $targetDir = SITES_DIR . '/' . $c['slug'] . '-reserve';
    try {
        if (!is_dir($targetDir)) mkdir($targetDir, 0755, true);

        // Copy all files from template
        $files = ['index.html','admin.html','terminal.html','push.php','sw.js','manifest.json','icon-192.png','icon-512.png','generate_event_pdf.php'];
        foreach ($files as $file) {
            $src = TEMPLATE_DIR . '/' . $file;
            if (file_exists($src)) copy($src, $targetDir . '/' . $file);
        }

        // Copy vendor directory
        if (is_dir(TEMPLATE_DIR.'/vendor')) {
            exec("cp -r " . TEMPLATE_DIR . "/vendor " . $targetDir . "/");
        }

        log_step($customerId, 'copy_files', 'ok', $targetDir);
    } catch (Exception $e) {
        log_step($customerId, 'copy_files', 'error', $e->getMessage());
        return false;
    }

    // ── 4. Generate api.php ───────────────────────────────────────────────
    try {
        $apiTemplate = file_get_contents(TEMPLATE_DIR . '/api.php');

        // Replace all PH-specific values
        $apiNew = str_replace(
            ["define('DB_NAME', 'chupito_reserve');",
             "define('DB_USER', 'chupito_reserve');",
             "define('DB_PASS', 'Reserve2026x');",
             "'Plzeňská Hodovňa'",
             "\"Plzeňská Hodovňa\"",
             "'plzenska'",
             '"plzenska"',
             "rezervacie@plzenskahodovna.sk",
             "'PHRezervacie/2026'",
             "\"PHRezervacie/2026\"",
             "+421 948 656 456",
             "+421948656456",
             "'PlzHodovna'",
             "https://reserve.chupito.sk/push.php",
             "\$SMS_WHITELIST = ['+421911115611']; // TEST - vyprazdnit pre vsetkych",
            ],
            ["define('DB_NAME', '{$c['db_name']}');",
             "define('DB_USER', '{$c['db_user']}');",
             "define('DB_PASS', '{$c['db_pass']}');",
             "'{$c['restaurant_name']}'",
             "\"{$c['restaurant_name']}\"",
             "'{$c['slug']}'",
             "\"{$c['slug']}\"",
             "reservations@{$c['slug']}.chupito.sk",
             "'{$c['db_pass']}'",
             "\"{$c['db_pass']}\"",
             $c['phone'] ?? '+421 000 000 000',
             str_replace(' ', '', $c['phone'] ?? '+421000000000'),
             substr(preg_replace('/[^a-zA-Z]/', '', $c['restaurant_name']), 0, 11),
             "https://{$c['subdomain']}/push.php",
             "\$SMS_WHITELIST = []; // all",
            ],
            $apiTemplate
        );

        file_put_contents($targetDir . '/api.php', $apiNew);
        log_step($customerId, 'generate_api', 'ok');
    } catch (Exception $e) {
        log_step($customerId, 'generate_api', 'error', $e->getMessage());
        return false;
    }

    // ── 5. Configure terminal & admin with new credentials ────────────────
    try {
        // Terminal
        $terminal = file_get_contents($targetDir . '/terminal.html');
        $terminal = str_replace(
            ["const API = 'https://reserve.chupito.sk/api.php';",
             "const API = 'https://malackaplzenka.reserve.chupito.sk/api.php';",
             "'online@plzenskahodovna.sk': {pass:'Hodovna2026',slug:'plzenska',name:'Plzeňská Hodovňa'},",
             "'online@malackaplzenka.sk': {pass:'MPrezervacie/2026',slug:'malacka',name:'Malacká Plzeňka'},",
            ],
            ["const API = 'https://{$c['subdomain']}/api.php';",
             "const API = 'https://{$c['subdomain']}/api.php';",
             "'terminal@{$c['slug']}.chupito.sk': {pass:'{$c['admin_pass']}',slug:'{$c['slug']}',name:'{$c['restaurant_name']}'},",
             "'terminal@{$c['slug']}.chupito.sk': {pass:'{$c['admin_pass']}',slug:'{$c['slug']}',name:'{$c['restaurant_name']}'},",
            ],
            $terminal
        );
        // Update slug
        $terminal = str_replace(
            ["const SLUG = 'plzenska';", "const SLUG = 'malacka';"],
            ["const SLUG = '{$c['slug']}';"],
            $terminal
        );
        file_put_contents($targetDir . '/terminal.html', $terminal);

        // Admin
        $admin = file_get_contents($targetDir . '/admin.html');
        $admin = str_replace(
            ["const API = 'api.php';\nconst SLUG = 'plzenska';",
             "const API = 'api.php';\nconst SLUG = 'malacka';"],
            ["const API = 'api.php';\nconst SLUG = '{$c['slug']}';"],
            $admin
        );
        // Update admin logins
        $adminUsers = "const ADMIN_USERS = {\n  'tomas.jemala@creativelounge.sk': { pass: 'Chupito/2026', role: 'marketing', name: 'Creative Lounge' },\n  '{$c['admin_email']}': { pass: '{$c['admin_pass']}', role: 'owner', name: '{$c['restaurant_name']}' },\n};";
        $admin = preg_replace('/const ADMIN_USERS = \{.*?\};/s', $adminUsers, $admin);
        file_put_contents($targetDir . '/admin.html', $admin);

        // Manifest
        $manifest = json_decode(file_get_contents($targetDir . '/manifest.json'), true);
        $manifest['name']      = 'Chupito Reserve — ' . $c['restaurant_name'];
        $manifest['short_name']= 'Reserve';
        $manifest['start_url'] = '/terminal.html';
        file_put_contents($targetDir . '/manifest.json', json_encode($manifest, JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE));

        log_step($customerId, 'configure_files', 'ok');
    } catch (Exception $e) {
        log_step($customerId, 'configure_files', 'error', $e->getMessage());
        return false;
    }

    // ── 6. Apache Virtual Host ────────────────────────────────────────────
    try {
        $vhost = "<VirtualHost *:80>
    ServerName {$c['subdomain']}
    DocumentRoot $targetDir
    <Directory $targetDir>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:443>
    ServerName {$c['subdomain']}
    DocumentRoot $targetDir
    <Directory $targetDir>
        AllowOverride All
        Require all granted
    </Directory>
    SSLEngine on
    SSLCertificateFile " . SSL_CERT . "
    SSLCertificateKeyFile " . SSL_KEY . "
</VirtualHost>";

        $confFile = APACHE_SITES . "/{$c['slug']}-reserve.conf";
        file_put_contents($confFile, $vhost);
        exec("a2ensite {$c['slug']}-reserve.conf");
        exec("systemctl reload apache2");
        log_step($customerId, 'apache_vhost', 'ok', $c['subdomain']);
    } catch (Exception $e) {
        log_step($customerId, 'apache_vhost', 'error', $e->getMessage());
        return false;
    }

    // ── 7. Permissions ────────────────────────────────────────────────────
    exec("chown -R www-data:www-data $targetDir");
    exec("chmod -R 755 $targetDir");
    log_step($customerId, 'permissions', 'ok');

    // ── 8. Update customer status ─────────────────────────────────────────
    $expires = $c['plan'] === 'yearly'
        ? date('Y-m-d H:i:s', strtotime('+1 year'))
        : date('Y-m-d H:i:s', strtotime('+1 month'));

    $db->prepare("UPDATE customers SET status='active', activated_at=NOW(), expires_at=? WHERE id=?")
        ->execute([$expires, $customerId]);
    log_step($customerId, 'activate_customer', 'ok', "expires: $expires");

    // ── 9. Send welcome email ─────────────────────────────────────────────
    sendWelcomeEmail($c);
    log_step($customerId, 'welcome_email', 'ok', $c['admin_email']);

    echo "\n✅ Provisioning completed for {$c['restaurant_name']}\n";
    echo "   URL:      https://{$c['subdomain']}/\n";
    echo "   Admin:    https://{$c['subdomain']}/admin.html\n";
    echo "   Terminal: https://{$c['subdomain']}/terminal.html\n";
    echo "   Login:    {$c['admin_email']} / {$c['admin_pass']}\n\n";

    return true;
}

function sendWelcomeEmail(array $c): void {
    $host = 'smtp.m1.websupport.sk'; $port = 587;
    $user = 'info@chupito.sk'; $pass = 'INFOChupito/2026';
    $to   = $c['admin_email'];
    $name = $c['contact_name'];
    $rest = $c['restaurant_name'];
    $url  = "https://{$c['subdomain']}";
    $adminUrl = "$url/admin.html";
    $termUrl  = "$url/terminal.html";
    $adminPass = $c['admin_pass'];
    $adminEmail = $c['admin_email'];

    $subject = "Vitajte v Chupito Reserve — {$rest}";

    $html = "<!DOCTYPE html><html><body style='font-family:Arial,sans-serif;max-width:600px;margin:0 auto;color:#0a2e1f'>
    <div style='background:#0a2e1f;padding:28px;border-radius:8px 8px 0 0;text-align:center'>
      <div style='font-size:28px;font-weight:800;color:#d88f28'>Chupito Reserve</div>
      <div style='color:rgba(245,240,232,0.6);font-size:14px;margin-top:4px'>Váš rezervačný systém je pripravený</div>
    </div>
    <div style='background:#f5f0e8;padding:28px;border-radius:0 0 8px 8px'>
      <p style='font-size:16px;margin-bottom:20px'>Dobrý deň <strong>$name</strong>,<br>váš Chupito Reserve pre <strong>$rest</strong> je aktívny a pripravený na používanie.</p>

      <div style='background:#fff;border-radius:12px;padding:20px;margin-bottom:20px;border:1px solid rgba(10,46,31,0.1)'>
        <div style='font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:0.1em;color:#5a7a5a;margin-bottom:12px'>Prihlasovacie údaje</div>
        <table style='width:100%;border-collapse:collapse'>
          <tr><td style='padding:6px 0;color:#5a7a5a;font-size:13px'>Email</td><td style='padding:6px 0;font-weight:600'>$adminEmail</td></tr>
          <tr><td style='padding:6px 0;color:#5a7a5a;font-size:13px'>Heslo</td><td style='padding:6px 0;font-weight:600'>$adminPass</td></tr>
        </table>
      </div>

      <div style='background:#fff;border-radius:12px;padding:20px;margin-bottom:20px;border:1px solid rgba(10,46,31,0.1)'>
        <div style='font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:0.1em;color:#5a7a5a;margin-bottom:12px'>Vaše linky</div>
        <p style='margin:6px 0;font-size:13px'>📋 <strong>Formulár pre hostí:</strong> <a href='$url' style='color:#d88f28'>$url</a></p>
        <p style='margin:6px 0;font-size:13px'>⚙️ <strong>Administrácia:</strong> <a href='$adminUrl' style='color:#d88f28'>$adminUrl</a></p>
        <p style='margin:6px 0;font-size:13px'>📱 <strong>Prijímací terminál:</strong> <a href='$termUrl' style='color:#d88f28'>$termUrl</a></p>
      </div>

      <div style='text-align:center;margin-top:24px'>
        <a href='$adminUrl' style='background:#d88f28;color:#fff;padding:14px 32px;border-radius:100px;text-decoration:none;font-weight:700;font-size:15px'>Otvoriť administráciu →</a>
      </div>

      <p style='margin-top:24px;color:#5a7a5a;font-size:13px'>V prípade otázok nás kontaktujte na <a href='mailto:info@chupito.sk' style='color:#d88f28'>info@chupito.sk</a>.</p>
    </div>
    <p style='text-align:center;color:#999;font-size:11px;margin-top:16px'>© 2026 Chupito · Creative Lounge · <a href='https://chupito.sk' style='color:#d88f28;text-decoration:none'>chupito.sk</a></p>
    </body></html>";

    try {
        $ctx = stream_context_create(['ssl'=>['verify_peer'=>false,'verify_peer_name'=>false,'allow_self_signed'=>true]]);
        $socket = stream_socket_client("$host:$port", $errno, $errstr, 15, STREAM_CLIENT_CONNECT, $ctx);
        if (!$socket) return;
        $send = function($cmd) use ($socket) {
            fwrite($socket, $cmd."\r\n");
            $r=''; while($l=fgets($socket,512)){$r.=$l;if(strlen($l)>=4&&$l[3]===' ')break;} return $r;
        };
        fgets($socket,512);
        $send("EHLO chupito.sk"); $send("STARTTLS");
        stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT);
        $send("EHLO chupito.sk"); $send("AUTH LOGIN");
        $send(base64_encode($user)); $send(base64_encode($pass));
        $send("MAIL FROM:<$user>"); $send("RCPT TO:<$to>"); $send("DATA");
        $boundary = md5(uniqid());
        $msg  = "From: Chupito Reserve <$user>\r\nTo: $to\r\n";
        $msg .= "Subject: =?UTF-8?B?".base64_encode($subject)."?=\r\n";
        $msg .= "MIME-Version: 1.0\r\nContent-Type: multipart/alternative; boundary=\"$boundary\"\r\n\r\n";
        $msg .= "--$boundary\r\nContent-Type: text/html; charset=UTF-8\r\nContent-Transfer-Encoding: base64\r\n\r\n";
        $msg .= chunk_split(base64_encode($html))."\r\n--$boundary--\r\n.";
        $send($msg); $send("QUIT"); fclose($socket);
    } catch (Exception $e) {
        echo "Email error: ".$e->getMessage()."\n";
    }
}

// CLI entry point
if (php_sapi_name() === 'cli') {
    if (empty($argv[1])) { echo "Usage: php provision.php <customer_id>\n"; exit(1); }
    provision((int)$argv[1]);
}
