<?php
// CLI: Semear 5 produtos completos diretamente no banco (por tenant)
// Uso: php scripts/seed_products.php [tenant_id]

require __DIR__ . '/../bootstrap.php';

use Gestoreasy\Core\Tenant\TenantAdmin;
use Gestoreasy\Core\Tenant\ConnectionManager;
use Gestoreasy\Core\Audit\AuditLogger;

// Ler tenant do argv, padrão 'default'
$tenant = isset($argv[1]) && is_string($argv[1]) && trim($argv[1]) !== '' ? trim($argv[1]) : 'default';

echo "[seed] Tenant: {$tenant}\n";
// Aplicar migrações antes do seed
try {
    TenantAdmin::runMigrations($tenant);
    echo "[seed] Migrações aplicadas (ou já estavam ok).\n";
} catch (Throwable $e) {
    echo "[seed] Aviso ao aplicar migrações: {$e->getMessage()}\n";
}

// Obter conexão do tenant
$pdo = ConnectionManager::forTenant($tenant);

// Verificar existência de product_meta
$hasMeta = false;
try {
    $chk = $pdo->prepare("SELECT COUNT(*) AS c FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'product_meta'");
    $chk->execute();
    $hasMeta = ((int)($chk->fetch()['c'] ?? 0)) > 0;
} catch (Throwable $eChk) { $hasMeta = false; }

// Garantir tabela product_media (tolerante)
try {
    $chkPm = $pdo->prepare("SELECT COUNT(*) AS c FROM information_schema.tables WHERE table_schema = DATABASE() AND table_name = 'product_media'");
    $chkPm->execute();
    $hasMediaTable = ((int)($chkPm->fetch()['c'] ?? 0)) > 0;
    if (!$hasMediaTable) {
        $pdo->exec(
            "CREATE TABLE IF NOT EXISTS product_media (
                id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                product_id BIGINT UNSIGNED NOT NULL,
                position INT DEFAULT 0,
                type VARCHAR(20) NOT NULL,
                url TEXT NULL,
                filename VARCHAR(255) NULL,
                mime VARCHAR(100) NULL,
                size BIGINT UNSIGNED NULL,
                created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
                updated_at TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
                FOREIGN KEY (product_id) REFERENCES products(id)
            )"
        );
        echo "[seed] Tabela product_media criada.\n";
    }
} catch (Throwable $e) {
    echo "[seed] Aviso ao garantir product_media: {$e->getMessage()}\n";
}

$samples = [
    [
        'codigo' => 'SKU-EX-001', 'ean' => '7891234567890', 'ncm' => '12345678', 'cest' => '1234567', 'cfop' => '5102', 'preco' => 49.90,
        'meta' => [
            'nome' => 'Camiseta Dry Fit', 'marca' => 'FitWear', 'categoria' => 'Roupas', 'descricao' => 'Camiseta esportiva dry fit, respirável.',
            'cor' => 'Preta', 'tamanho' => 'M', 'unidade' => 'UN',
            'peso_liquido' => '0.180', 'peso_bruto' => '0.200', 'largura_cm' => '28', 'altura_cm' => '2', 'comprimento_cm' => '35',
            'fabricante' => 'FitWear Indústria', 'origem' => '0',
            'pis_cst' => '01', 'pis_aliquota' => '1.65', 'cofins_cst' => '01', 'cofins_aliquota' => '7.60',
            'icms_origem' => '0', 'icms_cst' => '00', 'icms_aliquota' => '18', 'csosn' => '102',
            'ean_pack' => '17891234567897', 'estoque_atual' => 50, 'estoque_minimo' => 5
        ]
    ],
    [
        'codigo' => 'SKU-EX-002', 'ean' => '7891234567891', 'ncm' => '19059010', 'cest' => '2800100', 'cfop' => '5102', 'preco' => 9.99,
        'meta' => [
            'nome' => 'Barra de Cereal', 'marca' => 'NutriBar', 'categoria' => 'Alimentos', 'descricao' => 'Barra integral com castanhas e mel.',
            'sabor' => 'Castanhas e Mel', 'unidade' => 'UN', 'peso_liquido' => '0.030', 'peso_bruto' => '0.035',
            'largura_cm' => '4', 'altura_cm' => '2', 'comprimento_cm' => '12', 'fabricante' => 'NutriBar Alimentos', 'origem' => '0',
            'pis_cst' => '01', 'pis_aliquota' => '1.65', 'cofins_cst' => '01', 'cofins_aliquota' => '7.60',
            'icms_origem' => '0', 'icms_cst' => '00', 'icms_aliquota' => '12', 'csosn' => '102',
            'ean_pack' => '17891234567898', 'estoque_atual' => 200, 'estoque_minimo' => 20
        ]
    ],
    [
        'codigo' => 'SKU-EX-003', 'ean' => '7891234567892', 'ncm' => '33049910', 'cest' => '1301800', 'cfop' => '5405', 'preco' => 29.50,
        'meta' => [
            'nome' => 'Creme Hidratante', 'marca' => 'DermaPlus', 'categoria' => 'Cosméticos', 'descricao' => 'Hidratante facial para pele seca.',
            'unidade' => 'UN', 'volume_ml' => '200', 'peso_liquido' => '0.220', 'peso_bruto' => '0.250',
            'largura_cm' => '7', 'altura_cm' => '15', 'comprimento_cm' => '4', 'fabricante' => 'DermaPlus Laboratórios', 'origem' => '0',
            'pis_cst' => '01', 'pis_aliquota' => '1.65', 'cofins_cst' => '01', 'cofins_aliquota' => '7.60',
            'icms_origem' => '0', 'icms_cst' => '00', 'icms_aliquota' => '18', 'csosn' => '102',
            'ean_pack' => '17891234567899', 'estoque_atual' => 120, 'estoque_minimo' => 10
        ]
    ],
    [
        'codigo' => 'SKU-EX-004', 'ean' => '7891234567893', 'ncm' => '85044010', 'cest' => '2101200', 'cfop' => '5102', 'preco' => 79.00,
        'meta' => [
            'nome' => 'Carregador USB-C 65W', 'marca' => 'VoltX', 'categoria' => 'Eletrônicos', 'descricao' => 'Carregador rápido com suporte a PD.',
            'cor' => 'Preto', 'unidade' => 'UN', 'peso_liquido' => '0.180', 'peso_bruto' => '0.220',
            'largura_cm' => '7', 'altura_cm' => '4', 'comprimento_cm' => '7', 'fabricante' => 'VoltX Eletrônicos', 'origem' => '0',
            'pis_cst' => '01', 'pis_aliquota' => '1.65', 'cofins_cst' => '01', 'cofins_aliquota' => '7.60',
            'icms_origem' => '0', 'icms_cst' => '00', 'icms_aliquota' => '18', 'csosn' => '102',
            'ean_pack' => '17891234567900', 'estoque_atual' => 45, 'estoque_minimo' => 5
        ]
    ],
    [
        'codigo' => 'SKU-EX-005', 'ean' => '7891234567894', 'ncm' => '42029200', 'cest' => '2000200', 'cfop' => '5102', 'preco' => 119.90,
        'meta' => [
            'nome' => 'Mochila Antifurto', 'marca' => 'UrbanPack', 'categoria' => 'Acessórios', 'descricao' => 'Mochila com zíper oculto e USB externo.',
            'cor' => 'Cinza', 'unidade' => 'UN', 'peso_liquido' => '0.900', 'peso_bruto' => '1.100', 'largura_cm' => '30', 'altura_cm' => '45', 'comprimento_cm' => '18',
            'fabricante' => 'UrbanPack Indústria', 'origem' => '0',
            'pis_cst' => '01', 'pis_aliquota' => '1.65', 'cofins_cst' => '01', 'cofins_aliquota' => '7.60',
            'icms_origem' => '0', 'icms_cst' => '00', 'icms_aliquota' => '12', 'csosn' => '102',
            'ean_pack' => '17891234567901', 'estoque_atual' => 80, 'estoque_minimo' => 8
        ]
    ],
];

$created = [];

try {
    foreach ($samples as $s) {
        $wasNew = false;
        // Não duplicar por código
        $exists = $pdo->prepare('SELECT id FROM products WHERE codigo = ? LIMIT 1');
        $exists->execute([$s['codigo']]);
        $row = $exists->fetch();
        if ($row && isset($row['id'])) {
            $pid = (int)$row['id'];
            echo "[seed] Atualizando existente: {$s['codigo']} (id {$pid})\n";
            // Atualizar colunas base para garantir preenchimento
            $upd = $pdo->prepare('UPDATE products SET ean = ?, ncm = ?, cest = ?, cfop = ?, preco = ? WHERE id = ?');
            $upd->execute([$s['ean'], $s['ncm'], $s['cest'], $s['cfop'], $s['preco'], $pid]);
            // Upsert metadados
            if ($hasMeta) {
                $metaJson = json_encode($s['meta'], JSON_UNESCAPED_UNICODE);
                try {
                    $sql = 'INSERT INTO product_meta (product_id, meta_json) VALUES (?, CAST(? AS JSON))
                            ON DUPLICATE KEY UPDATE meta_json = CAST(VALUES(meta_json) AS JSON), updated_at = NOW()';
                    $stm = $pdo->prepare($sql);
                    $stm->execute([$pid, $metaJson]);
                } catch (Throwable $e) {
                    $sql2 = 'INSERT INTO product_meta (product_id, meta_json) VALUES (?, ?)
                            ON DUPLICATE KEY UPDATE meta_json = VALUES(meta_json), updated_at = NOW()';
                    $stm2 = $pdo->prepare($sql2);
                    $stm2->execute([$pid, $metaJson]);
                }
                AuditLogger::logUpdate('product_meta', $pid, [], $s['meta'], ['endpoint' => 'seed.meta.update']);
            }
            // Continuar para mídias
        } else {
            // Criar produto novo
            $ins = $pdo->prepare('INSERT INTO products (codigo, ean, ncm, cest, cfop, preco) VALUES (?,?,?,?,?,?)');
            $ins->execute([$s['codigo'], $s['ean'], $s['ncm'], $s['cest'], $s['cfop'], $s['preco']]);
            $pid = (int)$pdo->lastInsertId();
            AuditLogger::logCreate('products', $pid, $s);
            $wasNew = true;
            // Metadados
            if ($hasMeta) {
                $metaJson = json_encode($s['meta'], JSON_UNESCAPED_UNICODE);
                try {
                    $sql = 'INSERT INTO product_meta (product_id, meta_json) VALUES (?, CAST(? AS JSON))
                            ON DUPLICATE KEY UPDATE meta_json = CAST(VALUES(meta_json) AS JSON), updated_at = NOW()';
                    $stm = $pdo->prepare($sql);
                    $stm->execute([$pid, $metaJson]);
                } catch (Throwable $e) {
                    $sql2 = 'INSERT INTO product_meta (product_id, meta_json) VALUES (?, ?)
                            ON DUPLICATE KEY UPDATE meta_json = VALUES(meta_json), updated_at = NOW()';
                    $stm2 = $pdo->prepare($sql2);
                    $stm2->execute([$pid, $metaJson]);
                }
                AuditLogger::logUpdate('product_meta', $pid, [], $s['meta'], ['endpoint' => 'seed.meta']);
            }
        }

        // Mídias (copiar imagens de assets como exemplo)
        $uploadDir = __DIR__ . '/../public/uploads/products/' . $pid;
        if (!is_dir($uploadDir)) { @mkdir($uploadDir, 0775, true); }
        $assetsDir = __DIR__ . '/../public/assets/';
        $img1Src = $assetsDir . 'logo-light.png';
        $img2Src = $assetsDir . 'logo-dark.png';
        $img1Dest = $uploadDir . '/example1.png';
        $img2Dest = $uploadDir . '/example2.png';
        if (@copy($img1Src, $img1Dest)) {
            $size1 = @filesize($img1Dest) ?: 0;
            $pm1 = $pdo->prepare('INSERT INTO product_media (product_id, type, filename, mime, size, position) VALUES (?,?,?,?,?,?)');
            $pm1->execute([$pid, 'image', 'products/' . $pid . '/example1.png', 'image/png', $size1, 0]);
        }
        if (@copy($img2Src, $img2Dest)) {
            $size2 = @filesize($img2Dest) ?: 0;
            $pm2 = $pdo->prepare('INSERT INTO product_media (product_id, type, filename, mime, size, position) VALUES (?,?,?,?,?,?)');
            $pm2->execute([$pid, 'image', 'products/' . $pid . '/example2.png', 'image/png', $size2, 1]);
        }
        // Vídeo de exemplo (URL YouTube)
        try {
            $pmv = $pdo->prepare('INSERT INTO product_media (product_id, type, url, position) VALUES (?,?,?,?)');
            $pmv->execute([$pid, 'video', 'https://www.youtube.com/watch?v=dQw4w9WgXcQ', 2]);
        } catch (Throwable $e) { /* opcional: coluna url pode não existir */ }

        $created[] = $pid;
        if ($wasNew) {
            echo "[seed] Criado produto ID {$pid} ({$s['codigo']})\n";
        } else {
            echo "[seed] Atualizado produto ID {$pid} ({$s['codigo']})\n";
        }
    }
    echo "[seed] Concluído. IDs criados/confirmados: " . implode(',', $created) . "\n";
} catch (Throwable $e) {
    echo "[seed] ERRO: {$e->getMessage()}\n";
    exit(1);
}