<?php
if (!class_exists('PPO_Vip')) {

    class PPO_Vip {

        public function __construct(){
        
            add_action('wp_ajax_vip_pay_modal', array($this, 'vip_pay_modal'));
            add_action('init', array($this,'ppo_maybe_check_user_vip_expired_half_day'));       
            add_action('csf__ppo_profile_options_saved', array($this, 'ppo_sync_vip_data_from_profile'), 10, 3);
        }


        //获取VIP套餐列表
        public static function get_vip_item(){
            $html = '';
            $arr = get_op('vip_item');
            if(is_array($arr) && !empty($arr)){
                foreach($arr as $i => $v){
                   //$vip_role = 'vip'.$i.'';
                   $n_price = $v['price_n'];
                   $hot = $v['hot'] ? 'hot' : '';
                   $hot_icon = $v['hot'] ? '<div class="vip_hot"><i class="ri-fire-fill"></i>限时优惠</div>' : '';
                   $m_price = $v['price_m'] < 10 ? round($n_price * $v['price_m'] * 0.1,2) : $n_price;
                   $price_n = $v['price_m'] < 10 ? '<span class="price-n">¥ '.$n_price.'</span>' : '';
                   if($m_price != '0'){
                    $html .= '<div class="vip_show_item '.$hot.'">
                                    '.$hot_icon.'
                                    <div class="item_info">
                                        <div class="title">
                                            <div class="vip-icon"><img src="'.$v['icon'].'"></div>
                                            <h4>'.$v['title'].'</h4>
                                        </div>
                                        <div class="des">'.$v['des'].'</div>
                                    </div>
                                    <div class="vip-price">
                                        <span class="unit">¥ </span><h3>'.$m_price.'</h3><span>/ 月起</span>
                                        '.$price_n.'
                                    </div>
                                
                                    <div class="vip-limits">
                                    '.self::vip_limits($v).'
                                    </div>

                                    <div class="vip_buy">
                                        <a class="vip_update" href="#modal-vip-pay" vip-data="'.$i.'" uk-toggle>立即开通</a>
                                    </div>

                                    </div>';
                   }
                }

                return $html;
            }
            
        }

        // VIP权益列表
        public static function vip_limits($data){
            $html = '';
            $allow_hide = $data['allow_hide'];
            $allow_down = $data['allow_down'];
            $down = $data['down_num'];
            $allow_video = $data['allow_video'];
            $limits = $data['limits'];
            $limits_info = $data['limits_info'];
            $y = '<i class="ri-checkbox-circle-fill"></i>';
            $n = '<i class="ri-close-circle-fill"></i>';

            if($allow_hide == 'n'){
                $html .= '<div class="limits-item no">'.$n.' 无免费查看付费隐藏内容权益</div>';
            } else {
                $html .= '<div class="limits-item">'.$y.'免费查看部分付费隐藏内容</div>';
            }

            if($down == '0' || $allow_down == 'n'){
                $html .= '<div class="limits-item no">'.$n.' 无免费下载付费资源权益</div>';
            } else {
                $down = $down >= 9999 ? '无限' : $down;
                $html .= '<div class="limits-item">'.$y.' 可下载资源<span class="num">'.$down.'</span>次/日</div>';
            }

            if($allow_hide == 'n'){
                $html .= '<div class="limits-item no">'.$n.' 无免费观看付费视频权益</div>';
            } else {
                $html .= '<div class="limits-item">'.$y.'免费查看部分付费视频内容</div>';
            }

            

            if(is_array($limits) && !empty($limits)){
                $limits_data = array( 
                    'comment' => '发布评论', 
                    'msg' => '发送私信',
                    'moment' => '发布片刻',
                    'post' => '发布文章',
                    'cr_moment' => '创建圈子' 
                );
                foreach($limits as $limit){
                    $html .= '<div class="limits-item">'.$y.' '.$limits_data[$limit].'</div>';
                }
            }

            $html .= self::limits_info($limits_info);
            
            //$html .= '<li>'.$y.' 免费下载付费内容'.$down.'次/日</li>';
            //$html .= '<li>'.$y.' 免费观看付费视频'.$video.'次/日</li>';
            return $html;

        }

        // VIP自定义权益列表
        public static function limits_info($data){
            $html = '';
            $y = '<i class="ri-checkbox-circle-fill"></i>';
            $n = '<i class="ri-close-circle-fill"></i>';
            if(!empty($data)){
                $arr = explode("\r\n",$data);
                $res= array_map(function($line) {
                    return explode("|", $line);
                }, $arr);

                foreach($res as $v){
                    $icon = $v[1] == '1' ? $y : $n; 
                    $no = $v[1] == '1' ? '' : 'no';
                    $html .= '<div class="limits-item '.$no.'">'.$icon.' '.$v[0].'</div>';
                }

                return $html;
            }  

        }

        // VIP问答
        public static function vip_qa(){
            $html = '';
            $arr = get_op('vip_qa');
            $icon = get_op('qa_icon');
            $title = get_op('qa_title');
            if(is_array($arr) && !empty($arr)){
                foreach($arr as $v){
                    $html .= '<li>
                                <a class="uk-accordion-title" href="#"><span><i class="'.$icon.'"></i>'.$v['title'].'</span></a>
                                <div class="uk-accordion-content">
                                    <p>'.$v['content'].'</p>
                                </div>
                            </li>';
                }

                $wrap = '<div class="qa-content">  
                            <div class="left">'.$title.'</div>
                            <div class="right"><ul uk-accordion>'.$html.'</ul></div>
                        </div>';

                return $wrap;
            }

        }

        // 加载VIP模态窗口
        public static function vip_pay_modal(){
            $current_user = wp_get_current_user();
            $user_id = $current_user->ID;
            $user_info = get_userdata($user_id);
            $user_avatar = get_u_avatar($user_id,'url');
            $user_name = $user_id > 0 ? $user_info->display_name : '未登录';
            $html = '';
            $arr = get_op('vip_item');
            $html .= '<div class="vip-pay-box">
                        <div class="left">
                            <div class="header">
                                <div class="user-info">
                                    <div class="avatar"><img src="'.$user_avatar.'"></div>
                                    <div class="name"><span>'.$user_name.'</span><span class="des">普通用户，购买后畅享精彩内容</span></div>
                                </div>
                            </div>
                            <div class="vip-pay-main">
                                
                            <ul class="vip-pay-tab" uk-switcher="connect: .vip-pay-item">
                                '.self::vip_pay_tab($arr).'                 
                             </ul>
                        
                            <ul class="uk-switcher vip-pay-item vip-pay-limits">
                                '.self::vip_pay_price($arr).'
                            </ul>
                            
                            <h4 class="vp-title">选择支付方式:</h4>
                            '.PPO_Pay::pay_type_btn().'

                            </div>
                        </div>        
                        <div class="right">
                            <div class="vip-info">
                                <ul class="uk-switcher vip-pay-item vip-pay-info">
                                    '.self::vip_pay_limits($arr).'
                                </ul>
                            </div>
                        </div>
                        
                    </div>';

                   
                    if(is_user_logged_in()){
                        $res = array('html' => $html , 'state' => '1');
                    } else {
                        $res = array('html' => '未登录' , 'state' => '0');
                    }

                    wp_send_json($res);
        }

        public static function vip_pay_tab($data){
            $html = '';
            if(is_array($data) && !empty($data)){
                foreach($data as $i => $v){
                    $html .= '<li data="'.$i.'"><a href="#"><div class="vip-icon"><img src="'.$v['icon'].'"></div><h4>'.$v['title'].'</h4></a>';
                }

                return $html;
            }
        }

        public static function vip_pay_price($data){
            $html = '';
            if(is_array($data) && !empty($data)){
                foreach($data as $v){
                    $price_n = $v['price_n'];
                    $off_m = $v['price_m'];
                    $off_q = $v['price_q'];
                    $off_y = $v['price_y'];
                    $price_m = $price_n*$off_m*0.1;
                    $price_q = $price_n*$off_q*0.1*3;
                    $price_y = $price_n*$off_y*0.1*12;
                    $normal_m = $off_m < 10 ? '<span class="normal">¥ '.$price_n.'</span><small class="vp-tips">限时'.$off_m.'折</small>' : '';
                    $normal_q = $off_q < 10 ? '<span class="normal">¥ '.($price_n * 3).'</span><small class="vp-tips">限时'.$off_q.'折</small>' : '';
                    $normal_y = $off_y < 10 ? '<span class="normal">¥ '.($price_n * 12).'</span><small class="vp-tips">限时'.$off_y.'折</small>' : '';
                    $html .= '<li>
                                <div class="price_m vp-price active" data="m"><span class="vp-time">月费</span><div class="vp-p"><small>¥</small>'.round($price_m,2).'</div>'.$normal_m.'</div>
                                <div class="price_q vp-price" data="q"><span class="vp-time">季费</span><div class="vp-p"><small>¥</small>'.round($price_q,2).'</div>'.$normal_q.'</div>
                                <div class="price_y vp-price" data="y"><span class="vp-time">年费</span><div class="vp-p"><small>¥</small>'.round($price_y,2).'</div>'.$normal_y.'</div>
                            </li>';
                }

                return $html;
            }
        }

        public static function vip_pay_limits($data){
            $html = '';
            if(is_array($data) && !empty($data)){
                foreach($data as $v){
                    $html .= '<li><h4>'.$v['title'].'权益</h4>'.self::vip_limits($v).'</li>';
                }

                return $html;
            }
        }

        // 获取已设置的VIP等级
        public static function get_vip_lv(){
            $arr = get_op('vip_item');
            $data = array();
            if(is_array($arr) && !empty($arr)){
                foreach($arr as $i => $v){
                    $data['vip'.$i.''] = $v['title'];
                }

                return $data;
            }
        }

        // 判断登录用户的会员等级
        public static function check_vip_lv(){
            $user_id   = get_current_user_id();
            if($user_id < 1){
                return;
            }
            $vip = get_user_meta( $user_id, 'ppo_vip', true );
            $vip_arr = PPO_Vip::get_vip_lv();
            if(array_key_exists($vip,$vip_arr)){
                return $vip;
            } 
        }

        // 获取vip index
        public static function get_vip_index($str) {
            // 使用正则表达式匹配数字
            if (preg_match('/\d+/', $str, $matches)) {
                // 如果找到了匹配项，返回第一个匹配的数字
                return $matches[0];
            } else {
                // 如果没有找到数字，返回null或者抛出一个异常
                return ''; // 或者你可以选择抛出一个异常
            }
        }

        // vip时间倍率
        public static function vip_time_x(){
            $array = array(
                'm' => 30,
                'q' => 90,
                'y' => 365,
            );

            return $array;
        }

        // 计算会员剩余天数
        public static function vip_left_days($time){
            $current_timestamp = current_time('timestamp');
            $left_seconds = $time - $current_timestamp;
            $left_days = floor($left_seconds / (60 * 60 * 24));

            return $left_days;
        }

        // vip购买处理
        public static function update_pay_vip($data){
            $user_id = $data['user_id'];
            $pay_time = $data['pay_time'];
            $user_vip_data = get_user_meta( $user_id, 'user_vip_data', true );
            $user_vip_data = !empty($user_vip_data) ? $user_vip_data : array();
            $m = $data['order_extra'];
            $vip_days = self::vip_time_x()[$m];

            if(!empty($user_vip_data)) { // 如果目前是会员
               $vip_lv = self::check_vip_lv(); //会员类型
               if($vip_lv == 'vip'.$data['data_id']){ // 会员等级相同 续费
                    // 更新续费时间和到期时间
                    $user_vip_data['pay_time'] = $pay_time;
                    $user_vip_data['end_time'] = $user_vip_data['end_time'] + 86400 * $vip_days; // 时间戳
                    
                    $user_vip_data['is_expired'] = false;
               } else { // 会员等级不同
                    $left_days = self::vip_left_days($user_vip_data['end_time']); // 剩余天数
                    $new_type = $data['data_id']; // 新会员类型
                    $new_price = get_op('vip_item')[$new_type]['price_n']; // 新会员价格
                    $old_type = preg_match('/\d+/', $user_vip_data['vip_lv'], $matches); 
                    $old_type = $matches[0]; // 旧会员类型
                    $old_price =  get_op('vip_item')[$old_type]['price_n']; // 旧会员价格


                    if($new_price > $old_price){ // 升级会员
                        $new_days = $left_days * ($old_price / $new_price);
                    } else {
                        $new_days = $left_days * ($new_price / $old_price);
                    }

                    $user_vip_data['vip_lv'] = 'vip'.$data['data_id']; // vip等级
                    $user_vip_data['pay_time'] = $pay_time;
                    $user_vip_data['end_time'] = current_time('timestamp') + 86400 * $vip_days + 86400 * $new_days; // 时间戳
                    $user_vip_data['is_expired'] = false;
               }

            } else { // 新购会员
                $user_vip_data['vip_lv'] = 'vip'.$data['data_id']; // vip等级
                $user_vip_data['pay_time'] = $pay_time;
                $user_vip_data['end_time'] = current_time('timestamp') + 86400 * $vip_days; // 时间戳
                $user_vip_data['is_expired'] = false;
            }

            update_user_meta( $user_id, 'ppo_vip', 'vip'.$data['data_id'] );
            update_user_meta( $user_id, 'user_vip_data', $user_vip_data );
            //转换成yy-mm-dd格式
            update_user_meta($user_id, 'ppo_vip_end', date('Y-m-d', $user_vip_data['end_time']));
        }

        // 会员订阅监测

        public static function ppo_maybe_check_user_vip_expired_half_day() {
            if (!is_user_logged_in()) return;
        
            $user_id = get_current_user_id();
            $cache_key = "vip_check_{$user_id}";
        
            // 每12小时检测一次
            if (get_transient($cache_key)) return;
        
            self::ppo_handle_user_vip_expiration_with_flag($user_id);
        
            // 设置缓存 12 小时
            set_transient($cache_key, true, 12 * HOUR_IN_SECONDS);
        }
        
        // VIP 状态检测并添加过期标记
        public static function ppo_handle_user_vip_expiration_with_flag($user_id) {
            $vip_data = get_user_meta($user_id, 'user_vip_data', true);
        
            if (!is_array($vip_data) || empty($vip_data['end_time'])) return;
        
            $now = current_time('timestamp');
            $end_time = intval($vip_data['end_time']);
            $is_expired = isset($vip_data['is_expired']) ? (bool)$vip_data['is_expired'] : false;
        
            // 如果已经过期但未标记为 expired，则处理过期逻辑
            if ($end_time < $now && !$is_expired) {
                $vip_data['is_expired'] = true;
                update_user_meta($user_id, 'user_vip_data', $vip_data);
                update_user_meta($user_id, 'ppo_vip','');
        
                // 可选：触发你自己定义的过期钩子
                do_action('ppo_vip_expired', $user_id);
            }
        }

        function ppo_sync_vip_data_from_profile($option, $value, $unique) {
            // 获取用户ID（Value 参数就是 user_id）
            $user_id = intval($value);
            
            if ($user_id > 0) {
                // 获取保存的会员数据（Option 参数包含所有设置值）
                $vip_level = isset($option['ppo_vip']) ? $option['ppo_vip'] : '';
                $vip_end = isset($option['ppo_vip_end']) ? $option['ppo_vip_end'] : '';
                
                if (!empty($vip_level)) {
                    // 构建 user_vip_data 数组
                    $user_vip_data = array();
                    $user_vip_data['vip_lv'] = $vip_level;
                    $user_vip_data['pay_time'] = current_time('Y-m-d');
                    
                    if ($vip_end === '0') {
                        // 永久会员
                        $user_vip_data['end_time'] = strtotime('2100-12-31');
                    } else {
                        // 有限期会员
                        $user_vip_data['end_time'] = strtotime($vip_end);
                    }
                    
                    $user_vip_data['is_expired'] = false;
                    
                    // 更新用户元数据
                    update_user_meta($user_id, 'user_vip_data', $user_vip_data);
                }
                
                // 更新用户等级（根据经验值）
                if (function_exists('ppo_update_user_level_by_xp')) {
                    // 检查是否有经验值更新
                    if (isset($option['ppo_user_xp'])) {
                        ppo_update_user_level_by_xp($user_id, $option['ppo_user_xp']);
                    }
                }
            }
        }


    }
}

new PPO_Vip;



