<?php
declare(strict_types=1);

/**
 * Демо-сидер: наполняет CMS тестовыми данными для разработки и приёмки темы.
 *
 *   php bin/seed-demo.php          — добавить (идемпотентно по slug)
 *   php bin/seed-demo.php --reset  — сначала удалить существующие демо-записи (по slug-маркеру)
 *
 * Создаёт:
 *   - 7 категорий новостей (Lifestyle, Healthy, Restaurant, Travel Tips, Marketing, Technology, Video)
 *   - 4 категории магазина  (Электроника, Одежда, Книги, Спорт)
 *   - 10 новостей          (с обложками picsum, в разных категориях, одна с видео)
 *   - 15 товаров           (с обложками picsum, ценой и старой ценой, разные категории)
 *
 * Картинки — внешние ссылки `picsum.photos/seed/.../800/500` (детерминированы по seed).
 * Они не лежат в /public/uploads/, поэтому фильтр {cover|medium} вернёт оригинал.
 */

if (PHP_SAPI !== 'cli') {
    fwrite(STDERR, "This script must be run from CLI.\n");
    exit(1);
}

$root = dirname(__DIR__);
chdir($root);

$reset = in_array('--reset', $argv, true);

require $root . '/core/bootstrap.php';

use Celena\Core\Database\Connection;
use Celena\Core\Kernel;

/** @var Connection $conn */
$conn = Kernel::container()->make(Connection::class);

function pic(string $seed, int $w = 800, int $h = 500): string
{
    return 'https://picsum.photos/seed/' . rawurlencode($seed) . '/' . $w . '/' . $h;
}

$now = date('Y-m-d H:i:s');
$marker = 'demo-';   // префикс slug — позволяет легко находить и удалять демо

/* ═════════ Сброс (--reset) ═════════ */

if ($reset) {
    // Удаляем по marker-префиксу + явно категорию 'video' (она без префикса по дизайну —
    // её ищет [news category="video"] на главной).
    $delN = $conn->run('DELETE FROM ' . $conn->table_q('celena_news') . ' WHERE slug LIKE ?', [$marker . '%'])->rowCount();
    $delP = $conn->run('DELETE FROM ' . $conn->table_q('shop_products') . ' WHERE slug LIKE ?', [$marker . '%'])->rowCount();
    $delC = $conn->run('DELETE FROM ' . $conn->table_q('celena_categories') . ' WHERE slug LIKE ? OR slug = ?', [$marker . '%', 'video'])->rowCount();
    echo "[reset] removed $delN news, $delP products, $delC categories\n";
}

/* ═════════ Категории новостей ═════════ */

$newsCats = [
    ['title' => 'Lifestyle',   'slug' => 'demo-lifestyle',   'description' => 'Образ жизни, привычки, повседневность'],
    ['title' => 'Healthy',     'slug' => 'demo-healthy',     'description' => 'Здоровье и правильное питание'],
    ['title' => 'Restaurant',  'slug' => 'demo-restaurant',  'description' => 'Рестораны и обзоры заведений'],
    ['title' => 'Travel Tips', 'slug' => 'demo-travel',      'description' => 'Советы путешественникам'],
    ['title' => 'Marketing',   'slug' => 'demo-marketing',   'description' => 'Маркетинг и реклама'],
    ['title' => 'Technology',  'slug' => 'demo-tech',        'description' => 'Новинки технологий'],
    // Slug 'video' (без demo-) — потому что главная использует [news category="video"].
    // При --reset эта запись будет удалена так же по marker-фильтру (см. ниже спец. обработку).
    ['title' => 'Video',       'slug' => 'video',            'description' => 'Видеоконтент и подкасты'],
];

$newsCatId = [];
foreach ($newsCats as $i => $c) {
    $existing = $conn->builder('celena_categories')->where('slug', '=', $c['slug'])->first();
    if ($existing !== null) {
        $newsCatId[$c['slug']] = (int) $existing['id'];
        continue;
    }
    $id = $conn->builder('celena_categories')->insert([
        'slug'        => $c['slug'],
        'title'       => $c['title'],
        'description' => $c['description'],
        'parent_id'   => null,
        'sort_order'  => $i,
        'entity_type' => 'news',
        'created_at'  => $now,
        'updated_at'  => $now,
    ]);
    $newsCatId[$c['slug']] = (int) $id;
}
echo "[news-categories] " . count($newsCatId) . " ensured\n";

/* ═════════ Категории магазина ═════════ */

$shopCats = [
    ['title' => 'Электроника', 'slug' => 'demo-electronics', 'description' => 'Гаджеты и техника'],
    ['title' => 'Одежда',      'slug' => 'demo-clothing',    'description' => 'Мужская и женская одежда'],
    ['title' => 'Книги',       'slug' => 'demo-books',       'description' => 'Художественная и нон-фикшн литература'],
    ['title' => 'Спорт',       'slug' => 'demo-sport',       'description' => 'Товары для спорта и активного отдыха'],
];

$shopCatId = [];
foreach ($shopCats as $i => $c) {
    $existing = $conn->builder('celena_categories')->where('slug', '=', $c['slug'])->first();
    if ($existing !== null) {
        $shopCatId[$c['slug']] = (int) $existing['id'];
        continue;
    }
    $id = $conn->builder('celena_categories')->insert([
        'slug'        => $c['slug'],
        'title'       => $c['title'],
        'description' => $c['description'],
        'parent_id'   => null,
        'sort_order'  => $i,
        'entity_type' => 'shop_product',
        'created_at'  => $now,
        'updated_at'  => $now,
    ]);
    $shopCatId[$c['slug']] = (int) $id;
}
echo "[shop-categories] " . count($shopCatId) . " ensured\n";

/* ═════════ Автор: первый существующий пользователь ═════════ */

$author = $conn->builder('celena_users')->orderBy('id', 'asc')->first();
$authorId = $author ? (int) $author['id'] : null;

/* ═════════ Новости ═════════ */

$newsItems = [
    [
        'title' => 'Make your store stand out from the others by converting',
        'category' => 'demo-marketing',
        'short' => 'Подробный разбор как выделиться среди конкурентов и удерживать внимание клиентов.',
    ],
    [
        'title' => 'Customize your WooCommerce store with countless Web',
        'category' => 'demo-tech',
        'short' => 'Гибкая настройка магазина под индивидуальные сценарии использования.',
    ],
    [
        'title' => 'WooCommerce comes with an intuitive drag-and-drop interface',
        'category' => 'demo-tech',
        'short' => 'Современный конструктор, который не требует написания кода.',
    ],
    [
        'title' => 'Create beautiful designs that will help convert more visitors',
        'category' => 'demo-lifestyle',
        'short' => 'Дизайн, который реально работает на конверсию: советы и примеры.',
    ],
    [
        'title' => 'All of these special features come at an affordable price',
        'category' => 'demo-marketing',
        'short' => 'Подборка инструментов с лучшим соотношением цены и пользы.',
    ],
    [
        'title' => 'Healthy breakfast: 7 simple recipes for busy mornings',
        'category' => 'demo-healthy',
        'short' => 'Полезные завтраки, на которые уходит не больше 10 минут.',
    ],
    [
        'title' => 'Top 10 restaurants you must try this season',
        'category' => 'demo-restaurant',
        'short' => 'Места, в которые стоит заглянуть гурманам и любителям атмосферы.',
    ],
    [
        'title' => 'Ultimate travel guide: 12 destinations worth visiting',
        'category' => 'demo-travel',
        'short' => 'От гор до тропических пляжей — направления, которые останутся в памяти.',
    ],
    [
        'title' => 'How modern UX shapes the way we shop online',
        'category' => 'demo-tech',
        'short' => 'Тенденции UX и как они влияют на поведение покупателей в e-commerce.',
    ],
    [
        'title' => 'Behind the scenes: video tour of our new studio',
        'category' => 'video',
        'short' => 'Закадровое видео о том, как устроена работа нашей команды.',
        'video_url' => 'https://www.youtube.com/watch?v=dQw4w9WgXcQ',
    ],
    [
        'title' => 'Customize i WooCommerce theme with countless Video',
        'category' => 'video',
        'short' => 'Полный обзор настройки темы под видео-контент.',
        'video_url' => 'https://www.youtube.com/watch?v=5qap5aO4i9A',
    ],
    [
        'title' => 'Create beautiful designs that help convert more',
        'category' => 'video',
        'short' => 'Видеоурок о дизайне, который реально работает на продажи.',
        'video_url' => 'https://www.youtube.com/watch?v=jfKfPfyJRdk',
    ],
    [
        'title' => 'WooCommerce drag-and-drop interface walkthrough',
        'category' => 'video',
        'short' => 'Как использовать drag-and-drop редактор для быстрой сборки.',
        'video_url' => 'https://www.youtube.com/watch?v=DWcJFNfaw9c',
    ],
];

$bodyTemplate = <<<'MD'
Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots
in a piece of classical literature from 459, making it over 2000 years old.
Richard McClintock, a Latin professor at Virginia, looked up one of the more
obscure Latin words, consectetur, from a Lorem Ipsum passage.

> Contrary to popular belief not simply random has roots in a piece of
> classical Latin literature making it over 2000 years old.

## Why this matters

Going through the cites of the word in classical literature, discovered the
undoubtable source. Lorem Ipsum comes from written in 45 BC. This book is a
treatise on the theory.

- Crisp typography
- Sensible spacing
- Predictable navigation
MD;

$insertedNews = 0;
foreach ($newsItems as $i => $n) {
    $slug = 'demo-news-' . ($i + 1);
    if ($conn->builder('celena_news')->where('slug', '=', $slug)->first() !== null) {
        continue;
    }
    $publishedAt = date('Y-m-d H:i:s', strtotime("-" . ($i + 1) . " days"));
    $id = $conn->builder('celena_news')->insert([
        'slug'             => $slug,
        'title'            => $n['title'],
        'short'            => $n['short'],
        'body'             => $bodyTemplate,
        'body_format'      => 'markdown',
        'status'           => 'published',
        'category_id'      => $newsCatId[$n['category']] ?? null,
        'author_id'        => $authorId,
        'cover'            => pic($slug, 1200, 700),
        'seo_title'        => $n['title'],
        'seo_description'  => $n['short'],
        'og_image'         => pic($slug, 1200, 630),
        'views'            => random_int(40, 2400),
        'comments_count'   => 0,
        'published_at'     => $publishedAt,
        'created_at'       => $publishedAt,
        'updated_at'       => $publishedAt,
    ]);
    $insertedNews++;

    // Если у новости есть video_url — кладём в кастомные поля (поле video_url для сущности news).
    // Тема Bunzo использует {fields.video_url} для проигрывания видео в секции Featured Video.
    if (!empty($n['video_url'])) {
        // Проверяем существование поля
        $field = $conn->builder('celena_custom_fields')
            ->where('entity_type', '=', 'news')
            ->where('slug', '=', 'video_url')
            ->first();
        if ($field === null) {
            $fid = $conn->builder('celena_custom_fields')->insert([
                'entity_type'   => 'news',
                'slug'          => 'video_url',
                'label'         => 'URL видео (YouTube/Vimeo)',
                'type'          => 'text',
                'options'       => '{}',
                'is_required'   => false,
                'is_searchable' => false,
                'sort_order'    => 0,
                'created_at'    => $now,
            ]);
        } else {
            $fid = (int) $field['id'];
        }
        $conn->builder('celena_custom_field_values')->insert([
            'field_id'    => $fid,
            'entity_type' => 'news',
            'entity_id'   => (int) $id,
            'value'       => $n['video_url'],
        ]);
    }
}
echo "[news] $insertedNews new (target 10)\n";

/* ═════════ Товары ═════════ */

$products = [
    ['title' => 'iPhone 15 Pro 256GB',           'cat' => 'demo-electronics', 'price' => 850000, 'old' => 920000, 'stock' => 12, 'sku' => 'IPH-15P-256'],
    ['title' => 'MacBook Air M3 13"',            'cat' => 'demo-electronics', 'price' => 720000, 'old' => null,   'stock' => 6,  'sku' => 'MBA-M3-13'],
    ['title' => 'Sony WH-1000XM5 наушники',      'cat' => 'demo-electronics', 'price' => 195000, 'old' => 210000, 'stock' => 24, 'sku' => 'SNY-XM5'],
    ['title' => 'Apple Watch Series 9',          'cat' => 'demo-electronics', 'price' => 245000, 'old' => null,   'stock' => 18, 'sku' => 'AW-S9'],
    ['title' => 'Куртка осенняя унисекс',        'cat' => 'demo-clothing',    'price' => 38000,  'old' => 49000,  'stock' => 30, 'sku' => 'JKT-AUT-001'],
    ['title' => 'Худи оверсайз чёрное',          'cat' => 'demo-clothing',    'price' => 18500,  'old' => null,   'stock' => 50, 'sku' => 'HOO-BLK-OS'],
    ['title' => 'Кеды белые классика',           'cat' => 'demo-clothing',    'price' => 24000,  'old' => 32000,  'stock' => 20, 'sku' => 'SNK-WHT-CL'],
    ['title' => 'Джинсы прямые синие',           'cat' => 'demo-clothing',    'price' => 22000,  'old' => null,   'stock' => 35, 'sku' => 'JNS-BL-STR'],
    ['title' => 'Атомные привычки. Джеймс Клир', 'cat' => 'demo-books',       'price' => 6500,   'old' => 8200,   'stock' => 60, 'sku' => 'BK-AH-001'],
    ['title' => 'Чистый код. Роберт Мартин',     'cat' => 'demo-books',       'price' => 8900,   'old' => null,   'stock' => 25, 'sku' => 'BK-CC-001'],
    ['title' => 'Дюна. Фрэнк Герберт',           'cat' => 'demo-books',       'price' => 5400,   'old' => 6800,   'stock' => 40, 'sku' => 'BK-DUNE'],
    ['title' => 'Гантели 5 кг (пара)',           'cat' => 'demo-sport',       'price' => 14500,  'old' => null,   'stock' => 15, 'sku' => 'SPT-DB-5'],
    ['title' => 'Коврик для йоги 6 мм',          'cat' => 'demo-sport',       'price' => 9800,   'old' => 12500,  'stock' => 28, 'sku' => 'SPT-YG-MAT'],
    ['title' => 'Велосипедный шлем S-line',      'cat' => 'demo-sport',       'price' => 28500,  'old' => null,   'stock' => 9,  'sku' => 'SPT-HLM-S'],
    ['title' => 'Бутылка спортивная 750 мл',     'cat' => 'demo-sport',       'price' => 3500,   'old' => 4500,   'stock' => 80, 'sku' => 'SPT-BTL-750'],
];

$insertedProd = 0;
foreach ($products as $i => $p) {
    $slug = 'demo-product-' . ($i + 1);
    if ($conn->builder('shop_products')->where('slug', '=', $slug)->first() !== null) {
        continue;
    }
    $createdAt = date('Y-m-d H:i:s', strtotime("-" . ($i + 1) . " hours"));
    $conn->builder('shop_products')->insert([
        'slug'            => $slug,
        'title'           => $p['title'],
        'short'           => $p['title'] . ' — отличное качество и проверенная надёжность.',
        'body'            => null,
        'price'           => (float) $p['price'],
        'old_price'       => $p['old'] !== null ? (float) $p['old'] : null,
        'sku'             => $p['sku'],
        'stock'           => (int) $p['stock'],
        'is_active'       => true,
        'category_id'     => $shopCatId[$p['cat']] ?? null,
        'cover'           => pic('product-' . $slug, 800, 800),
        'images'          => null,
        'attributes'      => null,
        'seo_title'       => $p['title'],
        'seo_description' => $p['title'],
        'created_at'      => $createdAt,
        'updated_at'      => $createdAt,
    ]);
    $insertedProd++;
}
echo "[products] $insertedProd new (target 15)\n";

echo "\nDone.\n";
