<?php
include '_common.php';
$postData = file_get_contents("php://input");

// JSON 데이터 파싱
$data = json_decode($postData, true);

// 수신된 데이터를 로그로 기록
file_record_for_log("IncomeMutongjang_SMS.json", json_encode($data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT), "w");

// 메시지 배열 추출
$smsDataArray = $data['messages'] ?? [];

// sms_date_of_utc 기준으로 정렬 (오래된 것부터 처리)
usort($smsDataArray, function($a, $b) {
    return strtotime($a['sms_date_of_utc']) - strtotime($b['sms_date_of_utc']);
});

$responses_result = [];

foreach ($smsDataArray as $smsData) {
    // 각 smsData는 JSON 문자열이므로 다시 디코딩해야 합니다.
    $messageData = $smsData; // 이미 배열로 되어있다고 가정

    file_record_for_log("smsData_SMS.json", "\n\n----" . date("Y-m-d H:i:s") . " | " . count($smsDataArray) . "----\n\n" . json_encode($messageData, JSON_UNESCAPED_UNICODE) . PHP_EOL, "a");

    // 데이터베이스에 저장 (단, 이미 존재하는 경우 update)
    $columns = implode(", ", array_keys($messageData));
    $values = implode("', '", array_map('addslashes', array_values($messageData))); // addslashes 사용

    // SQL 쿼리 작성
    // app_mutongjang_push 테이블이 존재하지 않으면 생성
    $columnsDefinition = [];
    foreach ($messageData as $key => $value) {
        $columnsDefinition[] = "`$key` VARCHAR(255)";
    }
    $columnsDefinition_data = implode(", ", $columnsDefinition);

    $createTableSql = "CREATE TABLE IF NOT EXISTS app_mutongjang_push (
        `idx` INT AUTO_INCREMENT PRIMARY KEY,
        $columnsDefinition_data,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";

    sql_query($createTableSql);

    // 중복 키가 있을 경우 업데이트할 필드 설정
    $updateFields = [];
    $sms_CheckFields = [];
    $conditionalColumns = ['sms_address', 'sms_date_of_utc', 'sms_body', 'sms_serviceCenter', 'sms_phone_number', 'sms_device_id', 'sms_device_model'];
    foreach ($messageData as $key => $value) {
        if (in_array($key, $conditionalColumns)) {
            $updateFields[] = "`$key` = IF(VALUES(`$key`) <> `$key`, VALUES(`$key`), `$key`)";
        } else {
            $updateFields[] = "`$key` = VALUES(`$key`)";
        }
        $sms_CheckFields[] = "`$key` = '$value'";
    }

    $sms_CheckFields_list = implode(" AND ", $sms_CheckFields);

    // 조건에 맞는 레코드가 있는지 확인
    $result_checkSql = sql_fetch("SELECT COUNT(*) as count FROM app_mutongjang_push WHERE " . $sms_CheckFields_list);

    file_record_for_log("sms_CheckFields_list.txt", $sms_CheckFields_list . "\n\n", "a");

    // 조건에 맞는 레코드가 없을 때만 INSERT 실행
    if ($result_checkSql['count'] == 0) {
        $sql = "INSERT INTO app_mutongjang_push ($columns) VALUES ('$values') ON DUPLICATE KEY UPDATE " . implode(", ", $updateFields);
        if (sql_query($sql) === TRUE) {
            file_record_for_log("app_mutongjang_push_insert_sql.txt", "##### DB Insert: " . $sql . "\n\n", "a");
        } else {
            file_record_for_log("app_mutongjang_push_insert_sql.txt", "##### DB Insert Error: " . $sql . "\n\n", "a");
        }
    }

    // 메시지 본문 처리
    $smsBody = $messageData['sms_body'];

    // 각 메시지에 대해 변수를 초기화
    $bankName = '';
    $firstThreeDigits = '';
    $lastThreeDigits = '';
    $payerName = '';
    $amount = '';

    // 1. 은행명 추출
    preg_match('/\[(.*?)\]/', $smsBody, $bankNameMatches);
    $bankName = $bankNameMatches[1] ?? ''; // 은행명

    // 2 & 3. 계좌번호의 처음 3자리와 마지막 3자리 추출
    preg_match('/(\d{3})\*\*\*(\d{3})/', $smsBody, $accountMatches);
    $firstThreeDigits = $accountMatches[1] ?? ''; // 계좌번호 처음 3자리
    $lastThreeDigits = $accountMatches[2] ?? ''; // 계좌번호 마지막 3자리

    // 4. 입금자명 추출
    preg_match('/\d{3}\*\*\*\d{3}\s+(.*?)\s+입금/', $smsBody, $payerMatches);
    $payerName = $payerMatches[1] ?? ''; // 입금자명

    // 5. 입금액 추출
    preg_match('/입금([\d,]+)원/', $smsBody, $amountMatches);
    $amount = str_replace(',', '', $amountMatches[1] ?? ''); // 입금액

    try {
        $sql_od = "SELECT * FROM `g5_shoppoint_order` WHERE od_fx_amount = '{$amount}' AND od_deposit_name = '{$payerName}' AND od_bank_account LIKE '%{$bankName}%{$firstThreeDigits}%{$lastThreeDigits}%'";
        $od = sql_fetch($sql_od);

        // 결과가 없을 경우
        if (!$od) {
            $log_msg = "주문확인불가(e-code 101)";
            $response = array(
                "result" => "fail",
                "od_status" => "{$log_msg}",
                "od_id" => "",
                "od_time" => "",
                "od_settle_case" => "",
                "od_bank_account" => "",
                "smsdb_payerName" => "{$payerName}",
                "smsdb_amount" => "{$amount}",
                "od_cart_price" => "",
                "od_fx_type" => "",
                "od_fx_rate" => "",
                "od_fx_amount" => "",
                "od_receipt_time" => "",
                "od_mod_history" => "",
                "od_shop_memo" => "",
                "smsdb_created_at" => "",
                "processTime" => date("Y-m-d H:i:s"),
                "sms_id" => "{$messageData['sms_id']}",
                "sms_threadId" => "{$messageData['sms_threadId']}",
                "sms_address" => "{$messageData['sms_address']}",
                "sms_date" => "{$messageData['sms_date']}",
                "sms_dateSent" => "{$messageData['sms_dateSent']}",
                "sms_device_timezone" => "{$messageData['sms_device_timezone']}",
                "sms_date_of_utc" => "{$messageData['sms_date_of_utc']}"
            );
        } else {
            // 주문정보가 있을 경우 - 입금정보 업데이트

            // adm/shop_admin/orderformreceiptupdate4shoppoint_app_mutongjang.php 파일로 POST 전송작업 {

            // include "adm/shop_admin/orderformreceiptupdate4shoppoint_app_mutongjang.php";

            // // check_admin_token();
            // $_POST['mb_id'] = "comviewers"; // 회원아이디

            // $_POST['od_id'] = "2025031112373091911"; // 주문번호
            // $od_id = $_POST['od_id'];

            // $_POST['od_fx_type'] = "KRWKRW";

            // $_POST['od_receipt_price'] = "2356";

            // $_POST['od_receipt_time'] = "2025-03-11 11:09:51";
            // $od_receipt_time = $_POST['od_receipt_time'];

            // $_POST['od_deposit_name'] = "컴뷰어SXLP";

            // $_POST['od_bank_account'] = "23937";

            // 주문정보DB가 업데이트 되었으므로 다시 불러옴
            // $sql_od = " SELECT * from `g5_shoppoint_order` WHERE od_fx_amount = '{$amount}' AND od_deposit_name = '{$payerName}' AND od_bank_account LIKE '%{$bankName}%{$firstThreeDigits}%{$lastThreeDigits}%' ";
            //$od = sql_fetch($sql_od);


            // adm/shop_admin/orderformreceiptupdate4shoppoint_app_mutongjang.php 파일로 POST 전송작업 }


            $od_mod_history = !empty($od['od_mod_history']) ? $od['od_mod_history'] : '없음';
            $od_shop_memo = !empty($od['od_shop_memo']) ? $od['od_shop_memo'] : '없음';

            $od_fx_type = substr($od['od_fx_type'], 0, 3) . "/" . substr($od['od_fx_type'], 3, 3);
            $response = array(
                "result" => "success",
                "od_status" => "{$od['od_status']}",
                "od_id" => "{$od['od_id']}",
                "od_time" => "{$od['od_time']}",
                "od_settle_case" => "{$od['od_settle_case']}",
                "od_bank_account" => "{$od['od_bank_account']}",
                "smsdb_payerName" => "{$payerName}",
                "smsdb_amount" => "{$amount}",
                "od_cart_price" => "{$od['od_cart_price']}",
                "od_fx_type" => "{$od_fx_type}",
                "od_fx_rate" => "{$od['od_fx_rate']}",
                "od_fx_amount" => "{$od['od_fx_amount']}",
                "od_receipt_time" => "{$od['od_receipt_time']}",
                "od_mod_history" => "{$od_mod_history}",
                "od_shop_memo" => "{$od_shop_memo}",
                "smsdb_created_at" => date("Y-m-d H:i:s"),
                "processTime" => date("Y-m-d H:i:s"),
                "sms_id" => "{$messageData['sms_id']}",
                "sms_threadId" => "{$messageData['sms_threadId']}",
                "sms_address" => "{$messageData['sms_address']}",
                "sms_date" => "{$messageData['sms_date']}",
                "sms_dateSent" => "{$messageData['sms_dateSent']}",
                "sms_device_timezone" => "{$messageData['sms_device_timezone']}",
                "sms_date_of_utc" => "{$messageData['sms_date_of_utc']}"
            );
        }

    } catch (Exception $e) {
        $log_msg = "주문확인불가(e-code 102)";
        $response = array(
            "result" => "fail",
            "od_status" => "{$log_msg}",
            "od_id" => "",
            "od_time" => "",
            "od_settle_case" => "",
            "od_bank_account" => "",
            "smsdb_payerName" => "{$payerName}",
            "smsdb_amount" => "{$amount}",
            "od_cart_price" => "",
            "od_fx_type" => "",
            "od_fx_rate" => "",
            "od_fx_amount" => "",
            "od_receipt_time" => "",
            "od_mod_history" => "",
            "od_shop_memo" => "",
            "smsdb_created_at" => "",
            "processTime" => date("Y-m-d H:i:s"),
            "sms_id" => "{$messageData['sms_id']}",
            "sms_threadId" => "{$messageData['sms_threadId']}",
            "sms_address" => "{$messageData['sms_address']}",
            "sms_date" => "{$messageData['sms_date']}",
            "sms_dateSent" => "{$messageData['sms_dateSent']}",
            "sms_device_timezone" => "{$messageData['sms_device_timezone']}",
            "sms_date_of_utc" => "{$messageData['sms_date_of_utc']}"
        );
    }

    $responses_result[] = $response;
}

// 최종 결과를 로그로 기록
file_record_for_log("responses_result_SMS.json", json_encode($responses_result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT) . PHP_EOL, "w");

// 최종 결과를 JSON 형식으로 출력
echo json_encode($responses_result, JSON_UNESCAPED_UNICODE);

?>

<?php
function file_record_for_log($filename, $string, $type) // $filename, $string, $type : w = 덮어쓰기, a = 추가
{
    // 디버깅용 파일에 수신받은 데이터 파일로 저장
    $filePath = "data/{$filename}";
    $directory = dirname($filePath);

    // 디렉토리가 존재하지 않으면 생성
    if (!is_dir($directory)) {
        mkdir($directory, 0777, true);
    }

    // 파일에 데이터 추가
    $file = fopen($filePath, "{$type}");
    fwrite($file, $string . PHP_EOL);
    fclose($file);
}
?>