<?php
// client.php : API 서버에서 데이터를 가져와 데이터베이스에 저장하는 클라이언트
// JSLEE 2024-05-01
include_once('./_common.php');
define('_INDEX_', true);

if(!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가

error_reporting(E_ALL);
ini_set("display_errors", 1);

// 고정 변수 (중복선언할 필요 없음)
$api_site = "comviewers.com";
$api_key = 'AdHtlY5Y5]BJ)sLA';

$it_spec_sales_type = "원격제어컴퓨터(일반)";
$it_spec_partner_id = "comviewers";

// API 서버의 URL
$table_name_comspec = "api_get_remotepc";
$api_base_url_comspec = 'http://comviewers.com/__api/server_comspec_';
$api_url_comspec = $api_base_url_comspec . $api_key.'.php';

// cURL을 사용하여 API에 요청을 보냄
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $api_url_comspec);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // SSL 인증서 검증을 비활성화
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // SSL 인증서 검증을 비활성화
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 리디렉션을 따름
curl_setopt($ch, CURLOPT_MAXREDIRS, 10); // 최대 리디렉션 횟수 설정 (default 10)
curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 타임아웃 설정 (default 30)
$response = curl_exec($ch);

$it_id_values = array();

// cURL 실행 결과 확인
if ($response === false) {
    echo $table_name_comspec . " Error accessing API: " . curl_error($ch) . "<br>";
} else {
    // 응답을 JSON으로 디코딩하여 데이터베이스에 저장
    $data = json_decode($response, true);
    if ($data === null) {
        echo $table_name_comspec . " Error decoding JSON" . "<br>";
    } else {
        // 테이블 생성
        $columns = array();
        if (!empty($data)) {
            $sample_data = reset($data); // $data의 첫 번째 요소를 샘플 데이터로 사용
            foreach ($sample_data as $key => $value) {
                $columns[] = "$key TEXT";
            }

            // 테이블이 이미 존재하는지 확인
            $check_table_sql = "SHOW TABLES LIKE '$table_name_comspec'";
            $result = $g5['connect_db']->query($check_table_sql);
            if ($result->num_rows > 0) {
                // 테이블이 존재하는 경우, 삭제
                $drop_table_sql = "DROP TABLE IF EXISTS $table_name_comspec";
                if ($g5['connect_db']->query($drop_table_sql) === TRUE) {
                    echo $table_name_comspec . " Table dropped successfully" . "<br>";
                } else {
                    echo $table_name_comspec . " Error dropping table: " . $g5['connect_db']->error . "<br>";
                }
            }

            // 테이블 생성
            $create_table_sql = "CREATE TABLE $table_name_comspec (" . implode(", ", $columns) . ")";
            $finished_time = date("Y-m-d H:i:s");
            if ($g5['connect_db']->query($create_table_sql) === TRUE) {
                echo "[CREATE] {$finished_time} : Table created successfully" . "<br>";
            } else {
                echo "[CREATE] {$finished_time} : Error creating table: " . $g5['connect_db']->error . "<br>";
            }
        }

        // 데이터베이스에 API 데이터 삽입 또는 업데이트
        $chk_flag = 0;
        foreach ($data as $row) {
            $no = $row['no']; // no 컬럼 값
            // no가 존재하는지 여부를 확인하는 쿼리
            $sql_check = "SELECT COUNT(*) as count FROM $table_name_comspec WHERE no = '$no'";
            $result_check = $g5['connect_db']->query($sql_check);
            $row_check = $result_check->fetch_assoc();
            $count = $row_check['count'];

            if ($count > 0) {
                // no가 존재하면 UPDATE
                $update_values = array();
                foreach ($row as $key => $value) {
                    // no 컬럼은 업데이트 대상에서 제외
                    if ($key !== 'no') {
                        $update_values[] = "$key = '" . $g5['connect_db']->real_escape_string($value) . "'";
                    }
                    if ($key === 'no') {
                        $it_id_values[] = $value;
                    }
                }
                // UPDATE 쿼리 생성
                $sql = "UPDATE $table_name_comspec SET " . implode(", ", $update_values) . " WHERE no = '$no'";
                $finished_time = date("Y-m-d H:i:s");
                if ($g5['connect_db']->query($sql) === TRUE) {
                    echo "[UPDATE] {$finished_time} : Record updated successfully : no=" . $no . "<br>";
                } else {
                    echo "[UPDATE] {$finished_time} : Error updating record: " . $g5['connect_db']->error . "<br>";
                }
            } else {
                // no가 존재하지 않으면 INSERT
                $columns = array(); // 컬럼명 배열 초기화
                $values = array(); // 값 배열 초기화
                foreach ($row as $key => $value) {
                    // 각 키와 값을 사용하여 컬럼명과 값 배열을 생성
                    $columns[] = $key;
                    $values[] = "'" . $g5['connect_db']->real_escape_string($value) . "'";
                    if ($key === 'no') {
                        $it_id_values[] = $value;
                    }
                }
                // 컬럼명과 값 배열을 문자열로 변환하여 쿼리 생성
                $sql = "INSERT INTO $table_name_comspec (" . implode(", ", $columns) . ") VALUES (" . implode(", ", $values) . ")";
                $finished_time = date("Y-m-d H:i:s");
                if ($g5['connect_db']->query($sql) === TRUE) {
                    echo "[INSERT] {$finished_time} : New record created successfully" . "<br>";
                } else {
                    echo "[INSERT] {$finished_time} : Error: " . $sql . "<br>" . $g5['connect_db']->error . "<br>";
                }
            }
            $chk_flag++;
        }

        $finished_time = date("Y-m-d H:i:s");
        echo "# {$finished_time} : {$table_name_comspec} 테이블에 {$chk_flag}건의 데이터를 기록하였습니다." . "<br>";
    }
}
// cURL 리소스 해제
curl_close($ch);












// shop_item에 데이터 삽입 또는 업데이트
// API 서버의 URL
$table_name_shopitem = "g5_shop_item";
$api_base_url_shopitem = 'http://comviewers.com/__api/server_shopitem_';

// 배열의 각 값을 검사하여 유효하지 않은 값이 있는지 확인
$filtered_it_id_values = array_filter($it_id_values, function($value) {
    return trim($value) !== "" && trim($value) !== "0";
});

// 유효한 값이 있는 경우에만 API 요청
if (!empty($filtered_it_id_values)) {
    // 배열을 쿼리 문자열로 변환
    $query_string = http_build_query(['it_id' => $filtered_it_id_values]);

    // API URL 생성
    $api_url_shopitem = $api_base_url_shopitem . $api_key . '.php?' . $query_string;

    // cURL을 사용하여 API에 요청을 보냄
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $api_url_shopitem);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // SSL 인증서 검증을 비활성화
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); // SSL 인증서 검증을 비활성화
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 리디렉션을 따름
    curl_setopt($ch, CURLOPT_MAXREDIRS, 10); // 최대 리디렉션 횟수 설정 (default 10)
    curl_setopt($ch, CURLOPT_TIMEOUT, 10); // 타임아웃 설정 (default 30)
    $response = curl_exec($ch);

    // cURL 실행 결과 확인
    if ($response === false) {
        echo $table_name_shopitem . " Error accessing API: " . curl_error($ch) . "<br>";
    } else {
        // 응답을 JSON으로 디코딩하여 데이터베이스에 저장
        $data = json_decode($response, true);
        if ($data === null) {
            echo $table_name_shopitem . " Error decoding JSON" . "<br>";
        } else {
            // 데이터베이스에 API 데이터 삽입 또는 업데이트
            foreach ($data as $row) {
                //$it_id = $row['it_id']; // it_id 컬럼 값
                $it_id_from_api = $row['it_id']; // it_id 컬럼 값은 타 사이트 api를 통해 얻은 값이므로 이 서버의 it_id로 사용하면 안되고, it_id_from_api 컬럼 값에 저장해야 함
                // it_id가 존재하는지 여부를 확인하는 쿼리
                $sql_check = "SELECT COUNT(*) as count FROM $table_name_shopitem WHERE it_id_from_api = '{$it_id_from_api}'";
                $result_check = $g5['connect_db']->query($sql_check);
                $row_check = $result_check->fetch_assoc();
                $count = $row_check['count'];

                if ($count > 0) {  // UPDATE -- 기존에 존재하는 품번을 api로 가져왔을 떄
                    // api_get_remotepc 테이블에서 컴퓨터 하드웨어 스펙정보를 shop_item 테이블에도 그대로 인용하기 위해 정보 추출해 둠
                    $sql_comspec = " SELECT * FROM api_get_remotepc WHERE no = '{$it_id_from_api}' ";
                    $row_comspec = sql_fetch($sql_comspec);

                    $update_values = array();
                    // it_id가 존재하면 UPDATE
                    foreach ($row as $key => $value) {
                        // 원격지 서버의 it_id 컬럼은 $update_values 값 저장에서 제외
                        if ($key !== 'it_id' && $key !== 'it_name') {
                            if ($key === 'it_price') {
                                $update_values[] = "$key = '" . $g5['connect_db']->real_escape_string(round($value/30,2)) . "'"; // 원격서버에서는 월단위로 가격이 설정되어 있으므로 일단위로 환산하여 저장 (30으로 나눔)
                            } else if ($key === 'it_buy_min_qty') {
                                // api를 통해 가져온 it_buy_min_qty값은 해당 사이트에서 월단위로 사용되는 it_buy_min_qty이므로 여기 사이트에서의 일요금으로 환산하여 it_buy_min_qty 컬럼에 데이터값을 바꿔 저장시킴. (30을  곱합)
                                $update_values[] = "$key = '" . $g5['connect_db']->real_escape_string($value*30) . "'";
                            } else if ($key === 'it_buy_max_qty') {
                                // api를 통해 가져온 it_buy_max_qty값은 해당 사이트에서 월단위로 사용되는 it_buy_max_qty이므로 여기 사이트에서의 일요금으로 환산하여 it_buy_max_qty 컬럼에 데이터값을 바꿔 저장시킴. (30을  곱합)
                                $update_values[] = "$key = '" . $g5['connect_db']->real_escape_string($value*30) . "'";
                            } else if ($key === 'ca_id3') {
                                switch (substr($value,-2)) {
                                    case "10":
                                        $ca_id = "10";
                                        $ca_id2 = "10";
                                        $ca_id3 = "101010";
                                        break;
                                    case "20":
                                        $ca_id = "10";
                                        $ca_id2 = "10";
                                        $ca_id3 = "101020";
                                        break;
                                    case "30":
                                        $ca_id = "10";
                                        $ca_id2 = "10";
                                        $ca_id3 = "101030";
                                        break;
                                    case "40":
                                        $ca_id = "10";
                                        $ca_id2 = "10";
                                        $ca_id3 = "101040";
                                        break;
                                    case "50":
                                        $ca_id = "10";
                                        $ca_id2 = "10";
                                        $ca_id3 = "101050";
                                        break;
                                    case "60":
                                        $ca_id = "10";
                                        $ca_id2 = "10";
                                        $ca_id3 = "101060";
                                        break;
                                    case "70":
                                        $ca_id = "10";
                                        $ca_id2 = "10";
                                        $ca_id3 = "101070";
                                        break;
                                    case "80":
                                        $ca_id = "10";
                                        $ca_id2 = "10";
                                        $ca_id3 = "101080";
                                        break;
                                    case "90":
                                        $ca_id = "10";
                                        $ca_id2 = "10";
                                        $ca_id3 = "101090";
                                        break;
                                    case "a0":
                                        $ca_id = "10";
                                        $ca_id2 = "10";
                                        $ca_id3 = "1010a0";
                                        break;
                                    case "b0":
                                        $ca_id = "10";
                                        $ca_id2 = "10";
                                        $ca_id3 = "1010b0";
                                        break;
                                    case "c0":
                                        $ca_id = "10";
                                        $ca_id2 = "10";
                                        $ca_id3 = "1010c0";
                                        break;
                                }
                                $update_values[] = "ca_id = '" . $g5['connect_db']->real_escape_string($ca_id) . "'";
                                $update_values[] = "ca_id2 = '" . $g5['connect_db']->real_escape_string($ca_id2) . "'";
                                $update_values[] = "ca_id3 = '" . $g5['connect_db']->real_escape_string($ca_id3) . "'";
                            } else {
                                if ($key === 'ca_id' || $key === 'ca_id2' || $key === 'ca_id3') {

                                } else {
                                    $update_values[] = "$key = '" . $g5['connect_db']->real_escape_string($value) . "'";
                                }
                            }
                        }
                    }
                    $update_values[] = "getsitename = '" . $g5['connect_db']->real_escape_string($api_site) . "'";
                    $update_values[] = "it_spec_mgr_nickname = '" . $g5['connect_db']->real_escape_string($row_comspec['mgrname']) . "'";
                    $update_values[] = "reseller_on = '" . $g5['connect_db']->real_escape_string($row_comspec['reseller_on']) . "'";
                    $update_values[] = "market_on = '" . $g5['connect_db']->real_escape_string($row_comspec['market_on']) . "'";
                    $update_values[] = "auction_on = '" . $g5['connect_db']->real_escape_string($row_comspec['auction_on']) . "'";
                    $update_values[] = "pt_id = '" . $g5['connect_db']->real_escape_string($it_spec_partner_id) . "'"; // $it_spec_partner_id = "comviewers";
                    $update_values[] = "it_spec_partner_id = '" . $g5['connect_db']->real_escape_string($it_spec_partner_id) . "'"; // $it_spec_partner_id = "comviewers";
                    $update_values[] = "it_spec_sales_type =  '" . $g5['connect_db']->real_escape_string($it_spec_sales_type) . "'"; // $it_spec_sales_type = "원격제어컴퓨터(일반)"; // 원격제어컴퓨터(일반) 또는 원격제어컴퓨터(경매)
                    $update_values[] = "it_spec_partner_id = '" . $g5['connect_db']->real_escape_string($it_spec_partner_id) . "'"; // $it_spec_partner_id = "comviewers";
                    $update_values[] = "it_spec_app_ver = '" . $g5['connect_db']->real_escape_string($row_comspec['AppVer']) . "'";
                    $update_values[] = "it_spec_os = '" . $g5['connect_db']->real_escape_string($row_comspec['OperatingSystem']) . "'";
                    $update_values[] = "it_spec_mainboard = '" . $g5['connect_db']->real_escape_string($row_comspec['MainBoard']) . "'";
                    $update_values[] = "it_spec_cpu = '" . $g5['connect_db']->real_escape_string($row_comspec['CpuName']) . "'";
                    $update_values[] = "it_spec_ram = '" . $g5['connect_db']->real_escape_string($row_comspec['RAM'] . " GB") . "'";
                    $update_values[] = "it_spec_gpu = '" . $g5['connect_db']->real_escape_string($row_comspec['VideoController']) . "'";
                    $update_values[] = "it_spec_ssd = '" . $g5['connect_db']->real_escape_string($row_comspec['SSD'] . " GB") . "'";
                    $update_values[] = "it_spec_hdd = '" . $g5['connect_db']->real_escape_string($row_comspec['HDD'] . " GB") . "'";
                    $update_values[] = "it_install_price = '" . $g5['connect_db']->real_escape_string($row_comspec['rental_setting_fee']) . "'";
                    $update_values[] = "it_origin_store_from_api = '" . $g5['connect_db']->real_escape_string($api_site.'Ž'.$row_comspec['M_storeid'].'Ž'.$row_comspec['M_storename']) . "'";
                    $update_values[] = "it_spec_keyboard = '" . $g5['connect_db']->real_escape_string($row_comspec['it_keyboard']) . "'";
                    $update_values[] = "it_spec_mouse = '" . $g5['connect_db']->real_escape_string($row_comspec['it_mouse']) . "'";

                    // $update_values[] = "it_spec_from_datetime = '" . $g5['connect_db']->real_escape_string($row_comspec['start_date']) . "'";
                    // $update_values[] = "it_spec_to_datetime = '" . $g5['connect_db']->real_escape_string($row_comspec['exp_date']) . "'";
                    // $update_values[] = "it_spec_buyer_mb_id = ''"; // 구매자 아이디는 비워둠 RPC World에서 사용됨
                    // $update_values[] = "it_spec_buyer_mb_name = ''"; // 구매자 이름은 비워둠 RPC World에서 사용됨
                    // $update_values[] = "it_spec_trans_it_id = ''"; // 이전된 it_id가 있으면 이전후 it_id를 기록함 RPC World에서 사용됨
                    // $update_values[] = "it_spec_reserv_mb_id = ''"; // 예약자 아이디는 비워둠 RPC World에서 사용됨

                    // it_spec_remote_sw JSON 데이터 생성 {
                    $remoteData = array();
                    $remotePrograms = array('AnyDesk', 'TeamViewer');
                    $remoteIds = array($row_comspec['AnyDeskID'], $row_comspec['TeamViewerID']);
                    $remotePasswords = array($row_comspec['AnyDeskPWD'], $row_comspec['TeamViewerPWD']);
                    $extIP = explode(' ',$row_comspec["extIP"])[0];
                    $remoteIps = array($extIP, $extIP);
                    $remoteIpCountries = array();
                    $remoteIpCountryCodes = array();
                    $remoteIpCities = array();
                    $remoteIpLatitudes = array();
                    $remoteIplongitudes = array();

                    if ($extIP !== "") {
                        for ($i = 0; $i < count($remotePrograms); $i++) {
                            // db에서 국가정보 , 시티정보, 지도좌표 가져오기 { JSLEE
                            if ($i==0) {
                                $result_geoip = sql_query("
                                    SELECT
                                        blocks.latitude,
                                        blocks.longitude,
                                        locations.city_name,
                                        locations.country_name,
                                        locations.country_iso_code
                                    FROM
                                        geoip_city_blocks_ipv4 AS blocks
                                    JOIN
                                        geoip_city_locations AS locations
                                    ON
                                        blocks.geoname_id = locations.geoname_id
                                    WHERE
                                        INET6_ATON('{$remoteIps[$i]}') BETWEEN blocks.start_ip AND blocks.end_ip;
                                ");

                                if ($result_geoip->num_rows > 0) {
                                    $row_geoip = $result_geoip->fetch_assoc();
                                    $remoteIpCountries[$i] = $row_geoip['country_name'];
                                    $remoteIpCountryCodes[$i] = $row_geoip['country_iso_code'];
                                    $remoteIpCities[$i] = $row_geoip['city_name'];
                                    $remoteIpLatitudes[$i] = $row_geoip['latitude'];
                                    $remoteIplongitudes[$i] = $row_geoip['longitude'];
                                } else {
                                    $remoteIpCountries[$i] = '';
                                    $remoteIpCountryCodes[$i] = '';
                                    $remoteIpCities[$i] = '';
                                    $remoteIpLatitudes[$i] = '';
                                    $remoteIplongitudes[$i] = '';
                                }
                                $remoteData[] = array(
                                    'RemoteIP__'.$i => $remoteIps[$i],
                                    'RemoteIP_CountryName__'.$i => $remoteIpCountries[$i],  // IP 국가명
                                    'RemoteIP_CountryCode__'.$i => $remoteIpCountryCodes[$i],  // IP 국가명
                                    'RemoteIP_City__'.$i => $remoteIpCities[$i],  // IP city 명
                                    'RemoteIP_Latitude__'.$i => $remoteIpLatitudes[$i],  // IP 지도상 위도
                                    'RemoteIP_Longitude__'.$i => $remoteIplongitudes[$i],  // IP 지도상 경도
                                    'Program__'.$i => $remotePrograms[$i],
                                    $remotePrograms[$i].'_ID__'.$i => $remoteIds[$i],
                                    $remotePrograms[$i].'_PWD__'.$i => $remotePasswords[$i]
                                );
                            } else {
                                $remoteData[] = array(
                                    'RemoteIP__'.$i => $remoteIps[0],
                                    'RemoteIP_CountryName__'.$i => $remoteIpCountries[0],  // IP 국가명
                                    'RemoteIP_CountryCode__'.$i => $remoteIpCountryCodes[0],  // IP 국가명
                                    'RemoteIP_City__'.$i => $remoteIpCities[0],  // IP city 명
                                    'RemoteIP_Latitude__'.$i => $remoteIpLatitudes[0],  // IP 지도상 위도
                                    'RemoteIP_Longitude__'.$i => $remoteIplongitudes[0],  // IP 지도상 경도
                                    'Program__'.$i => $remotePrograms[$i],
                                    $remotePrograms[$i].'_ID__'.$i => $remoteIds[$i],
                                    $remotePrograms[$i].'_PWD__'.$i => $remotePasswords[$i]
                                );
                            }
                            // db에서 국가정보 , 시티정보, 지도좌표 가져오기 } JSLEE
                        }
                        // JSON 데이터 변환
                        $jsonData_for_it_spec_remote_sw = json_encode($remoteData, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
                        // it_spec_remote_sw JSON 데이터 생성 }

                        $update_values[] = "it_spec_remote_sw = '" . $g5['connect_db']->real_escape_string($jsonData_for_it_spec_remote_sw) . "'";
                        $update_values[] = "it_spec_remote_ip_country_code = '" . $g5['connect_db']->real_escape_string($remoteIpCountryCodes[0]) . "'";
                    }

                    // UPDATE 쿼리 생성
                    $sql = "UPDATE $table_name_shopitem SET " . implode(", ", $update_values) . " WHERE it_id_from_api = '{$it_id_from_api}'";
                    $finished_time = date("Y-m-d H:i:s");
                    if ($g5['connect_db']->query($sql) === TRUE) {
                        echo "[UPDATE] {$finished_time} : {$table_name_shopitem} 테이블에 Record updated successfully : it_id_from_api = " . $it_id_from_api . "<br>";
                    } else {
                        echo "[UPDATE] {$finished_time} : {$table_name_shopitem} 테이블에 Error updating record: " . $g5['connect_db']->error . "<br>";
                    }

                    // ca_id2가 분류코드가 6자리인 경우, 재분류 시킴 (Set 순서가 바뀌면 안됨)
                    // $sql = "UPDATE g5_shop_item SET ca_id3 = LEFT(ca_id2, 6), ca_id = LEFT(ca_id2, 2), ca_id2 = LEFT(ca_id2, 4) WHERE LENGTH(ca_id2) = 6 AND it_id_from_api = '{$it_id_from_api}'";
                    // $g5['connect_db']->query($sql);
                    // $finished_time = date("Y-m-d H:i:s");
                    // echo "##### {$finished_time} : ca_id2가 6자리인 분류를 재분류하였습니다." . "<br>";

                    // 최대구매일수 단위가 월이므로 일 단위로 환산(*30)해서 적용시킴.
                    // $sql = "UPDATE g5_shop_item SET it_buy_max_qty = it_buy_max_qty * 30, it_price = it_price WHERE it_buy_max_qty <= 3 AND it_id_from_api = '{$it_id_from_api}'";
                    // $g5['connect_db']->query($sql);
                    // $finished_time = date("Y-m-d H:i:s");
                    // echo "##### {$finished_time} : 최대구매일수 단위를 일로 환산하여 적용하였습니다." . "<br>";

                    // 적립포인트가 10% 이하일때 10%로 변경해서 적용시킴.$it['it_point']
                    $sql = "UPDATE g5_shop_item SET it_point = 10 WHERE getsitename='$api_site' AND it_point_type='2' AND it_point < 10 AND it_id_from_api = '{$it_id_from_api}'";
                    $g5['connect_db']->query($sql);
                    $finished_time = date("Y-m-d H:i:s");
                    echo "##### {$finished_time} : 적립포인트가 10% 이하일때 10%로 변경 적용하였습니다." . "<br>";

                } else {  // 기존에 존재하지 않는 새로운 품번을 api로 가져왔을 떄

                    $columns = array(); // 컬럼명 배열 초기화
                    $values = array(); // 값 배열 초기화

                    // 플랫폼 전체가 대상인 shop_item에 it_id로 사용할 it_id 구하기
                    sql_query(" UPDATE g5_shop_item_it_id_counter SET it_id_last = it_id_last + 1 ");
                    $it_id_last = sql_fetch(" SELECT it_id_last FROM g5_shop_item_it_id_counter ");

                    // 원격지 서버의 g5_shop_item 테이블의 it_id 컬럼이 이 서버의 g5_shop_item 테이블에 존재하지 않으면 INSERT
                    foreach ($row as $key => $value) {
                        // 각 키와 값을 사용하여 컬럼명과 값 배열을 생성
                        if ($key === 'it_id') {
                            // api를 통해 가져온 it_id값은 해당 사이트에서 사용되는 it_id이므로 여기 사이트에서의 it_id_from_api 컬럼에 저장시키고, it_id 도 insert를 위해 생성한 g5_shop_item_it_id_counter 테이블의 it_id_last 컬럼의 데이터값으로 대체함.
                            $columns[] = 'it_id';
                            $values[] = "'" . $it_id_last['it_id_last'] . "'";
                        } else if ($key === 'it_name') {
                            // api를 통해 가져온 it_name값은 해당 사이트에서 사용되는 it_name이므로 여기 사이트에서의 it_name 컬럼에 데이터값을 바꿔 저장시킴.
                            $columns[] = 'it_name';
                            $values[] = "'" . $g5['connect_db']->real_escape_string("RPC-".$it_id_last['it_id_last']) . "'";
                        } else if ($key === 'it_price') {
                            // api를 통해 가져온 it_price값은 해당 사이트에서 월요금 사용되는 it_price이므로 여기 사이트에서의 일요금으로 환산하여 it_price 컬럼에 데이터값을 바꿔 저장시킴. (30으로 나눔)
                            $columns[] = 'it_price';
                            $values[] = "'" . $g5['connect_db']->real_escape_string(round($value/30,2)) . "'";
                        } else if ($key === 'it_buy_min_qty') {
                            // api를 통해 가져온 it_buy_min_qty값은 해당 사이트에서 월단위로 사용되는 it_buy_min_qty이므로 여기 사이트에서의 일요금으로 환산하여 it_buy_min_qty 컬럼에 데이터값을 바꿔 저장시킴. (30을  곱합)
                            $columns[] = 'it_buy_min_qty';
                            $values[] = "'" . $g5['connect_db']->real_escape_string($value*30) . "'";
                        } else if ($key === 'it_buy_max_qty') {
                            // api를 통해 가져온 it_buy_max_qty값은 해당 사이트에서 월단위로 사용되는 it_buy_max_qty이므로 여기 사이트에서의 일요금으로 환산하여 it_buy_max_qty 컬럼에 데이터값을 바꿔 저장시킴. (30을  곱합)
                            $columns[] = 'it_buy_max_qty';
                            $values[] = "'" . $g5['connect_db']->real_escape_string($value*30) . "'";
                        } else if ($key === 'ca_id3') {
                            switch (substr($value,-2)) {
                                case "10":
                                    $ca_id = "10";
                                    $ca_id2 = "10";
                                    $ca_id3 = "101010";
                                    break;
                                case "20":
                                    $ca_id = "10";
                                    $ca_id2 = "10";
                                    $ca_id3 = "101020";
                                    break;
                                case "30":
                                    $ca_id = "10";
                                    $ca_id2 = "10";
                                    $ca_id3 = "101030";
                                    break;
                                case "40":
                                    $ca_id = "10";
                                    $ca_id2 = "10";
                                    $ca_id3 = "101040";
                                    break;
                                case "50":
                                    $ca_id = "10";
                                    $ca_id2 = "10";
                                    $ca_id3 = "101050";
                                    break;
                                case "60":
                                    $ca_id = "10";
                                    $ca_id2 = "10";
                                    $ca_id3 = "101060";
                                    break;
                                case "70":
                                    $ca_id = "10";
                                    $ca_id2 = "10";
                                    $ca_id3 = "101070";
                                    break;
                                case "80":
                                    $ca_id = "10";
                                    $ca_id2 = "10";
                                    $ca_id3 = "101080";
                                    break;
                                case "90":
                                    $ca_id = "10";
                                    $ca_id2 = "10";
                                    $ca_id3 = "101090";
                                    break;
                                case "a0":
                                    $ca_id = "10";
                                    $ca_id2 = "10";
                                    $ca_id3 = "1010a0";
                                    break;
                                case "b0":
                                    $ca_id = "10";
                                    $ca_id2 = "10";
                                    $ca_id3 = "1010b0";
                                    break;
                                case "c0":
                                    $ca_id = "10";
                                    $ca_id2 = "10";
                                    $ca_id3 = "1010c0";
                                    break;
                            }
                            $columns[] = 'ca_id';
                            $values[] = "'" . $g5['connect_db']->real_escape_string($ca_id) . "'";

                            $columns[] = 'ca_id2';
                            $values[] = "'" . $g5['connect_db']->real_escape_string($ca_id2) . "'";

                            $columns[] = 'ca_id3';
                            $values[] = "'" . $g5['connect_db']->real_escape_string($ca_id3) . "'";
                        } else {
                            if ($key === 'ca_id' || $key === 'ca_id2' || $key === 'ca_id3') {

                            } else {
                                $columns[] = $key;
                                $values[] = "'" . $g5['connect_db']->real_escape_string($value) . "'";
                            }
                        }
                    }

                    // api_get_remotepc 테이블에서 컴퓨터 하드웨어 스펙정보를 shop_item 테이블에도 그대로 인용하기 위해 정보 추출해 둠
                    $sql_comspec = " SELECT * FROM api_get_remotepc WHERE no = '{$it_id_from_api}' ";
                    $row_comspec = sql_fetch($sql_comspec);

                    $columns[] = 'it_id_from_api';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($row_comspec['no']) . "'";

                    $columns[] = 'it_origin_store_from_api';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($row_comspec['getsitename']."Ž".$row_comspec['M_storeid']."Ž".$row_comspec['M_storename']) . "'";

                    $columns[] = 'getsitename';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($row_comspec['getsitename']) . "'";

                    $columns[] = 'reseller_on';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($row_comspec['reseller_on']) . "'";

                    $columns[] = 'market_on';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($row_comspec['market_on']) . "'";

                    $columns[] = 'auction_on';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($row_comspec['auction_on']) . "'";

                    $columns[] = 'it_spec_sales_type';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($it_spec_sales_type) . "'"; // $it_spec_sales_type = "원격제어컴퓨터(일반)"; // 원격제어컴퓨터(일반) 또는 원격제어컴퓨터(경매)

                    $columns[] = 'pt_id';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($it_spec_partner_id) . "'"; // $it_spec_partner_id = "comviewers";

                    $columns[] = 'it_spec_partner_id';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($it_spec_partner_id) . "'"; // $it_spec_partner_id = "comviewers";

                    $columns[] = 'it_spec_app_ver';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($row_comspec['AppVer']) . "'";

                    $columns[] = 'it_spec_mgr_nickname';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($row_comspec['mgrname']) . "'";

                    $columns[] = 'it_spec_os';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($row_comspec['OperatingSystem']) . "'";

                    $columns[] = 'it_spec_mainboard';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($row_comspec['MainBoard']) . "'";

                    $columns[] = 'it_spec_cpu';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($row_comspec['CpuName']) . "'";

                    $columns[] = 'it_spec_ram';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($row_comspec['RAM'] . " GB") . "'";

                    $columns[] = 'it_spec_gpu';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($row_comspec['VideoController']) . "'";

                    $columns[] = 'it_spec_ssd';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($row_comspec['SSD'] . " GB") . "'";

                    $columns[] = 'it_spec_hdd';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($row_comspec['HDD'] . " GB") . "'";

                    $columns[] = 'it_install_price';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($row_comspec['rental_setting_fee']) . "'";

                    $columns[] = 'it_spec_keyboard';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($row_comspec['it_keyboard']) . "'";

                    $columns[] = 'it_spec_mouse';
                    $values[] = "'" . $g5['connect_db']->real_escape_string($row_comspec['it_mouse']) . "'";

                    // it_spec_remote_sw JSON 데이터 생성 {
                    $remoteData = array();
                    $remotePrograms = array('AnyDesk', 'TeamViewer');
                    $remoteIds = array($row_comspec['AnyDeskID'], $row_comspec['TeamViewerID']);
                    $remotePasswords = array($row_comspec['AnyDeskPWD'], $row_comspec['TeamViewerPWD']);
                    $extIP = explode(' ',$row_comspec["extIP"])[0];
                    $remoteIps = array($extIP, $extIP);
                    $remoteIpCountries = array();
                    $remoteIpCountryCodes = array();
                    $remoteIpCities = array();
                    $remoteIpLatitudes = array();
                    $remoteIplongitudes = array();
                    if ($extIP !== "") {
                        for ($i = 0; $i < count($remotePrograms); $i++) {
                            // db에서 국가정보 , 시티정보, 지도좌표 가져오기 { JSLEE
                            if ($i==0) {
                                $result_geoip = sql_query("
                                    SELECT
                                        blocks.latitude,
                                        blocks.longitude,
                                        locations.city_name,
                                        locations.country_name,
                                        locations.country_iso_code
                                    FROM
                                        geoip_city_blocks_ipv4 AS blocks
                                    JOIN
                                        geoip_city_locations AS locations
                                    ON
                                        blocks.geoname_id = locations.geoname_id
                                    WHERE
                                        INET6_ATON('{$extIP}') BETWEEN blocks.start_ip AND blocks.end_ip;
                                ");

                                if ($result_geoip->num_rows > 0) {
                                    $row_geoip = $result_geoip->fetch_assoc();
                                    $remoteIpCountries[$i] = $row_geoip['country_name'];
                                    $remoteIpCountryCodes[$i] = $row_geoip['country_iso_code'];
                                    $remoteIpCities[$i] = $row_geoip['city_name'];
                                    $remoteIpLatitudes[$i] = $row_geoip['latitude'];
                                    $remoteIplongitudes[$i] = $row_geoip['longitude'];
                                } else {
                                    $remoteIpCountries[$i] = '';
                                    $remoteIpCountryCodes[$i] = '';
                                    $remoteIpCities[$i] = '';
                                    $remoteIpLatitudes[$i] = '';
                                    $remoteIplongitudes[$i] = '';
                                }
                                $remoteData[] = array(
                                    'RemoteIP__'.$i => $remoteIps[$i],
                                    'RemoteIP_CountryName__'.$i => $remoteIpCountries[$i],  // IP 국가명
                                    'RemoteIP_CountryCode__'.$i => $remoteIpCountryCodes[$i],  // IP 국가명
                                    'RemoteIP_City__'.$i => $remoteIpCities[$i],  // IP city 명
                                    'RemoteIP_Latitude__'.$i => $remoteIpLatitudes[$i],  // IP 지도상 위도
                                    'RemoteIP_Longitude__'.$i => $remoteIplongitudes[$i],  // IP 지도상 경도
                                    'Program__'.$i => $remotePrograms[$i],
                                    $remotePrograms[$i].'_ID__'.$i => $remoteIds[$i],
                                    $remotePrograms[$i].'_PWD__'.$i => $remotePasswords[$i]
                                );
                            } else {
                                $remoteData[] = array(
                                    'RemoteIP__'.$i => $remoteIps[0],
                                    'RemoteIP_CountryName__'.$i => $remoteIpCountries[0],  // IP 국가명
                                    'RemoteIP_CountryCode__'.$i => $remoteIpCountryCodes[0],  // IP 국가명
                                    'RemoteIP_City__'.$i => $remoteIpCities[0],  // IP city 명
                                    'RemoteIP_Latitude__'.$i => $remoteIpLatitudes[0],  // IP 지도상 위도
                                    'RemoteIP_Longitude__'.$i => $remoteIplongitudes[0],  // IP 지도상 경도
                                    'Program__'.$i => $remotePrograms[$i],
                                    $remotePrograms[$i].'_ID__'.$i => $remoteIds[$i],
                                    $remotePrograms[$i].'_PWD__'.$i => $remotePasswords[$i]
                                );
                            }
                            // db에서 국가정보 , 시티정보, 지도좌표 가져오기 } JSLEE
                        }
                        // JSON 데이터 변환
                        $jsonData_for_it_spec_remote_sw = json_encode($remoteData, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_NUMERIC_CHECK);
                        // it_spec_remote_sw JSON 데이터 생성 }

                        $columns[] = 'it_spec_remote_sw';
                        $values[] = "'" . $g5['connect_db']->real_escape_string($jsonData_for_it_spec_remote_sw) . "'";

                        $columns[] = 'it_spec_remote_ip_country_code';
                        $values[] = "'" . $g5['connect_db']->real_escape_string($remoteIpCountryCodes[0]) . "'";
                    }

                    // 컬럼명과 값 배열을 문자열로 변환하여 쿼리 생성
                    $sql = "INSERT INTO $table_name_shopitem (" . implode(", ", $columns) . ") VALUES (" . implode(", ", $values) . ")";
                    $finished_time = date("Y-m-d H:i:s");
                    if ($g5['connect_db']->query($sql) === TRUE) {
                        echo "[INSERT] {$finished_time} : {$table_name_shopitem} 테이블에 New record created successfully" . "<br>";
                    } else {
                        echo "[INSERT] {$finished_time} : {$table_name_shopitem} 테이블에 Error: " . $sql . "<br>" . $g5['connect_db']->error . "<br>";
                    }

                    // ca_id2가 분류코드가 6자리인 경우, 재분류 시킴 (Set 순서가 바뀌면 안됨)
                    // $sql = "UPDATE g5_shop_item SET ca_id3 = LEFT(ca_id2, 6), ca_id = LEFT(ca_id2, 2), ca_id2 = LEFT(ca_id2, 4) WHERE LENGTH(ca_id2) = 6 AND it_id_from_api = '{$row_comspec['no']}'";
                    // $g5['connect_db']->query($sql);
                    // $finished_time = date("Y-m-d H:i:s");
                    // echo "##### {$finished_time} : ca_id2가 6자리인 분류를 재분류하였습니다." . "<br>";

                    // 최대구매일수 단위가 월이므로 일 단위로 환산(*30)해서 적용시킴.
                    // $sql = "UPDATE g5_shop_item SET it_buy_max_qty = it_buy_max_qty * 30, it_price = it_price WHERE it_buy_max_qty <= 3 AND it_id_from_api = '{$row_comspec['no']}'";
                    // $g5['connect_db']->query($sql);
                    // $finished_time = date("Y-m-d H:i:s");
                    // echo "##### {$finished_time} : 최대구매일수 단위를 일로 환산하여 적용하였습니다." . "<br>";

                    // 적립포인트가 10% 이하일때 10%로 변경해서 적용시킴.$it['it_point']
                    $sql = "UPDATE g5_shop_item SET it_point = 10 WHERE getsitename='$api_site' AND it_point_type='2' AND it_point < 10 AND it_id_from_api = '{$row_comspec['no']}'";
                    $g5['connect_db']->query($sql);
                    $finished_time = date("Y-m-d H:i:s");
                    echo "##### {$finished_time} : 적립포인트가 10% 이하일때 10%로 변경 적용하였습니다." . "<br>";

                }

            }

            $finished_time = date("Y-m-d H:i:s");
            echo "##### {$finished_time} : {$table_name_shopitem} 테이블에 총 " . count($data) . "건의 데이터를 기록하였습니다." . "<br>";
        }
    }
    // cURL 리소스 해제
    curl_close($ch);
} else {
    echo "유효한 it_id 값이 없습니다.<br>";
}





?>