<?php
// 파일위치 : /mylib/strongswan_profile_check_inc_language_free/strongswan_profile_check_inc_uk.php

//////////////////////////////////////////////
// Ukrainian uk
//////////////////////////////////////////////

// [Fix] 500 에러 해결: 라이브러리 참조 경로 수정 (같은 폴더 기준)
require_once('strongswan_profile_common_lib.php');

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

// [Fix] 500 에러 해결: 변수 초기화
$profiles = array();
$vpn_usage_hours = VPN_USAGE_HOURS; // 무료 사용 시간 설정 (시간 단위)
$vpn_free_active_timer = $vpn_usage_hours * 3600;

// 현재 파일의 언어 코드 설정 (기본값 en, 다른 언어 파일에서는 스크립트로 교체됨)
$current_lang = 'uk';

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 = "";
        $target_messages = []; // 메시지 저장용

        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, member_pwd 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']);

                // 오늘 날짜 0시 0분 0초 (서버 시간 기준)
                $today_midnight = strtotime(date("Y-m-d 00:00:00", G5_SERVER_TIME));

                if ($existing_expire_time < $today_midnight) {
                    // 어제 이전에 만료된 경우 -> 새로운 세션 시작 자격 있음
                    $usage_status_message = "<div style='color:skyblue;'>Розпочалася нова {$vpn_usage_hours}-годинна безкоштовна сесія.</div><br>";
                } elseif ($existing_expire_time > $current_time) {
                    // 아직 유효한 경우 (사용 중)
                    $usage_status_message = "<div style='color:skyblue;'>Ви зараз використовуєте безкоштовну сесію.</div><br>";
                } else {
                    // 오늘 0시 이후에 만료된 경우 (오늘 쿼터 소진)
                    // 다음 사용 가능 시간 포맷팅
                    $next_available_time = $today_midnight + 24 * 3600; // 내일 0시

                    // 타임존 변환
                    $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:s") . " (" . $user_timezone . " Місцевий час)";
                    } catch (Exception $e) {
                        $next_time_display = date("Y-m-d H:i:s", $next_available_time) . " (Server Time [KST])";
                    }

                    $usage_status_message = "<div style='color:purple;'>⏰ Сьогоднішній час безкоштовного використання публічного VPN закінчився.<br>Ви зможете використати його знову після " . $next_time_display . ".</div><br>";

                    // 만료 메시지 추가
                    $target_messages = [
                        [
                            "result" => "msg",
                            "id" => "{$mb_id}",
                            "title" => "Час Використання Публічного VPN Вичерпано",
                            "message" => "{$usage_status_message}"
                        ]
                    ];
                }
            } else {
                // 기록이 없는 경우 (첫 사용) -> 환영 메시지
                 $usage_status_message = "<div style='color:skyblue;'>Профіль публічного VPN зареєстровано.\nВи можете використовувати його безкоштовно {$vpn_usage_hours} години щодня.</div><br>";
            }

            // 일반 메시지 추가 (만료 메시지가 없을 때만)
            if (empty($target_messages)) {
                 $target_messages = [
                    [
                        "result" => "msg",
                        "id" => "{$mb_id}",
                        "title" => "Посібник з Публічного VPN",
                        "message" => "{$usage_status_message}"
                    ]
                ];
            }
        }

        // 각 메시지에 대해 읽음 상태 확인 후 profiles 배열에 추가
        if (isset($target_messages) && is_array($target_messages)) {
            foreach ($target_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);
}

// [Fix] Guest ID인데 회원 정보가 없는 경우 강제로 기본 프로필 생성용 정보 설정 (앱 재설치 등 상황 대응)
// 이전에 DB에 Guest 정보가 없어도 프로필은 생성되어야 함
if ((!isset($mb) || !is_array($mb)) && preg_match('/^VpNgueSt/', $mb_id)) {
    $mb = array(
        'mb_id' => $mb_id,
        'mb_no' => 'guest',
        'mb_name' => 'Guest',
        'mb_nick' => 'Guest',
        'mb_level' => 1
    );
}

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']);
        $profiles[] = array(
            "result" => "msg",
            "id" => "0",
            "title" => "Повідомлення",
            "message" => "Ваш ID заблоковано.<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']);
        $profiles[] = array(
            "result" => "msg",
            "id" => "0",
            "title" => "Повідомлення",
            "message" => "Ваш ID відкликано і він недоступний.<br>Дата: " . $date . " KST"
        );
        $good_member_flag = false;
    }

    // 데이터베이스에서 프로필 정보 조회
    if (isset($good_member_flag) && $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 (true) {
                // 무료 공공 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']);
                    $vpn_user_id = str_replace("VpNgueSt", "", $mb_id); // VPNLink-Free용 VPN서버 연결 ID (예: VpNgueStxxxxxxx)

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

                    // 기존 레코드 확인 (vpn_user_id로 조회)
                    $check_query = "SELECT member_id, member_id_expire, member_pwd FROM vpnid_free
                                   WHERE member_id = '$vpn_user_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']);

                        // 오늘 날짜 0시 0분 0초 (서버 시간 기준)
                        $today_midnight = strtotime(date("Y-m-d 00:00:00", G5_SERVER_TIME));

                        if ($existing_expire_time < $today_midnight) {
                            // 어제 이전에 만료됨 -> 새로운 날(앱이 실행되며 이력 생성 가능)
                            $need_update = true;
                            $vpn_user_pwd = uniqidrandom(mt_rand(14, 16));
                            $admin_pwd = $vpn_user_pwd;
                        } elseif ($existing_expire_time > $current_time) {
                            // 아직 만료되지 않음 (사용 중) -> 기존 정보 유지 (업데이트 X)
                            $need_update = false;
                            $vpn_user_pwd = $existing_record['member_pwd'];
                            $admin_pwd = $vpn_user_pwd;
                        } else {
                            // 오늘 0시 이후이고 현재 시간보다 이전 -> 오늘치 사용하고 만료됨
                            // [수정] 만료되었더라도 앱 목록에 표시하기 위해 프로필 정보는 유지 (갱신은 안 함)
                            $need_update = false;
                            $vpn_user_pwd = $existing_record['member_pwd'];
                            $admin_pwd = $vpn_user_pwd;
                        }
                    } else {
                        // 기록 없음 -> 신규 생성
                        $need_update = true;
                    }

                    if ($existing_record && !$need_update) {
                        // 기존 레코드가 있고 유효함 (또는 만료되었지만 오늘자 기록임)
                        $vpn_id_expire = $existing_record['member_id_expire'];
                        $query = "UPDATE vpnid_free SET
                                 update_datetime='$DATETIME',
                                 ip='$IP',
                                 device='$DEVICE'
                                 WHERE member_id='$vpn_user_id' AND server_name='$server_name'";
                    } else if ($existing_record && $need_update) {
                        // 갱신 필요 (새로운 날 시작)
                        $vpn_id_expire = date("Y-m-d H:i:s", G5_SERVER_TIME + $vpn_free_active_timer);
                        $query = "UPDATE vpnid_free SET
                                 update_datetime='$DATETIME',
                                 ip='$IP',
                                 device='$DEVICE',
                                 member_pwd='$vpn_user_pwd',
                                 member_id_expire='$vpn_id_expire',
                                 member_memo='$vpn_memo',
                                 admin_pwd='$admin_pwd'
                                 WHERE member_id='$vpn_user_id' AND server_name='$server_name'";
                    } else {
                        // 새로운 레코드 INSERT
                        $vpn_id_expire = date("Y-m-d H:i:s", G5_SERVER_TIME + $vpn_free_active_timer);
                        $query = "INSERT INTO vpnid_free SET
                                 datetime='$DATETIME',
                                 update_datetime='$DATETIME',
                                 ip='$IP',
                                 device='$DEVICE',
                                 server_name='$server_name',
                                 member_id='$vpn_user_id',
                                 member_pwd='$vpn_user_pwd',
                                 member_id_expire='$vpn_id_expire',
                                 member_memo='$vpn_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='$vpn_user_id',
                                 member_pwd='$vpn_user_pwd',
                                 member_id_expire='$vpn_id_expire',
                                 member_memo='$vpn_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 = new DateTime($vpn_id_expire, new DateTimeZone($server_timezone));
                        $datetime->setTimezone(new DateTimeZone($user_timezone));
                        $expire_time = $datetime->format("Y-m-d H:i:s") . $expire_display . "\n(" . $user_timezone . " Місцевий час)";
                    } catch (Exception $e) {
                        $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" => $vpn_user_id,
                        "setPassword" => $vpn_user_pwd
                    );

                    // IPsec Secrets 동기화
                    if ($need_update && function_exists('sync_strongswan_ipsec_secrets_vpnid')) {
                        sync_strongswan_ipsec_secrets_vpnid('free',$row_vpn_server_list_free['svr_domain'], $vpn_user_id, $vpn_user_pwd, $vpn_id_expire);
                    }

                }
            }

        } else { // 일반 회원인 경우
            // 아무것도 하지 않음
        }
    } catch (Exception $e) {
    }
}

// 메시지 목록 배열 생성 및 공지사항 읽음 상태 확인 후 공지를 또 띄울 건지 판단후 제공
if ($mb_id != "") {
    // DB에서 메시지 가져오기
    $messages = array();
    $vpn_msg_table = 'strongswan_vpn_msg';

    // 타겟 사용자 필터링 (free: 게스트 / paid: 일반회원)
    $target_condition = " AND (msg_target = 'all' ";
    if (isset($is_vpn_guest) && $is_vpn_guest) {
        $target_condition .= " OR msg_target = 'free') ";
    } else {
        $target_condition .= " OR msg_target = 'paid') ";
    }

    // 언어 필터링
    $lang_condition = " AND (msg_lang = 'all' OR msg_lang = '{$current_lang}') ";

    $current_datetime_msg = date('Y-m-d H:i:s', G5_SERVER_TIME);
    $sql_msg = "SELECT * FROM `{$vpn_msg_table}`
                WHERE msg_output = 1
                AND msg_begin_time <= '{$current_datetime_msg}'
                AND msg_end_time >= '{$current_datetime_msg}'
                {$target_condition}
                {$lang_condition}
                ORDER BY msg_order ASC, msg_id DESC";

    // 이모지 출력을 위해 utf8mb4 설정
    sql_query("set names utf8mb4");

    $result_msg = sql_query($sql_msg, false);
    if ($result_msg) {
        while ($row_msg = sql_fetch_array($result_msg)) {
            $msg_content = $row_msg['msg_content'];

            // 동영상 URL이 있으면 내용 앞에 추가
            if (!empty($row_msg['msg_video_url'])) {
                $video_url = trim($row_msg['msg_video_url']);
                $video_html = "";

                // YouTube URL인 경우 임베드 코드로 변환
                if (preg_match('/(?:youtube\.com\/(?:[^\/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\.be\/)([a-zA-Z0-9_-]{11})/i', $video_url, $matches)) {
                    $video_id = $matches[1];
                    // [수정] 앱 호환성을 위해 복잡한 CSS를 제거하고 고정 높이(height='250')와 단순한 스타일 사용
                    // playsinline=1: iOS 등에서 전체화면 대신 인라인 재생 유도
                    $video_html = "<div style='width:100%; margin-bottom:15px; text-align:center;'><iframe src='https://www.youtube.com/embed/{$video_id}?playsinline=1&rel=0&modestbranding=1' width='100%' height='250' frameborder='0' allow='accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture' allowfullscreen style='width:100%; max-width:100%;'></iframe></div>";
                }
                // 일반 동영상 파일 (mp4 등)인 경우 video 태그 사용
                else if (preg_match('/\.(mp4|webm|ogg)$/i', $video_url)) {
                    $video_html = "<div style='width:100%;margin-bottom:10px;'><video controls playsinline style='width:100%;height:auto;'><source src='{$video_url}' type='video/mp4'>Your browser does not support the video tag.</video></div>";
                }

                $msg_content = $video_html . $msg_content;
            }

            // 바로가기 링크 URL이 있으면 내용 전체를 링크로 감싸기
            if (!empty($row_msg['msg_link_url'])) {
                $link_url = trim($row_msg['msg_link_url']);
                // 스타일: block으로 만들어 내용 전체가 클릭되도록 함
                $msg_content = "<a href='{$link_url}' target='_blank' style='display:block; text-decoration:none; color:inherit;'>{$msg_content}</a>";
            }

            $messages[] = array(
                "result" => $row_msg['msg_type'],
                "id" => $row_msg['msg_id'],
                "title" => $row_msg['msg_title'],
                "message" => $msg_content
            );
        }
    }

    // 각 메시지에 대해 읽음 상태 확인
    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']
            );
        }
    }
}

// JSON 출력은 strongswan_profile_check_free.php 에서 일괄 처리
?>
