<?php
/**
 * run-parse-notes.php
 * پارس notes → bld_count / apt_count / shop_count در gis_parcels
 * یک بار اجرا کنید، بعد حذف کنید
 */
if ( ($_GET['key'] ?? '') !== 'parse2024' ) { http_response_code(403); exit('دسترسی غیرمجاز'); }
set_time_limit(0);
ini_set('memory_limit', '256M');

require_once dirname(__FILE__) . '/../../../wp-load.php';
global $wpdb;
$table = $wpdb->prefix . 'gis_parcels';

header('Content-Type: text/html; charset=utf-8');
echo '<!DOCTYPE html><html dir="rtl"><head><meta charset="utf-8">
<style>body{font-family:Tahoma;padding:20px;direction:rtl}
.ok{color:#059669} .err{color:#dc2626} .info{color:#6366f1}
pre{background:#f8fafc;padding:12px;border-radius:8px;font-size:13px}
</style></head><body>';
echo '<h2>🔄 پارس فیلد notes → bld_count / apt_count / shop_count</h2>';

/* ── Step 1: اضافه کردن ستون‌ها ── */
echo '<h3>مرحله ۱: اضافه کردن ستون‌ها</h3>';

$cols = [
    'bld_count'  => "ALTER TABLE {$table} ADD COLUMN bld_count  SMALLINT NOT NULL DEFAULT 0 AFTER notes",
    'apt_count'  => "ALTER TABLE {$table} ADD COLUMN apt_count  SMALLINT NOT NULL DEFAULT 0 AFTER bld_count",
    'shop_count' => "ALTER TABLE {$table} ADD COLUMN shop_count SMALLINT NOT NULL DEFAULT 0 AFTER apt_count",
];

foreach ( $cols as $col => $sql ) {
    // چک وجود ستون
    $exists = $wpdb->get_var("SHOW COLUMNS FROM {$table} LIKE '{$col}'");
    if ( $exists ) {
        echo "<p class='info'>⚠️ ستون <b>{$col}</b> قبلاً وجود دارد — رد شد</p>";
        continue;
    }
    $wpdb->query($sql);
    if ( $wpdb->last_error ) {
        echo "<p class='err'>❌ خطا در افزودن {$col}: {$wpdb->last_error}</p>";
    } else {
        echo "<p class='ok'>✅ ستون <b>{$col}</b> اضافه شد</p>";
    }
}

/* ── Step 2: ایندکس‌ها — در phpMyAdmin جداگانه اجرا کنید ── */
echo '<h3>مرحله ۲: ایندکس‌ها</h3>';
echo "<p class='info'>ℹ️ ایندکس‌ها بعد از UPDATE در phpMyAdmin اجرا کنید (روی جدول بزرگ timeout می‌دهد):</p>";
echo "<pre>ALTER TABLE {$table}
  ADD INDEX idx_bld_count  (bld_count),
  ADD INDEX idx_apt_count  (apt_count),
  ADD INDEX idx_shop_count (shop_count);</pre>";

/* ── Step 3: UPDATE batch ── */
echo '<h3>مرحله ۳: پارس و بروزرسانی داده‌ها</h3>';

$total   = (int) $wpdb->get_var("SELECT COUNT(*) FROM {$table} WHERE notes LIKE '%ساختمان: %'");
$no_data = (int) $wpdb->get_var("SELECT COUNT(*) FROM {$table} WHERE notes IS NULL OR notes NOT LIKE '%ساختمان: %'");

echo "<p>📦 پارسل با اطلاعات: <b>{$total}</b> | بدون اطلاعات: <b>{$no_data}</b></p>";

// نوار پیشرفت HTML
echo '
<div style="background:#f1f5f9;border-radius:10px;overflow:hidden;height:28px;margin:12px 0;width:100%">
  <div id="bar" style="height:100%;width:0%;background:linear-gradient(90deg,#6366f1,#a78bfa);transition:width .3s;border-radius:10px"></div>
</div>
<div style="display:flex;justify-content:space-between;font-size:13px;color:#475569;margin-bottom:16px">
  <span id="pct_lbl">۰٪</span>
  <span id="rows_lbl">بروز شده: ۰</span>
  <span id="time_lbl">زمان: ۰s</span>
  <span id="eta_lbl">ETA: —</span>
  <span id="speed_lbl">سرعت: —</span>
</div>
<script>
function upd(pct, rows, elapsed, eta, speed) {
  document.getElementById("bar").style.width = pct + "%";
  document.getElementById("pct_lbl").textContent = pct + "٪";
  document.getElementById("rows_lbl").textContent = "بروز شده: " + rows.toLocaleString("fa");
  document.getElementById("time_lbl").textContent = "زمان: " + elapsed + "s";
  document.getElementById("eta_lbl").textContent  = "ETA: " + (eta > 0 ? eta + "s" : "—");
  document.getElementById("speed_lbl").textContent = "سرعت: " + speed + " ردیف/ثانیه";
}
</script>';

$batch_size = 10000;
$updated    = 0;
$time_start = microtime(true);

// محدوده id
$min_id = (int) $wpdb->get_var("SELECT MIN(id) FROM {$table} WHERE notes LIKE '%ساختمان: %'");
$max_id = (int) $wpdb->get_var("SELECT MAX(id) FROM {$table} WHERE notes LIKE '%ساختمان: %'");

for ( $from_id = $min_id; $from_id <= $max_id; $from_id += $batch_size ) {
    $to_id = $from_id + $batch_size - 1;

    $rows = $wpdb->query( $wpdb->prepare("
        UPDATE {$table}
        SET
            bld_count  = CAST(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(notes, 'ساختمان: ',  -1), ' |', 1)) AS UNSIGNED),
            apt_count  = CAST(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(notes, 'آپارتمان: ', -1), ' |', 1)) AS UNSIGNED),
            shop_count = CAST(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(notes, 'مغازه: ',    -1), ' |', 1)) AS UNSIGNED)
        WHERE id BETWEEN %d AND %d
          AND notes LIKE '%%ساختمان: %%'
    ", $from_id, $to_id ) );

    if ( $wpdb->last_error ) {
        echo "<p class='err'>❌ خطا در id {$from_id}-{$to_id}: " . esc_html($wpdb->last_error) . "</p>";
        break;
    }

    $updated += max(0, (int)$rows);

    $elapsed  = round(microtime(true) - $time_start, 1);
    $done_ids = $from_id + $batch_size - $min_id;
    $range    = $max_id - $min_id + 1;
    $pct      = min(100, round($done_ids / $range * 100));
    $speed    = $elapsed > 0 ? round($updated / $elapsed) : 0;
    $rem_ids  = max(0, $max_id - $to_id);
    $eta      = ($speed > 0) ? round($rem_ids / $batch_size * ($elapsed / max(1, ($done_ids / $batch_size)))) : 0;

    echo "<script>upd({$pct},{$updated},{$elapsed},{$eta},{$speed});</script>";
    flush(); ob_flush();
}

/* ── Step 4: نتیجه نهایی ── */
echo '<h3>مرحله ۴: نتیجه</h3>';

$stats = $wpdb->get_results("
    SELECT
        SUM(bld_count > 0)  AS has_building,
        SUM(apt_count > 0)  AS has_apt,
        SUM(shop_count > 0) AS has_shop,
        SUM(bld_count = 0 AND apt_count = 0 AND shop_count = 0) AS land_only,
        COUNT(*) AS total
    FROM {$table}
", ARRAY_A);

if ($stats) {
    $s = $stats[0];
    echo "<pre>
کل پارسل   : {$s['total']}
دارای ساختمان: {$s['has_building']}
دارای آپارتمان: {$s['has_apt']}
دارای مغازه  : {$s['has_shop']}
زمین تنها   : {$s['land_only']}
    </pre>";
}

$total_time = round(microtime(true) - $time_start, 2);
echo "<p class='ok'><b>✅ تمام شد — {$updated} ردیف بروز شد در {$total_time} ثانیه</b></p>";
echo "<p class='err' style='font-size:12px'>⚠️ این فایل را از سرور حذف کنید</p>";
echo '</body></html>';
