<?php
declare(strict_types=1);
require_once __DIR__ . '/bootstrap.php';
admin_require_login();

function la_slugify(string $value): string
{
    $value = trim(mb_strtolower($value, 'UTF-8'));
    $map = ['а'=>'a','б'=>'b','в'=>'v','г'=>'g','д'=>'d','е'=>'e','ё'=>'e','ж'=>'zh','з'=>'z','и'=>'i','й'=>'y','к'=>'k','л'=>'l','м'=>'m','н'=>'n','о'=>'o','п'=>'p','р'=>'r','с'=>'s','т'=>'t','у'=>'u','ф'=>'f','х'=>'h','ц'=>'c','ч'=>'ch','ш'=>'sh','щ'=>'sch','ъ'=>'','ы'=>'y','ь'=>'','э'=>'e','ю'=>'yu','я'=>'ya'];
    $value = strtr($value, $map);
    $value = preg_replace('~[^a-z0-9]+~', '-', $value) ?: '';
    return trim($value, '-') ?: 'house';
}
function la_is_tilda_url(string $url): bool
{
    return (bool)preg_match('~^https?://static\.tildacdn\.com/~i', $url);
}
function la_download_file(string $url, string $targetPath): bool
{
    $context = stream_context_create(['http' => ['timeout' => 35, 'follow_location' => 1], 'ssl' => ['verify_peer' => false, 'verify_peer_name' => false]]);
    $body = @file_get_contents($url, false, $context);
    if ($body === false || $body === '') return false;
    ensure_dir(dirname($targetPath));
    return file_put_contents($targetPath, $body) !== false;
}
function la_rel(string $path): string
{
    return '/' . ltrim(str_replace(ROOT_DIR, '', $path), '/');
}
function la_process_generic_value($value, string $scope, array &$report)
{
    if (is_array($value)) {
        foreach ($value as $k => $v) $value[$k] = la_process_generic_value($v, $scope, $report);
        return $value;
    }
    if (!is_string($value) || !la_is_tilda_url($value)) return $value;
    $urlPath = parse_url($value, PHP_URL_PATH) ?: '';
    $ext = pathinfo($urlPath, PATHINFO_EXTENSION) ?: 'jpg';
    $name = basename($urlPath);
    $target = ROOT_DIR . '/uploads/imported/' . $scope . '/' . $name;
    if (!is_file($target) && !la_download_file($value, $target)) {
        $report['errors'][] = 'Не удалось скачать: ' . $value;
        return $value;
    }
    $report['downloaded']++;
    return la_rel($target);
}

$notice = '';
$report = ['downloaded' => 0, 'houses' => [], 'errors' => []];

if (request_method() === 'POST') {
    if (!verify_csrf($_POST['csrf_token'] ?? null)) {
        $notice = '<div class="notice notice--error">Ошибка безопасности.</div>';
    } else {
        $houses = cms_collection('houses');
        foreach (($houses['items'] ?? []) as $index => $house) {
            $slug = la_slugify((string)($house['title'] ?? ('house-' . ($index + 1))));
            $seen = [];
            foreach ((array)($house['gallery'] ?? []) as $gIndex => $url) {
                if (!is_string($url) || !la_is_tilda_url($url)) continue;
                $base = basename((string)parse_url($url, PHP_URL_PATH));
                $base = $base !== '' ? $base : ('image-' . ($gIndex + 1) . '.jpg');
                if (isset($seen[$base])) {
                    $base = pathinfo($base, PATHINFO_FILENAME) . '-' . ($gIndex + 1) . '.' . (pathinfo($base, PATHINFO_EXTENSION) ?: 'jpg');
                }
                $seen[$base] = true;
                $target = ROOT_DIR . '/uploads/houses/' . $slug . '/' . $base;
                if (!is_file($target) && !la_download_file($url, $target)) {
                    $report['errors'][] = 'Домик ' . ($house['title'] ?? $slug) . ': ' . $url;
                    continue;
                }
                $houses['items'][$index]['gallery'][$gIndex] = la_rel($target);
                $report['downloaded']++;
            }
            if (!empty($houses['items'][$index]['gallery'][0])) {
                $houses['items'][$index]['image'] = $houses['items'][$index]['gallery'][0];
            } elseif (is_string($house['image'] ?? null) && la_is_tilda_url((string)$house['image'])) {
                $base = basename((string)parse_url((string)$house['image'], PHP_URL_PATH));
                $target = ROOT_DIR . '/uploads/houses/' . $slug . '/' . ($base ?: 'cover.jpg');
                if (!is_file($target) && la_download_file((string)$house['image'], $target)) {
                    $houses['items'][$index]['image'] = la_rel($target);
                    $report['downloaded']++;
                }
            }
            $report['houses'][] = ['title' => (string)($house['title'] ?? $slug), 'count' => count((array)($houses['items'][$index]['gallery'] ?? []))];
        }
        cms_save_collection('houses', $houses);

        foreach (['gallery','reviews'] as $name) {
            $col = cms_collection($name);
            $col = la_process_generic_value($col, $name, $report);
            cms_save_collection($name, $col);
        }
        foreach (glob(DATA_DIR . '/modules/*.json') ?: [] as $file) {
            $data = read_json_file($file, []);
            $data = la_process_generic_value($data, pathinfo($file, PATHINFO_FILENAME), $report);
            write_json_file($file, $data);
        }
        $notice = '<div class="notice">Импорт выполнен. Скачано файлов: ' . (int)$report['downloaded'] . '.</div>';
    }
}

ob_start();
echo $notice;
?>
<section class="panel grid">
  <div class="admin-page-head admin-page-head--compact">
    <div>
      <div class="badge">Tilda → local</div>
      <h2 style="margin:10px 0 6px">Перевод внешних картинок в локальные файлы</h2>
      <p class="muted">Страница скачивает изображения с <code>static.tildacdn.com</code> прямо на вашем хостинге, раскладывает фото домиков по папкам <code>/uploads/houses/&lt;slug&gt;/</code> и перепривязывает CMS на локальные пути.</p>
    </div>
  </div>
  <div class="notice" style="margin:0">Качество файлов не режется: скрипт скачивает оригиналы как есть. Это безопаснее, чем пережимать JPEG и терять детализацию. После импорта сайт становится намного автономнее от Tilda.</div>
  <form method="post" class="grid">
    <input type="hidden" name="csrf_token" value="<?= e(csrf_token()) ?>">
    <div class="module-actions">
      <button class="button" type="submit">Скачать и перепривязать внешние картинки</button>
      <a class="button button--ghost" href="/admin/houses.php">Открыть менеджер домиков</a>
    </div>
  </form>
</section>
<?php if (!empty($report['houses'])): ?>
<section class="panel grid">
  <div class="badge">Что обработано</div>
  <div class="grid">
    <?php foreach ($report['houses'] as $row): ?>
      <div class="card"><strong><?= e($row['title']) ?></strong><div class="muted">Фото в галерее после импорта: <?= (int)$row['count'] ?></div></div>
    <?php endforeach; ?>
  </div>
  <?php if (!empty($report['errors'])): ?>
    <div class="notice notice--error">Часть файлов не скачалась. Ниже первые проблемы:<br><?= e(implode("
", array_slice($report['errors'], 0, 12))) ?></div>
  <?php endif; ?>
</section>
<?php endif; ?>
<?php
admin_layout('Локализация картинок', ob_get_clean(), 'settings');
