<?php
include '_common.php';

// 샘플 부품 이름
//$cpu_name = "AMD Ryzen Threadripper PRO 7995WX";
$cpu_name = "Intel";
$gpu_name = "NVIDIA GeForce RTX 4090";
$hdd_name = "Crucial T705 2TB Gen5 M.2 SSD";

// 문자열 정규화 함수 (공백 제거 및 소문자 변환)
function normalize_name($name) {
    return strtolower(preg_replace('/[^a-zA-Z0-9]/', '', $name)); // 특수문자 제거, 소문자 변환
}

// 데이터베이스에서 부품을 찾는 함수 (단어 분리 후 LIKE로 검색)
function get_rank($table, $column, $name) {
    global $g5;

    // 이름을 단어별로 분리하여 유연한 검색을 지원
    $name_parts = preg_split('/[\s,]+/', $name); // 공백과 콤마로 분리
    $like_clauses = [];

    // 각각의 단어에 대해 LIKE 검색 조건 추가
    foreach ($name_parts as $part) {
        $part = $g5['connect_db']->real_escape_string($part); // SQL 인젝션 방지
        $like_clauses[] = "$column LIKE '%$part%'";
    }

    // LIKE 조건을 AND로 결합 (모든 단어가 포함된 결과를 찾기 위해)
    $like_query = implode(' AND ', $like_clauses);

    // SQL 쿼리: 분리된 각 단어가 포함된 결과를 찾음
    $sql = "SELECT $column, CAST(REPLACE(REPLACE(rank, ',', ''), ' ', '') AS UNSIGNED) AS rank_num
            FROM $table
            WHERE $like_query";

    $result = $g5['connect_db']->query($sql);

    $rank_list = [];
    $similarities = [];

    if ($result->num_rows > 0) {
        // 유사도 계산 및 rank 리스트 저장
        while ($row = $result->fetch_assoc()) {
            $rank_list[] = $row;
            $similarity = 0;
            similar_text(normalize_name($name), normalize_name($row[$column]), $similarity);
            $similarities[] = ['rank' => $row['rank_num'], 'similarity' => $similarity, 'name' => $row[$column]];
        }

        // 유사도 기준으로 내림차순 정렬
        usort($similarities, function($a, $b) {
            return $b['similarity'] <=> $a['similarity'];
        });

        // 유사도에 기반하여 필터링
        $highest_similarity = $similarities[0]['similarity'];
        $filtered_similarities = array_filter($similarities, function($item) use ($highest_similarity) {
            // 일정 유사도 이하 값 제거 (유사도가 너무 낮은 경우 제외)
            return $item['similarity'] > 50; // 유사도가 50% 이상인 항목만 남김
        });

        // 동일한 유사도를 가진 항목들만 필터링
        $highest_similarity = $filtered_similarities[0]['similarity'] ?? 0;
        $filtered_similarities = array_filter($filtered_similarities, function($item) use ($highest_similarity) {
            return $item['similarity'] == $highest_similarity;
        });

        // 결과값이 너무 많은 경우, rank_num의 범위를 더 좁힘
        if (count($filtered_similarities) > 10) {
            // 유사도가 같아도 너무 많은 값이 있을 경우 상위 10개만 추림
            $filtered_similarities = array_slice($filtered_similarities, 0, 10);
        }

        // 필터링된 결과에서 가장 낮은 값과 가장 높은 값을 제외하고 평균 rank 계산
        if (count($filtered_similarities) > 2) {
            $rank_values = array_column($filtered_similarities, 'rank');
            sort($rank_values); // 오름차순 정렬
            array_shift($rank_values); // 가장 낮은 값 제거
            array_pop($rank_values);   // 가장 높은 값 제거
            $average_rank = array_sum($rank_values) / count($rank_values);
        } else {
            // 결과가 2개 이하인 경우 첫 번째 값을 사용
            $average_rank = $filtered_similarities[0]['rank'];
        }

        // 유사도와 함께 평균 rank 반환
        return ['rank' => $average_rank, 'similarity' => $highest_similarity, 'details' => $filtered_similarities];
    } else {
        return null; // rank를 찾지 못하면 null 반환
    }
}

// CPU, GPU, HDD/SSD 테이블에서 rank 값 가져오기
$cpu_data = get_rank('api___price_cpu_single', 'cpu_name', $cpu_name);
$gpu_data = get_rank('api___price_gpu', 'videocard_name', $gpu_name);
$hdd_data = get_rank('api___price_hdd', 'drive_name', $hdd_name);

// rank가 0일 때는 방어 코드로 제외 처리
$cpu_score = ($cpu_data && $cpu_data['rank'] > 0) ? (1 / $cpu_data['rank'] * 0.5) : 0;
$gpu_score = ($gpu_data && $gpu_data['rank'] > 0) ? (1 / $gpu_data['rank'] * 0.4) : 0;
$hdd_score = ($hdd_data && $hdd_data['rank'] > 0) ? (1 / $hdd_data['rank'] * 0.1) : 0;

// 최종 종합 점수 계산
$total_score = $cpu_score + $gpu_score + $hdd_score;

// 상위 퍼센트 계산 함수
function getRankPercentage($rank, $all_ranks) {
    if (empty($all_ranks)) {
        return null; // 목록이 비어 있으면 계산할 수 없음
    }

    sort($all_ranks); // 순위 오름차순 정렬
    $position = array_search($rank, $all_ranks) + 1; // 현재 순위
    $total = count($all_ranks); // 총 항목 수
    if ($total == 0 || $position == 0) {
        return null; // 총 항목 수가 0이거나 순위를 찾을 수 없을 때
    }

    $percent = ($position / $total) * 100;
    return $percent + 1; // 상위 몇 %인지 계산 (낮을수록 성능이 좋음)
}

// 각각의 퍼센트 계산 (임시 rank 목록으로 상위 퍼센트 계산 가능)
$sql_all_cpu = "SELECT CAST(REPLACE(REPLACE(rank, ',', ''), ' ', '') AS UNSIGNED) AS rank_num FROM api___price_cpu_single ORDER BY rank_num ASC";
$sql_all_gpu = "SELECT CAST(REPLACE(REPLACE(rank, ',', ''), ' ', '') AS UNSIGNED) AS rank_num FROM api___price_gpu ORDER BY rank_num ASC";
$sql_all_hdd = "SELECT CAST(REPLACE(REPLACE(rank, ',', ''), ' ', '') AS UNSIGNED) AS rank_num FROM api___price_hdd ORDER BY rank_num ASC";

$cpu_ranks = [];
$gpu_ranks = [];
$hdd_ranks = [];

$result_all_cpu = $g5['connect_db']->query($sql_all_cpu);
$result_all_gpu = $g5['connect_db']->query($sql_all_gpu);
$result_all_hdd = $g5['connect_db']->query($sql_all_hdd);

// CPU 목록
if ($result_all_cpu->num_rows > 0) {
    while ($row = $result_all_cpu->fetch_assoc()) {
        $cpu_ranks[] = $row['rank_num'];
    }
}

// GPU 목록
if ($result_all_gpu->num_rows > 0) {
    while ($row = $result_all_gpu->fetch_assoc()) {
        $gpu_ranks[] = $row['rank_num'];
    }
}

// HDD 목록
if ($result_all_hdd->num_rows > 0) {
    while ($row = $result_all_hdd->fetch_assoc()) {
        $hdd_ranks[] = $row['rank_num'];
    }
}

// 각각의 퍼센트 계산
$cpu_percent = ($cpu_data && $cpu_data['rank'] > 0) ? round(getRankPercentage($cpu_data['rank'], $cpu_ranks), 0) : 0;
$gpu_percent = ($gpu_data && $gpu_data['rank'] > 0) ? round(getRankPercentage($gpu_data['rank'], $gpu_ranks), 0) : 0;
$hdd_percent = ($hdd_data && $hdd_data['rank'] > 0) ? round(getRankPercentage($hdd_data['rank'], $hdd_ranks), 0) : 0;

// 부품 이름이 데이터베이스에서 찾지 못했을 때의 메시지
$missing_parts = [];
if ($cpu_data === null) $missing_parts[] = "CPU: $cpu_name";
if ($gpu_data === null) $missing_parts[] = "GPU: $gpu_name";
if ($hdd_data === null) $missing_parts[] = "HDD/SSD: $hdd_name";

// 결과 출력
if (!empty($missing_parts)) {
    echo "The following parts were not found in the database:<br>";
    foreach ($missing_parts as $part) {
        echo $part . "<br>";
    }
} else {
    echo "CPU Rank: {$cpu_data['rank']} (유사도: {$cpu_data['similarity']}%) 상위 $cpu_percent% [{$cpu_name}]<br>";
    echo "GPU Rank: {$gpu_data['rank']} (유사도: {$gpu_data['similarity']}%) 상위 $gpu_percent% [{$gpu_name}]<br>";
    echo "HDD/SSD Rank: {$hdd_data['rank']} (유사도: {$hdd_data['similarity']}%) 상위 $hdd_percent% [{$hdd_name}]<br>";
    echo "Total Rank: 상위 " . $total_score . "%<br>";

    // 추가된 부분: 개별 유사도 출력
    echo "Detailed Similarities:<br>";
    foreach ($cpu_data['details'] as $detail) {
        echo "CPU: {$detail['name']} - Rank: {$detail['rank']}, Similarity: {$detail['similarity']}%<br>";
    }
    foreach ($gpu_data['details'] as $detail) {
        echo "GPU: {$detail['name']} - Rank: {$detail['rank']}, Similarity: {$detail['similarity']}%<br>";
    }
    foreach ($hdd_data['details'] as $detail) {
        echo "HDD/SSD: {$detail['name']} - Rank: {$detail['rank']}, Similarity: {$detail['similarity']}%<br>";
    }
}

$g5['connect_db']->close();
?>