<?php
if (!defined('_GNUBOARD_')) exit;

/**
 * RPC 상품 자동 등급 산정 라이브러리
 *
 * 등급 기준 (최대 100점):
 *   CPU  0~48점  · RAM 0~20점  · SSD 0~20점  · HDD 0~10점
 *   BASIC  0~19  · PLUS 20~38  · PRO 39~57  · ULTRA 58~75  · MAX 76+
 *
 * CPU Tier 상한선 (RAM/SSD 과다로 인한 등급 부풀림 방지):
 *   Celeron / Pentium / Atom      → 최대 PLUS
 *   Core i3 / Ryzen 3 / Athlon   → 최대 PRO
 *   Core i5 / Ryzen 5            → 최대 ULTRA
 *   Core i7 / Ryzen 7 이상       → 상한 없음 (MAX 가능)
 *   Xeon / EPYC / Threadripper   → 상한 없음 (MAX 가능)
 *   미인식 CPU                   → 최대 ULTRA
 */

// ──────────────────────────────────────────────────────────────────
// 파싱 유틸
// ──────────────────────────────────────────────────────────────────

/**
 * "16 GB", "512 GB", "1 TB", "2.5 TB" → float GB 변환
 */
function rpc_parse_gb($str) {
    $s = trim((string)$str);
    if ($s === '' || $s === '0' || $s === '0 GB' || stripos($s, 'Not install') !== false) return 0.0;
    if (preg_match('/(\d+(?:\.\d+)?)\s*TB/i', $s, $m)) return (float)$m[1] * 1024.0;
    if (preg_match('/(\d+(?:\.\d+)?)\s*GB/i', $s, $m)) return (float)$m[1];
    if (preg_match('/^(\d+(?:\.\d+)?)$/', $s, $m))     return (float)$m[1];
    return 0.0;
}

// ──────────────────────────────────────────────────────────────────
// 개별 부품 점수
// ──────────────────────────────────────────────────────────────────

/**
 * CPU 점수 (0~48)
 *
 * Tier base:
 *   Celeron / Pentium / Atom            → 4
 *   Core i3 / Ryzen 3 / Athlon         → 8
 *   Core i5 / Ryzen 5                  → 16
 *   Core i7 / Ryzen 7                  → 25
 *   Core i9 / Ryzen 9                  → 33
 *   Xeon / EPYC / Threadripper         → 40
 *
 * Generation bonus (Intel Core iX):
 *   Gen 7-9   → +2  (4자리 model: 첫 자리 7~9)
 *   Gen 10-12 → +4  (5자리 model: 앞 두 자리 10~12)
 *   Gen 13+   → +6
 *
 * AMD Ryzen series bonus:
 *   1xxx/2xxx → +0 · 3xxx/4xxx → +2 · 5xxx → +4 · 7xxx+ → +6
 */
function rpc_cpu_score($cpu_str) {
    $cpu = trim((string)$cpu_str);
    if ($cpu === '') return 0;
    $low = strtolower($cpu);

    // 서버/워크스테이션급
    if (preg_match('/xeon|epyc|threadripper/i', $cpu)) return 40;

    // Tier 분류
    if      (preg_match('/core\s*i9|ryzen\s*9/i',            $low)) $base = 33;
    else if (preg_match('/core\s*i7|ryzen\s*7/i',            $low)) $base = 25;
    else if (preg_match('/core\s*i5|ryzen\s*5/i',            $low)) $base = 16;
    else if (preg_match('/core\s*i3|ryzen\s*3|athlon/i',     $low)) $base = 8;
    else if (preg_match('/celeron|pentium|atom/i',            $low)) $base = 4;
    else $base = 5;

    // Intel Core 세대 보너스
    if (preg_match('/core\s*i[3579]-(\d{4,5})/i', $cpu, $m)) {
        $num = preg_replace('/\D/', '', $m[1]);
        $gen = strlen($num) >= 5 ? (int)substr($num, 0, 2) : (int)substr($num, 0, 1);
        if      ($gen >= 13) $base += 6;
        else if ($gen >= 10) $base += 4;
        else if ($gen >= 7)  $base += 2;
    }
    // AMD Ryzen 시리즈 보너스 (모델 번호 4자리)
    else if (preg_match('/ryzen\s*[0-9]+\s+(\d{4})/i', $cpu, $m)) {
        $series = (int)substr($m[1], 0, 1);
        if      ($series >= 7) $base += 6;
        else if ($series >= 5) $base += 4;
        else if ($series >= 3) $base += 2;
    }

    return min((int)$base, 48);
}

/** RAM 점수 (0~20) */
function rpc_ram_score($ram_gb) {
    $g = (float)$ram_gb;
    if      ($g >= 64) return 20;
    else if ($g >= 32) return 16;
    else if ($g >= 24) return 14;
    else if ($g >= 16) return 12;
    else if ($g >= 12) return 10;
    else if ($g >=  8) return 8;
    else if ($g >=  4) return 4;
    else if ($g >   0) return 2;
    return 0;
}

/** SSD 점수 (0~20) */
function rpc_ssd_score($ssd_gb) {
    $g = (float)$ssd_gb;
    if      ($g >= 2048) return 20;
    else if ($g >= 1024) return 17;
    else if ($g >=  512) return 14;
    else if ($g >=  256) return 10;
    else if ($g >     0) return 5;
    return 0;
}

/** HDD 점수 (0~10) */
function rpc_hdd_score($hdd_gb) {
    $g = (float)$hdd_gb;
    if      ($g >= 4096) return 10;
    else if ($g >= 2048) return 8;
    else if ($g >= 1024) return 6;
    else if ($g >=  500) return 4;
    else if ($g >     0) return 2;
    return 0;
}

// ──────────────────────────────────────────────────────────────────
// 총점 → 등급
// ──────────────────────────────────────────────────────────────────

/** 총점 계산 (최대 ~98) */
function rpc_total_score($cpu_str, $ram_str, $ssd_str, $hdd_str) {
    return rpc_cpu_score($cpu_str)
         + rpc_ram_score(rpc_parse_gb($ram_str))
         + rpc_ssd_score(rpc_parse_gb($ssd_str))
         + rpc_hdd_score(rpc_parse_gb($hdd_str));
}

/**
 * 점수 → 등급 (BASIC / PLUS / PRO / ULTRA / MAX)
 *
 *  0~19   → BASIC
 * 20~38   → PLUS
 * 39~57   → PRO
 * 58~75   → ULTRA
 * 76+     → MAX
 */
function rpc_grade_from_score($score) {
    $s = (int)$score;
    if      ($s >= 76) return 'MAX';
    else if ($s >= 58) return 'ULTRA';
    else if ($s >= 39) return 'PRO';
    else if ($s >= 20) return 'PLUS';
    return 'BASIC';
}

/**
 * CPU Tier 기반 등급 상한선 반환
 * RAM/SSD 과다로 인한 등급 부풀림 방지용
 */
function rpc_cpu_grade_ceiling($cpu_str) {
    $cpu = trim((string)$cpu_str);
    if ($cpu === '') return 'ULTRA';

    if (preg_match('/xeon|epyc|threadripper/i',          $cpu)) return 'MAX';
    if (preg_match('/core\s*i[79]|ryzen\s*[79]/i',       $cpu)) return 'MAX';
    if (preg_match('/core\s*i5|ryzen\s*5/i',             $cpu)) return 'ULTRA';
    if (preg_match('/core\s*i3|ryzen\s*3|athlon/i',      $cpu)) return 'PRO';
    if (preg_match('/celeron|pentium|atom/i',             $cpu)) return 'PLUS';

    return 'ULTRA'; // 미인식 CPU
}

/** 계산된 등급이 CPU 상한선을 초과하면 상한선으로 내림 */
function rpc_apply_grade_ceiling($grade, $ceiling) {
    static $order = ['BASIC' => 0, 'PLUS' => 1, 'PRO' => 2, 'ULTRA' => 3, 'MAX' => 4];
    $g = $order[$grade]   ?? 0;
    $c = $order[$ceiling] ?? 4;
    return $g <= $c ? $grade : $ceiling;
}

/** CPU·RAM·SSD·HDD 문자열을 받아 최종 등급 반환 */
function rpc_auto_grade($cpu_str, $ram_str, $ssd_str, $hdd_str) {
    $grade   = rpc_grade_from_score(rpc_total_score($cpu_str, $ram_str, $ssd_str, $hdd_str));
    $ceiling = rpc_cpu_grade_ceiling($cpu_str);
    return rpc_apply_grade_ceiling($grade, $ceiling);
}

// ──────────────────────────────────────────────────────────────────
// DB 저장
// ──────────────────────────────────────────────────────────────────

/**
 * it_spec_grade 가 비어있거나 $force=true 이면 자동 산정 후 DB 업데이트
 *
 * @param  string $it_id          상품 ID
 * @param  string $current_grade  현재 DB 값 (빈 문자열이면 재계산)
 * @param  string $cpu_str        it_spec_cpu 원본
 * @param  string $ram_str        it_spec_ram  (예: "16 GB")
 * @param  string $ssd_str        it_spec_ssd  (예: "512 GB")
 * @param  string $hdd_str        it_spec_hdd  (예: "1 TB")
 * @param  bool   $force          true면 현재 등급 무관하게 재산정
 * @return string                 확정 등급
 */
function rpc_ensure_grade($it_id, $current_grade, $cpu_str, $ram_str, $ssd_str, $hdd_str, $force = false) {
    global $g5;
    $computed = rpc_auto_grade($cpu_str, $ram_str, $ssd_str, $hdd_str);
    if (!$force && $current_grade === $computed) return $computed;
    $esc_id    = sql_escape_string((string)$it_id);
    $esc_grade = sql_escape_string($computed);
    sql_query("UPDATE {$g5['g5_shop_item_table']} SET it_spec_grade='{$esc_grade}' WHERE it_id='{$esc_id}'");
    return $computed;
}

// ──────────────────────────────────────────────────────────────────
// 배지 HTML
// ──────────────────────────────────────────────────────────────────

/**
 * RPC 상품종류 배지
 *
 * ca_id 앞 두 자리: '10' → RPC,  '20' → 경매
 */
function rpc_category_badge_html($ca_id) {
    $prefix = substr((string)$ca_id, 0, 2);
    $base_style = 'display:inline-block;padding:1px 8px;border-radius:0;font-size:11px;font-weight:700;letter-spacing:.4px;background:#64748b;color:#fff;margin-right:4px;vertical-align:middle;cursor:help;';
    $span_rpc    = '<span class="rpc-category-badge" title="원격제어컴퓨터 (Remote PC)" style="'.$base_style.'">';
    $span_auction = '<span class="rpc-category-badge" title="경매 상품" style="'.$base_style.'">';
    if ($prefix === '20') {
        return $span_auction.'경매</span>'.$span_rpc.'RPC</span>';
    }
    return $span_rpc.'RPC</span>';
}

/**
 * 등급 배지 (VPN과 동일 색상)
 * vpn_grade_badge_html 이 이미 정의된 경우 그것을 재사용
 */
function rpc_grade_badge_html($grade) {
    if (function_exists('vpn_grade_badge_html')) {
        return vpn_grade_badge_html($grade);
    }
    $grade = strtoupper(trim((string)$grade));
    if ($grade === '') return '';
    $c  = array('BASIC'=>'#6c757d','PLUS'=>'#0d6efd','PRO'=>'#198754','ULTRA'=>'#6f42c1','MAX'=>'#dc3545');
    $bg = isset($c[$grade]) ? $c[$grade] : '#555';
    return '<span style="display:inline-block;padding:1px 8px;border-radius:0;font-size:11px;font-weight:700;letter-spacing:.4px;background:'.htmlspecialchars($bg,ENT_QUOTES).';color:#fff;margin-right:4px;vertical-align:middle;">'.htmlspecialchars($grade,ENT_QUOTES).'</span>';
}
