<?php
// 파일위치 : /mylib/strongswan_extend_usage.php

//////////////////////////////////////////////
// 무료 공공 VPN 무료 사용 연장 버튼 클릭시 프로세스
//////////////////////////////////////////////

// Error reporting setup for JSON output
error_reporting(E_ALL);
ini_set('display_errors', 0);
header('Content-Type: application/json; charset=utf-8');

require_once '_common.php';
require_once('strongswan_profile_check_inc_language_free/strongswan_profile_common_lib.php');

// G5_SERVER_TIME check
if (!defined('G5_SERVER_TIME')) {
    define('G5_SERVER_TIME', time());
}

if (!function_exists('sql_fetch_array')) {
    function sql_fetch_array($result) {
        return mysqli_fetch_array($result, MYSQLI_ASSOC); // Ensure associative array
    }
}

// DB Connection
if (!isset($link) || !$link) {
    // Assuming G5 constants are defined in _common.php
    $link = sql_connect(G5_MYSQL_HOST, G5_MYSQL_USER, G5_MYSQL_PASSWORD, G5_MYSQL_DB);
}

$vpn_usage_hours = VPN_USAGE_HOURS; // 무료 사용 시간 설정 (시간 단위)
$vpn_free_active_timer = $vpn_usage_hours * 3600;

$mb_id = isset($_REQUEST['mb_id']) ? trim($_REQUEST['mb_id']) : '';
$app_language_org = isset($_REQUEST['app_language']) ? trim($_REQUEST['app_language']) : '';
$app_language = isset($_REQUEST['app_language']) ? strtolower(trim($_REQUEST['app_language'])) : '';

// [Fix] 파라미터가 없을 때 HTTP 헤더 감지 시도 (Fallback detection using HTTP headers)
if (empty($app_language) && isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
    $accept = strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']);
    // 중국어의 경우 전체 코드가 필요함 (간체/번체 구분)
    if (strpos($accept, 'zh') !== false) {
        $app_language = $accept;
    } else {
        $app_language = substr($accept, 0, 2);
    }
}
if (empty($app_language)) $app_language = 'en';

// [Fix] 언어 코드 정규화 (Normalization of language codes)
$app_language = str_replace('_', '-', $app_language); // zh_TW -> zh-tw

// 중국어 처리 로직 강화
if (strpos($app_language, 'zh') !== false) { // zh로 시작하거나 포함된 경우
    // 번체(Traditional): 대만(tw), 홍콩(hk), 마카오(mo), 번체(hant)
    if (strpos($app_language, 'tw') !== false || strpos($app_language, 'hk') !== false || strpos($app_language, 'mo') !== false || strpos($app_language, 'hant') !== false) {
        $app_language = 'zh-tw';
    }
    // 간체(Simplified): 중국본토(cn), 싱가포르(sg), 간체(hans), 기타 - 기본값
    else {
        $app_language = 'zh-cn';
    }
} else {
    // Other languages: use primary tag (e.g., ko-kr -> ko, ja-jp -> ja)
    $lang_parts = explode('-', $app_language);
    $app_language = $lang_parts[0];
}

$app_timezone = isset($_REQUEST['app_timezone']) ? trim($_REQUEST['app_timezone']) : 'Asia/Seoul';

// 클라이언트 호환성: 접두사 없이 온 경우 처리
if (!empty($mb_id) && !preg_match('/^VpNgueSt/', $mb_id)) {
    $mb_id = 'VpNgueSt' . $mb_id;
}

$response = array();

// 게스트 ID 체크
if ( preg_match('/^VpNgueSt/', $mb_id) && strlen($mb_id) > 8 ) {

    // 무료 공공 VPN 사용자인지 확인
    $check_member_id = str_replace("VpNgueSt", "", $mb_id);

    // 첫 번째 서버 기준으로 체크 (일괄 관리 가정)
    $sql_check = "SELECT * FROM `vpn_server_list_free` WHERE enable = 1 ORDER BY no ASC LIMIT 1";
    $result_check = sql_query($sql_check);
    $first_server = sql_fetch_array($result_check);

    if ($first_server) {
        $check_server_name = trim($first_server['svr_domain']);

        $check_query = "SELECT vpn_id_expire, update_datetime, datetime FROM vpnid_free
                       WHERE vpn_user_id = '$check_member_id' AND server_name = '$check_server_name'";
        $check_result = mysqli_query($link, $check_query);
        $check_record = mysqli_fetch_assoc($check_result);

        if ($check_record) {
            $current_time = time();
            $existing_expire_time = strtotime($check_record['vpn_id_expire']);

            // 마지막 갱신 시간 (사용 시작 시간으로 추정)
            // update_datetime이 있으면 그것을 사용, 없으면 datetime
            $start_time = strtotime($check_record['update_datetime']);
            if (!$start_time) $start_time = strtotime($check_record['datetime']);

            // 만료 여부 확인
            if ($existing_expire_time <= $current_time) {
                // 만료됨. 재사용 가능 여부 체크 (24시간 경과 또는 00시 초기화 정책)
                // 정책: "유효기간은 매일 0시에 자동 연장 됩니다." -> 즉, 하루가 지나면 초기화

                $today_midnight = strtotime('today midnight');

                // 만료 시간이 오늘 0시 이전인 경우 -> 어제 사용하고 만료됨 -> 오늘 사용 가능
                // 또는 단순 24시간 룰? "매일 0시"라고 했음.

                // 여기서는 "오늘 이미 사용했는지"를 판단해야 함.
                // 만료시간이 오늘 0시 이후라면 -> 오늘 사용한 것.

                if ($existing_expire_time > $today_midnight) {
                    // 오늘 사용하고 만료됨 -> 연장 불가
                    $response['status'] = 'fail';
                    if ($app_language == 'ko') $title = "무료 사용이 만료되었습니다";
                    else if ($app_language == 'ja') $title = "無料使用が終了しました";
                    else if ($app_language == 'zh-cn') $title = "免费使用已结束";
                    else if ($app_language == 'zh-tw') $title = "免費使用已結束";
                    else if ($app_language == 'de') $title = "Kostenlose Nutzung abgelaufen";
                    else if ($app_language == 'pl') $title = "Bezpłatne użycie wygasło";
                    else if ($app_language == 'ru') $title = "Бесплатное использование истекло";
                    else if ($app_language == 'uk') $title = "Безкоштовне використання закінчилося";
                    else if ($app_language == 'vi') $title = "Hết hạn sử dụng miễn phí";
                    else if ($app_language == 'pt-br') $title = "O uso gratuito expirou";
                    else if ($app_language == 'pt-pt') $title = "O uso gratuito expirou";
                    else if ($app_language == 'es-es') $title = "El uso gratuito ha expirado";
                    else $title = "Free Usage Expired";
                    $response['title'] = $title;

                    $server_timezone = 'Asia/Seoul';
                    // $app_timezone is already set at the top

                    try {
                        $datetime = new DateTime(date('Y-m-d H:i:s', $today_midnight + 24 * 3600), new DateTimeZone($server_timezone));
                        $datetime->setTimezone(new DateTimeZone($app_timezone));
                        $next_available = $datetime->format("Y-m-d H:i") . " (" . $app_timezone . " " . ($app_language == 'ko' ? '현지시각 기준' : 'local time') . ")";
                    } catch (Exception $e) {
                        $next_available = date("Y-m-d H:i", $today_midnight + 24 * 3600) . " (" . $server_timezone . ")";
                    }

                    // Calculate remaining time
                    $next_available_timestamp = $today_midnight + 24 * 3600;
                    $remaining_seconds = $next_available_timestamp - $current_time + 60; // +1분 (사용자 혼동 방지)

                    $hours_left = floor($remaining_seconds / 3600);
                    $minutes_left = floor(($remaining_seconds % 3600) / 60);

                    $remaining_text_ko = "";
                    if ($hours_left > 0) $remaining_text_ko .= $hours_left . "시간 ";
                    $remaining_text_ko .= $minutes_left . "분";

                    $msg_ko = "이미 오늘의 무료 사용 시간(" . $vpn_usage_hours . "시간)을 모두 사용하셨습니다.\n" . $next_available . " 이후에 다시 무료로 사용하실 수 있습니다.\n(약 " . $remaining_text_ko . " 남음)\n\n기다리지 않고 즉시 사용하시려면 유료 회원으로 전환해 보세요.";
                    $msg_en = "You have already used your free VPN time (" . $vpn_usage_hours . " hours) for today.\nYou can use it again after " . $next_available . ".\n\nSwitch to paid membership to use immediately without waiting.";
                    $msg_ja = "今日の無料使用時間（" . $vpn_usage_hours . "時間）はすでに終了しました。\n" . $next_available . "以降に再度無料でご利用いただけます。\n\n待ち時間なしで今すぐ使用するには、有料会員に切り替えてください。";
                    $msg_zh_cn = "您今天的免费VPN时间（" . $vpn_usage_hours . "小时）已用完。\n您可以在 " . $next_available . " 之后再次免费使用。\n\n切换到付费会员即可立即使用，无需等待。";
                    $msg_zh_tw = "您今天的免費VPN時間（" . $vpn_usage_hours . "小時）已用完。\n您可以在 " . $next_available . " 之後再次免費使用。\n\n切換到付費會員即可立即使用，無需等待。";
                    $msg_de = "Sie haben Ihre kostenlose VPN-Zeit (" . $vpn_usage_hours . " Stunden) für heute bereits verbraucht.\nSie können es nach " . $next_available . " wieder verwenden.\n\nWechseln Sie zur kostenpflichtigen Mitgliedschaft, um sofort ohne Wartezeit fortzufahren.";
                    $msg_pl = "Wykorzystałeś już swój darmowy czas VPN (" . $vpn_usage_hours . " godzin) na dziś.\nMożesz skorzystać ponownie po " . $next_available . ".\n\nPrzejdź na płatne członkostwo, aby korzystać natychmiast bez czekania.";
                    $msg_ru = "Вы уже использовали свое бесплатное время VPN (" . $vpn_usage_hours . " часа) на сегодня.\nВы сможете использовать его снова после " . $next_available . ".\n\nПерейдите на платную подписку, чтобы использовать немедленно без ожидания.";
                    $msg_uk = "Ви вже використали свій безкоштовний час VPN (" . $vpn_usage_hours . " години) на сьогодні.\nВи зможете використовувати його знову після " . $next_available . ".\n\nПерейдіть на платну підписку, щоб використовувати негайно без очікування.";
                    $msg_vi = "Bạn đã sử dụng hết thời gian VPN miễn phí (" . $vpn_usage_hours . " giờ) cho hôm nay.\nBạn có thể sử dụng lại sau " . $next_available . ".\n\nChuyển sang thành viên trả phí để sử dụng ngay lập tức mà không cần chờ đợi.";

                    if ($app_language == 'ko') $msg = $msg_ko;
                    else if ($app_language == 'ja') $msg = $msg_ja;
                    else if ($app_language == 'zh-cn') $msg = $msg_zh_cn;
                    else if ($app_language == 'zh-tw') $msg = $msg_zh_tw;
                    else if ($app_language == 'de') $msg = $msg_de;
                    else if ($app_language == 'pl') $msg = $msg_pl;
                    else if ($app_language == 'ru') $msg = $msg_ru;
                    else if ($app_language == 'uk') $msg = $msg_uk;
                    else if ($app_language == 'vi') $msg = $msg_vi;
                    else $msg = $msg_en;

                    $response['message'] = $msg;
                    $response['action'] = 'suggest_paid'; // 안드로이드 앱에서 처리할 액션 힌트
                } else {
                    // 만료시간이 오늘 0시 이전임 -> 오늘 아직 사용 안함 (또는 리셋됨) -> 연장(갱신) 가능
                    // 사실 이 경우 앱을 켜면 자동으로 갱신되어야 하지만, 버튼을 눌러서 강제로 할 수도 있음.

                    // 연장 처리 진행
                    $new_expire = date("Y-m-d H:i:s", $current_time + $vpn_free_active_timer);
                    $new_pwd = uniqidrandom(mt_rand(14, 16));
                    $datetime = date("Y-m-d H:i:s");
                    $ip = $_SERVER['REMOTE_ADDR'];
                    $device = $_SERVER['HTTP_USER_AGENT'];

                    $update_query = "UPDATE vpnid_free SET
                                     update_datetime='$datetime',
                                     ip='$ip',
                                     device='$device',
                                     vpn_user_pwd='$new_pwd',
                                     admin_pwd='$new_pwd',
                                     vpn_id_expire='$new_expire'
                                     WHERE vpn_user_id='$check_member_id' AND server_name='$check_server_name'";
                    sql_query($update_query);

                    // 로그
                    // ... (로그 생략 가능하지만 넣으면 좋음)

                    // 서버 동기화 필요 (ipsec.secrets) - 기존 라이브러리 함수 활용
                    sync_strongswan_ipsec_secrets_vpnid('free', $check_server_name, $check_member_id, $new_pwd, $new_expire);

                    $response['status'] = 'success';
                    if ($app_language == 'ko') $title = "무료 사용이 연장되었습니다";
                    else if ($app_language == 'ja') $title = "無料使用が延長されました";
                    else if ($app_language == 'zh-cn') $title = "免费使用已延长";
                    else if ($app_language == 'zh-tw') $title = "免費使用已延長";
                    else if ($app_language == 'de') $title = "Kostenlose Nutzung verlängert";
                    else if ($app_language == 'pl') $title = "Bezpłatne użycie przedłużone";
                    else if ($app_language == 'ru') $title = "Бесплатное использование продлено";
                    else if ($app_language == 'uk') $title = "Безкоштовне використання продовжено";
                    else if ($app_language == 'vi') $title = "Đã gia hạn sử dụng miễn phí";
                    else $title = "Free usage extended";
                    $response['title'] = $title;

                    if ($app_language == 'ko') $message = "오늘의 무료 사용 시간({$vpn_usage_hours}시간)이 시작되었습니다.";
                    else if ($app_language == 'ja') $message = "今日の無料使用時間（{$vpn_usage_hours}時間）が開始されました。";
                    else if ($app_language == 'zh-cn') $message = "您今天的免费使用时间（{$vpn_usage_hours}小时）已开始。";
                    else if ($app_language == 'zh-tw') $message = "您今天的免費VPN時間（{$vpn_usage_hours}小時）已開始。";
                    else if ($app_language == 'de') $message = "Ihre kostenlose Nutzung ({$vpn_usage_hours} Stunden) für heute hat begonnen.";
                    else if ($app_language == 'pl') $message = "Rozpoczęto darmowe korzystanie ({$vpn_usage_hours} godzin) na dziś.";
                    else if ($app_language == 'ru') $message = "Ваше бесплатное использование ({$vpn_usage_hours} часа) на сегодня началось.";
                    else if ($app_language == 'uk') $message = "Ваше безкоштовне використання ({$vpn_usage_hours} години) на сьогодні розпочалося.";
                    else if ($app_language == 'vi') $message = "Thời gian sử dụng miễn phí ({$vpn_usage_hours} giờ) của bạn cho hôm nay đã bắt đầu.";
                    else $message = "Your free usage ({$vpn_usage_hours} hours) for today has started.";
                    $response['message'] = $message;
                    $response['new_expiry'] = $new_expire; // 만료 시간 반환
                    $response['new_password'] = $new_pwd; // 새 비밀번호
                }
            } else {
                // 아직 만료되지 않음
                // 연장이 필요한가?
                // 만약 남은 시간이 얼마 안남았다면?
                // "무료 사용 연장" 버튼은 "시간을 더 달라"는 의미일 수 있지만, 1일 2시간 제한이라면
                // 현재 시간이 지나가지 않는 한 추가 연장은 불가.
                // 2시간 제한 안에서 갱신하는 개념이라면 위 로직으로 덮어써지겠지만,
                // "하루 2시간" 정책이라면, 현재 유효한 세션이 있다면 거기서 끝임.

                // 남은 시간 계산 (+1분 사용자 혼동 방지)
                $remaining_seconds = $existing_expire_time - $current_time + 60;
                $hours_left = floor($remaining_seconds / 3600);
                $minutes_left = floor(($remaining_seconds % 3600) / 60);

                $remaining_text_ko = "";
                if ($hours_left > 0) $remaining_text_ko .= $hours_left . "시간 ";
                $remaining_text_ko .= $minutes_left . "분";

                $remaining_text_en = "";
                if ($hours_left > 0) $remaining_text_en .= $hours_left . "h ";
                $remaining_text_en .= $minutes_left . "m";

                $response['status'] = 'info';
                if ($app_language == 'ko') $title = "알림";
                else if ($app_language == 'ja') $title = "お知らせ";
                else if ($app_language == 'zh-cn') $title = "公告";
                else if ($app_language == 'zh-tw') $title = "公告";
                else if ($app_language == 'de') $title = "Benachrichtigung";
                else if ($app_language == 'pl') $title = "Powiadomienie";
                else if ($app_language == 'ru') $title = "Уведомление";
                else if ($app_language == 'uk') $title = "Повідомлення";
                else if ($app_language == 'vi') $title = "Thông báo";
                else $title = "Notification";
                $response['title'] = $title;

                // Ensure expiry matches DB exactly
                // Use the raw DB value to avoid any parsing/formatting discrepancies
                if (!empty($check_record['vpn_id_expire'])) {
                     $response['new_expiry'] = $check_record['vpn_id_expire'];
                } else {
                     $response['new_expiry'] = "";
                }

                $response['new_password'] = $check_record['vpn_user_pwd'];

                if ($app_language == 'ko') {
                    $response['message'] = "현재 무료 사용 시간이 적용 중입니다.\n시간이 모두 소진된 후 연장해 주세요.\n(약 " . $remaining_text_ko . " 남음)";
                } else if ($app_language == 'ja') {
                    $response['message'] = "現在、無料使用時間が有効です。\n（残り約 " . $remaining_text_en . "）";
                } else if ($app_language == 'zh-cn') {
                    $response['message'] = "当前正在使用免费时间。\n（约剩余 " . $remaining_text_en . "）";
                } else if ($app_language == 'zh-tw') {
                    $response['message'] = "當前正在使用免費時間。\n（約剩餘 " . $remaining_text_en . "）";
                } else if ($app_language == 'de') {
                    $response['message'] = "Die kostenlose Nutzungszeit ist derzeit aktiv.\n(Ca. " . $remaining_text_en . " verbleibend)";
                } else if ($app_language == 'pl') {
                    $response['message'] = "Czas darmowego korzystania jest obecnie aktywny.\n(Pozostało ok. " . $remaining_text_en . ")";
                } else if ($app_language == 'ru') {
                    $response['message'] = "Бесплатное время использования в данный момент активно.\n(Осталось ок. " . $remaining_text_en . ")";
                } else if ($app_language == 'uk') {
                    $response['message'] = "Безкоштовний час використання в даний момент активний.\n(Залишилось бл. " . $remaining_text_en . ")";
                } else if ($app_language == 'vi') {
                    $response['message'] = "Thời gian sử dụng miễn phí đang hoạt động.\n(Còn lại khoảng " . $remaining_text_en . ")";
                } else {
                    $response['message'] = "Free usage time is currently active.\n(Approx. " . $remaining_text_en . " remaining)";
                }
            }
        } else {
            $response['status'] = 'error';
            $response['message'] = 'User record not found.';
        }
    } else {
        $response['status'] = 'error';
        $response['message'] = 'Server not found.';
    }
} else {
    $response['status'] = 'error';
    $response['message'] = 'Invalid request.';
}

echo json_encode($response);
?>
