<?php
//////////////////////////////////////////////
// 한국어 ko
//////////////////////////////////////////////

require_once('strongswan_profile_common_lib.php');

// G5_SERVER_TIME 상수 체크
if (!defined('G5_SERVER_TIME')) {
    define('G5_SERVER_TIME', time());
}

$vpn_free_active_timer = 2 * 3600; // 24시간 이내 무료 공공 VPN 서비스 이용자 ID의 기본 활성 시간 (초 단위, 예: 2시간)

if ( preg_match('/^VpNgueSt/', $mb_id) && strlen($mb_id) > 8 && $app_language != '' ) {

    $is_vpn_guest = true;

    // 실제 비교에 사용할 비밀번호(처음 8자 제외)
    $mb_password_real = substr($mb_password, 8);

    $mb = sql_fetch("SELECT * FROM `g5_member_for_vpn_guest` WHERE mb_id = '{$mb_id}' ", false);

    // 무료 공공 VPN 서비스 이용자 ID인 경우 추가 처리
    try {
        // 기존 사용 이력 확인 (첫 번째 서버 기준으로 체크)
        $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);

        $usage_status_message = "";

        if ($first_server) {
            $check_member_id = str_replace("VpNgueSt", "", $mb_id);
            $check_server_name = trim($first_server['svr_domain']);

            $check_query = "SELECT member_id_expire FROM vpnid_free
                           WHERE member_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['member_id_expire']);
                $time_diff_hours = ($current_time - $existing_expire_time + $vpn_free_active_timer) / 3600;

                // 2시간 경과했지만 24시간이 안 된 경우
                if ($existing_expire_time <= $current_time && $time_diff_hours < 24) {
                    $next_available_time = $existing_expire_time + 24 * 3600 - $vpn_free_active_timer; // 24시간 후 - 2시간

                    // 타임존 변환
                    $server_timezone = 'Asia/Seoul';
                    $user_timezone = isset($app_timezone) ? $app_timezone : 'Asia/Seoul';

                    try {
                        $datetime = new DateTime(date('Y-m-d H:i:s', $next_available_time), new DateTimeZone($server_timezone));
                        $datetime->setTimezone(new DateTimeZone($user_timezone));
                        $next_time_display = $datetime->format("Y-m-d H:i") . " (" . $user_timezone . " 현지시각 기준)";
                    } catch (Exception $e) {
                        $next_time_display = date("Y-m-d H:i", $next_available_time) . " (서버시간[KST] 기준)";
                    }

                    $usage_status_message = "<div style='color:purple;'>⏰ 오늘 공공VPN 무료 2시간 사용시간이 초과되었습니다.<br>" . $next_time_display . " 이후에 다시 사용가능 합니다.</div><br>";
                    // 무료 공공 VPN 서비스 이용자 ID인 경우 공공VPN이용안내 (사용 완료 안내)
                    $messages = [
                        [
                            "result" => "msg",
                            "id" => "{$mb_id}",
                            "title" => "공공VPN 오늘 사용시간 초과안내",
                            "message" => "{$usage_status_message}"
                        ]
                    ];

                } else {
                    // 무료 공공 VPN 서비스 이용자 ID인 경우 공공VPN이용안내
                    $usage_status_message = "<div style='color:skyblue;'>공공VPN 프로필이 자동으로 등록되었습니다.\nVPNLink-Free 표시부분을 클릭하시면 자동으로 연결됩니다.\n매일 2시간 무료로 이용하실 수 있습니다. (24시간마다 초기화되므로 매일 2시간씩 무료이용)\n모든 공공VPN 이용자의 쾌적한 사용을 위해 과도한 사용은 자제해 주세요.</div><br>";
                    $messages = [
                        [
                            "result" => "msg",
                            "id" => "{$mb_id}",
                            "title" => "공공VPN 이용안내",
                            "message" => "{$usage_status_message}"
                        ]
                    ];
                }
            }
        }



        // 각 메시지에 대해 읽음 상태 확인
        foreach ($messages as $msg) {
            $profiles[] = array(
                "result" => $msg['result'],
                "id" => $msg['id'],
                "title" => $msg['title'],
                "message" => $msg['message']
            );
        }

    } catch (Exception $e) {

        // 오류 발생 시 알림 반환
        $profiles[] = array(
            "result" => "msg",
            "message" => "<div style='color:red;font-size:20px;'>오류 발생으로 프로필이 업데이트 되지 않았습니다.</div>"
            );

    }

} else {
    // 회원 정보 조회
    $mb = get_member($mb_id);
}

if (isset($mb) && is_array($mb)) {
    // 차단된 아이디인가?
    if (isset($mb['mb_intercept_date']) && $mb['mb_intercept_date'] && $mb['mb_intercept_date'] <= date("Ymd", G5_SERVER_TIME)) {
        // $date = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})/", "\\1년 \\2월 \\3일", $mb['mb_intercept_date']);
        $date = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})/", "$1-$2-$3", $mb['mb_intercept_date']);
        $profiles[] = array(
            "result" => "msg",
            "id" => "0",
            "title" => "알림",
            "message" => "회원님의 아이디는 접근이 금지되어 있습니다.<br>처리일 : " . $date . " KST"
        );
        $good_member_flag = false;
    }

    // 탈퇴한 아이디인가?
    if (isset($mb['mb_leave_date']) && $mb['mb_leave_date'] && $mb['mb_leave_date'] <= date("Ymd", G5_SERVER_TIME)) {
        // $date = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})/", "\\1년 \\2월 \\3일", $mb['mb_leave_date']);
        $date = preg_replace("/([0-9]{4})([0-9]{2})([0-9]{2})/", "$1-$2-$3", $mb['mb_leave_date']);
        $profiles[] = array(
            "result" => "msg",
            "id" => "0",
            "title" => "알림",
            "message" => "탈퇴한 아이디이므로 접근하실 수 없습니다.<br>탈퇴일 : " . $date . " KST"
        );
        $good_member_flag = false;
    }

    // 데이터베이스에서 프로필 정보 조회
    if ($good_member_flag === false) {
        // 불량 회원인 경우 JSON 출력 후 종료
        echo json_encode($profiles);
        exit;
    }

    try {

        // mb_no 키 존재 확인
        $mb_no = isset($mb['mb_no']) ? $mb['mb_no'] : 'unknown';

        if (preg_match('/^VpNgueSt/', $mb_id)) { // 무료 공공 VPN 서비스 이용자 ID인 경우

            // 무료 공공 VPN 서비스 이용자 ID인 경우 프로필에 Free 포함해서 제공
            if (trim($mb_no) != "" && $mb_no != "0" && $mb_no != "unknown") {
                // 무료 공공 VPN 서비스 이용자 ID인 경우 추가 처리
                $sql_vpn_server_list_free = "SELECT * FROM `vpn_server_list_free` WHERE enable = 1 ORDER BY no ASC ";
                $result_vpn_server_list_free = sql_query($sql_vpn_server_list_free);
                for($i=0; $row_vpn_server_list_free=sql_fetch_array($result_vpn_server_list_free); $i++) {
                    // 무료 공공 VPN ID 발급후 암호와 함께 프로필에 포함해서 제공
                    /////////////////// DB에 저장 [[
                    $DATETIME = date("Y-m-d H:i:s");
                    $IP = $_SERVER['REMOTE_ADDR'];
                    $DEVICE = $_SERVER['HTTP_USER_AGENT'];
                    $server_name = trim($row_vpn_server_list_free['svr_domain']);
                    $remark = trim($row_vpn_server_list_free['svr_name']);
                    $member_id = str_replace("VpNgueSt", "", $mb_id); // VPNLink-Free용 VPN서버 연결 ID (예: VpNgueStxxxxxxx)

                    $member_pwd = uniqidrandom(mt_rand(14, 16)); // 새로운 비밀번호 생성 (14~16자리 랜덤)
                    $member_id_expire = ""; // 조건에 따라 설정됨
                    $member_memo = $mb['mb_no'] . "Ž" . $mb['mb_name'] . "Ž" . $mb['mb_nick'];
                    $process_type = "StrongSwan IKEv2";
                    $admin_id = $member_id; // 관리자 ID는 앱에서 자동 처리되므로 사용자 ID와 동일하게 설정
                    $admin_pwd = $member_pwd; // 관리자 암호는 앱에서 자동 처리되므로 사용자 암호와 동일하게 설정

                    // 기존 레코드 확인 (member_id로 조회)
                    $check_query = "SELECT member_id, member_id_expire, member_pwd, DATE(member_id_expire) as expire_date
                                   FROM vpnid_free
                                   WHERE member_id = '$member_id' AND server_name = '$server_name'";
                    $check_result = mysqli_query($link, $check_query);
                    $existing_record = mysqli_fetch_assoc($check_result);

                    $current_time = time();
                    $need_update = false;

                    if ($existing_record) {
                        // 기존 레코드가 있는 경우
                        $existing_expire_time = strtotime($existing_record['member_id_expire']);

                        // 24시간 경과 체크: 만료시간이 현재시간보다 이전이거나, 마지막 갱신으로부터 24시간이 지났는지 확인
                        $time_diff_hours = ($current_time - $existing_expire_time + $vpn_free_active_timer) / 3600; // 2시간을 더해서 실제 시작시간 기준으로 계산

                        if ($existing_expire_time <= $current_time || $time_diff_hours >= 24) {
                            $need_update = true;
                            $member_pwd = uniqidrandom(mt_rand(14, 16)); // 새로운 비밀번호 생성 (14~16자리 랜덤)
                            $admin_pwd = $member_pwd;
                        } else {
                            // 아직 24시간이 안 지났고 유효한 경우, 기존 값 사용
                            $member_pwd = $existing_record['member_pwd'];
                            $admin_pwd = $member_pwd;
                        }
                    } else {
                        $need_update = false; // 새로 INSERT
                    }

                    if ($existing_record && !$need_update) {
                        // 기존 레코드가 있고 오늘 이미 갱신했으며 아직 유효한 경우 - 업데이트 없이 기존 값 사용
                        $member_id_expire = $existing_record['member_id_expire']; // 기존 만료시간 사용
                        $query = "UPDATE vpnid_free SET
                                 update_datetime='$DATETIME',
                                 ip='$IP',
                                 device='$DEVICE'
                                 WHERE member_id='$member_id' AND server_name='$server_name'";
                    } else if ($existing_record && $need_update) {
                        // 기존 레코드가 있고 갱신이 필요한 경우 - member_pwd와 expire 시간 업데이트
                        $member_id_expire = date("Y-m-d H:i:s", G5_SERVER_TIME + $vpn_free_active_timer); // 새로운 2시간 후 만료
                        $query = "UPDATE vpnid_free SET
                                 update_datetime='$DATETIME',
                                 ip='$IP',
                                 device='$DEVICE',
                                 member_pwd='$member_pwd',
                                 member_id_expire='$member_id_expire',
                                 member_memo='$member_memo',
                                 admin_pwd='$admin_pwd'
                                 WHERE member_id='$member_id' AND server_name='$server_name'";
                    } else {
                        // 새로운 레코드 INSERT
                        $member_id_expire = date("Y-m-d H:i:s", G5_SERVER_TIME + $vpn_free_active_timer); // 새로운 2시간 후 만료
                        $query = "INSERT INTO vpnid_free SET
                                 datetime='$DATETIME',
                                 update_datetime='$DATETIME',
                                 ip='$IP',
                                 device='$DEVICE',
                                 server_name='$server_name',
                                 member_id='$member_id',
                                 member_pwd='$member_pwd',
                                 member_id_expire='$member_id_expire',
                                 member_memo='$member_memo',
                                 admin_id='$admin_id',
                                 admin_pwd='$admin_pwd',
                                 remark='$remark'";
                    }

                    unset($QueryResult);
                    $QueryResult = mysqli_query($link, $query);

                    // 로그 테이블은 항상 INSERT (이력 관리용)
                    $log_query = "INSERT INTO vpnid_log_free SET
                                 datetime='$DATETIME',
                                 update_datetime='$DATETIME',
                                 ip='$IP',
                                 device='$DEVICE',
                                 server_name='$server_name',
                                 member_id='$member_id',
                                 member_pwd='$member_pwd',
                                 member_id_expire='$member_id_expire',
                                 member_memo='$member_memo',
                                 process_type='$process_type',
                                 admin_id='$admin_id',
                                 admin_pwd='$admin_pwd',
                                 remark='$remark'";
                    unset($LogResult);
                    $LogResult = mysqli_query($link, $log_query);
                    /////////////////// DB에 저장 ]]


                    // 만료 시간을 타임존에 맞게 변환하여 표시
                    $server_timezone = 'Asia/Seoul'; // 서버 기본 타임존
                    $user_timezone = isset($app_timezone) ? $app_timezone : 'Asia/Seoul'; // 사용자 타임존

                    $expire_display = " 까지 사용가능";

                    try {
                        // DateTime 객체 생성 (서버 타임존 기준)
                        $datetime = new DateTime($member_id_expire, new DateTimeZone($server_timezone));
                        // 사용자 타임존으로 변환
                        $datetime->setTimezone(new DateTimeZone($user_timezone));
                        // 변환된 시간 포맷
                        $expire_time = $datetime->format("Y-m-d H:i") . $expire_display . "\n(" . $user_timezone . " 현지시각 기준)";
                    } catch (Exception $e) {
                        // 타임존 변환 실패 시 기본값 사용
                        // $expire_time = date("Y-m-d H:i", strtotime($member_id_expire)) . $expire_display . "\n(" . $user_timezone . " 현지시각 기준)";
                        $expire_time = "만료일 추출 오류";
                    }

                    $profiles[] = array(
                        "result" => "success",
                        "setName" => $row_vpn_server_list_free['svr_name'] . "-" . $row_vpn_server_list_free['country_name'] . "\n" . $expire_time,
                        "setGateway" => $row_vpn_server_list_free['svr_domain'],
                        "setUsername" => $member_id,
                        "setPassword" => $member_pwd
                    );

                    // 실제 무료 공공 VPN 서비스 이용자 ID를 서버의 /strongswan/ipsec.secrets 파일내용에 동기화
                    if (sync_strongswan_ipsec_secrets_vpnid('free',$row_vpn_server_list_free['svr_domain'], $member_id, $member_pwd, $member_id_expire)) {
                        // 동기화 성공 시 별도 처리 없음
                    } else {
                        // 동기화 실패 시 도 처리 없음
                    }

                }
            }

        } else { // 일반 회원인 경우

            if (trim($mb_no) != "" && $mb_no != "0" && $mb_no != "unknown") {
                // 일반 VPN 서비스 이용자 ID인 경우 추가 처리
                $sql_vpnid_list = "SELECT * FROM `vpnid_list` WHERE member_id = '$mb_id' AND enable = 1 ORDER BY no ASC ";
                $result_vpnid_list = sql_query($sql_vpnid_list);
                for($i=0; $row_vpnid_list=sql_fetch_array($result_vpnid_list); $i++) {

                    // 만료 시간을 타임존에 맞게 변환하여 표시
                    $server_timezone = 'Asia/Seoul'; // 서버 기본 타임존
                    $user_timezone = isset($app_timezone) ? $app_timezone : 'Asia/Seoul'; // 사용자 타임존

                    $member_id_expire = $row_vpnid_list['member_id_expire'];
                    $member_id = $row_vpnid_list['member_id'];

                    $expire_display = " 까지 사용가능";

                    try {
                        // DateTime 객체 생성 (서버 타임존 기준)
                        $datetime = new DateTime($member_id_expire, new DateTimeZone($server_timezone));
                        // 사용자 타임존으로 변환
                        $datetime->setTimezone(new DateTimeZone($user_timezone));
                        // 변환된 시간 포맷
                        $expire_time = $datetime->format("Y-m-d H:i") . $expire_display . "\n(" . $user_timezone . " 현지시각 기준)";
                    } catch (Exception $e) {
                        // 타임존 변환 실패 시 기본값 사용
                        $expire_time = date("Y-m-d H:i", strtotime($member_id_expire)) . $expire_display . "\n(" . $user_timezone . " 현지시각 기준)";
                    }

                    $profiles[] = array(
                        "result" => "success",
                        "setName" => "VPNLink" . "-" . $row_vpnid_list['country_name'] . "-" . $row_vpnid_list['no'] . "\n" . $expire_time,
                        "setGateway" => $row_vpnid_list['server_name'],
                        "setUsername" => $member_id,
                        "setPassword" => $member_pwd
                    );

                    // 실제 유료 VPN 서비스 이용자 ID를 서버의 /strongswan/ipsec.secrets 파일내용에 동기화
                    if (sync_strongswan_ipsec_secrets_vpnid('paid',$row_vpn_server_list_free['svr_domain'], $member_id, $member_pwd, $member_id_expire)) {
                        // 동기화 성공 시 별도 처리 없음
                    } else {
                        // 동기화 실패 시 도 처리 없음
                    }

                }

            }

        }
    } catch (Exception $e) {


    }

}



// 메시지 목록 배열 생성 및 공지사항 읽음 상태 확인 후 공지를 또 띄울 건지 판단후 제공
if ($mb_id != "") {
    $messages = [
        [
            "result" => "msg",
            "id" => "112",
            "title" => "알림",
            "message" => "<div style='color:skyblue;'>알림 테스트 입니다. ({$app_language})</div>"
        ],
        [
            "result" => "msg",
            "id" => "113",
            "title" => "공지",
            "message" => "<div style='color:orangered;'>공지 테스트 입니다.</div>"
        ]
    ];

    // 각 메시지에 대해 읽음 상태 확인
    if (isset($link) && is_object($link)) {
        foreach ($messages as $msg) {
            try {
                $stmt = $link->prepare("
                    SELECT dont_show_again
                    FROM strongswan_user_message_read_status_flag
                    WHERE mb_id = ? AND msg_id = ? AND dont_show_again = 1
                ");

                if ($stmt && $stmt->execute([$mb_id, $msg['id']])) {
                    $readStatus = $stmt->fetch();

                    // dont_show_again이 1이면 추가하지 않음
                    if ($readStatus) {
                        continue;
                    }
                }

                $profiles[] = array(
                    "result" => $msg['result'],
                    "id" => $msg['id'],
                    "title" => $msg['title'],
                    "message" => $msg['message']
                );
            } catch (Exception $e) {
                // 데이터베이스 오류 시에도 메시지는 표시
                $profiles[] = array(
                    "result" => $msg['result'],
                    "id" => $msg['id'],
                    "title" => $msg['title'],
                    "message" => $msg['message']
                );
            }
        }
    } else {
        // $link가 없으면 모든 메시지 표시
        foreach ($messages as $msg) {
            $profiles[] = array(
                "result" => $msg['result'],
                "id" => $msg['id'],
                "title" => $msg['title'],
                "message" => $msg['message']
            );
        }
    }
} else {

}



?>