<?php
/**
 * 定时自动完成
 */
namespace Admin\Controller;
use Admin\Model\SpendModel;
use Think\Think;
use Base\Tool\Printer;
use Base\Service\PromoteService;

class ConsoleController extends Think {

    protected function _initialize()
    {
        C(api('Config/lists'));
    }

    public function modifyPromote()
    {
        $promotes = M('promote', 'tab_')->where(['parent_id' => 0])->select();
        foreach ($promotes as $promote) {
            $promote['chain'] = '/';
            $promote['level'] = 1;
            
            M('promote', 'tab_')->where(['id' => $promote['id']])->save(['chain' => '/', 'level' => 1]);

            $subPromote = $promote;
            unset($subPromote['id']);
            $subPromote['parent_id'] = $promote['id'];
            $subPromote['parent_name'] = $promote['account'];
            $subPromote['chain'] = $promote['chain'] . $promote['id'] . '/';
            $subPromote['level'] = $promote['level'] + 1;
            $subPromote['account'] = 'second_' . $promote['account'];
            $subPromote['nickname'] = '二级_' . $promote['nickname'];
            $subPromote['mobile_phone'] = '';
            $subPromote['email'] = '';
            $subPromote['real_name'] = '';
            $subPromote['money'] = 0;
            $subPromote['total_money'] = 0;
            $subPromote['balance_coin'] = 0;
            $subPromote['create_time'] = time();
            $subPromote['last_login_time'] = 0;
            $subPromote['idcard'] = '';
            M('promote', 'tab_')->add($subPromote);
            $subId = M()->getLastInsID();
            $subChain = $subPromote['chain'] . $subId . '/';
            M('promote', 'tab_')->where(['parent_id' => $promote['id'], 'id' => ['neq', $subId]])->save([
                'parent_id' => $subId,
                'parent_name' => $subPromote['account'],
                'chain' => $subChain,
                'level' => 3,
            ]);
            // echo M()->getLastSql() . "\n";
            M('promote', 'tab_')->where(['grand_id' => $promote['id']])->save([
                'chain' => ['exp', 'concat("' . $subChain. '",parent_id,"/")'],
                'level' => 4,
            ]);
            // echo M()->getLastSql() . "\n";
        }
    }

    public function runShiftTask()
    {
        $promoteService = new PromoteService();
        $tasks = M('shift_task', 'sys_')->where(['status' => 0, 'order_time' => ['elt', time()]])->select();
        if (count($tasks) == 0) {
            Printer::export('无可执行任务', true);
        }
        foreach ($tasks as $task) {
            if ($task['type'] == 1) {
                $message = '推广员迁移[' . $task['id'] . ']';
                $result = $promoteService->shiftPromote($task);
                if ($result['status']) {
                    $message = 'SUCCESS ----- ' . $message . $result['msg'];
                } else {
                    $message = 'ERROR ----- ' . $message . $result['msg'];
                }
                Printer::export($message);
            } elseif ($task['type'] == 2) {
                $message = '玩家迁移[' . $task['id'] . ']';
                $result = $promoteService->shiftPlayer($task);
                if ($result['status']) {
                    $message = 'SUCCESS ----- ' . $message . $result['msg'];
                } else {
                    $message = 'ERROR ----- ' . $message . $result['msg'];
                }
                Printer::export($message);
            }
        }
    }

    public function modifyLoginRepair()
    {
        $this->modifyLogin(1569686400);
    }

    public function modifyLoginGenerate($start_time=0)
    {
        $start_time = $start_time ? $start_time : date('Y-m-d', strtotime('-1 day'));
        $this->modifyLogin(strtotime($start_time));
    }

    /**
     * 登录校验
     */
    private function modifyLogin($start_time=0)
    {
        $current_time = strtotime(date("Y-m-d"))-86400;
        for ($i=$start_time; $i<=$current_time; $i+=86400) {
            $end_time = $i+86400;
            $result = M()->query("SELECT
                game_id,
                FROM_UNIXTIME(login_time, '%Y-%m-%d') create_time,
                user_id,
                promote_id
                FROM
                    tab_user_login_record
                WHERE
                    login_time >= {$i} and login_time < {$end_time}
                GROUP BY
                    create_time,
                    game_id,
                    user_id");
                if ($result) {
                    foreach ($result as $index => $item) {
                        $item['create_time'] = strtotime($item['create_time']);
                        if ($item['create_time']) {
                            $res = M("login_daily_record", "tab_")->add($item);
                            echo "写入{$item['create_time']} $res \n";
                        } else {
                            echo "写入{$item['create_time']} error \n";
                        }
                        unset($result[$index]);
                    } 
                } else {
                    echo "写入{$item['create_time']} 无 \n";
                }
            }
    }

    public function deleteRepeatUserPlayInfo()
    {
        $gameIds = [157, 155, 153, 150, 151, 148, 175, 142, 143, 172, 173, 155, 154, 180];
        foreach($gameIds as $gameId) {
            $this->doDeleteRepeatUserPlayInfo($gameId);
        }
    }

    public function doDeleteRepeatUserPlayInfo($gameId)
    {
        $sql = 'select id from tab_user_play_info a left join (
            select role_id, server_id, game_id, count(1) from tab_user_play_info where server_id="' . $serverId . '" and game_id = ' . $gameId . ' GROUP BY role_id, server_id, game_id, server_name having count(1) > 1
            ) b on a.role_id=b.role_id where a.server_id=b.server_id and a.game_id=b.game_id and a.server_id="' . $serverId . '" and a.game_id = ' . $gameId . ' order by a.role_id, a.server_id, a.game_id';
        $model = new \Think\Model();

        $servers = M('server', 'tab_')->field('server_id')->where(['game_id' => $gameId])->group('server_id')->select();
        foreach ($servers as $server) {
            $serverId = $server['server_id'];
            $sql = 'select a.id, a.role_id, a.server_id, a.game_id, a.role_level from tab_user_play_info a left join (
                select role_id, server_id, game_id, count(1) from tab_user_play_info where server_id="' . $serverId . '" and game_id = ' . $gameId . ' GROUP BY role_id, server_id, game_id, server_name having count(1) > 1
                ) b on a.role_id=b.role_id where a.server_id=b.server_id and a.game_id=b.game_id and a.server_id="' . $serverId . '" and a.game_id = ' . $gameId . ' order by a.role_id, a.server_id, a.game_id';
            // var_dump($sql);

            $result = $model->query($sql);
            $uniqueRole = null;
            $items = [];
            foreach ($result as $item) {
                $items[$item['role_id']][] = $item;
            }

            $maxRoleIds = [];
            $repeatIds = [];
            foreach ($items as $roles) {
                $maxRole = null;
                foreach ($roles as $role) {
                    if ($maxRole == null) {
                        $maxRole = $role;
                    } elseif ($role['role_level'] > $maxRole['role_level']) {
                        $repeatIds[] = $maxRole['id'];
                        $maxRole = $role;
                    } else {
                        $repeatIds[] = $role['id'];
                    }
                }
                $maxRoleIds[] = $maxRole['id'];
            }
            if (count($repeatIds) > 0) {
                M('user_play_info', 'tab_')->where(['id' => ['in', $repeatIds], 'game_id' => $gameId, 'server_id' => $serverId])->delete();
                echo M()->getLastSql();
                echo PHP_EOL;
            }
        }
    }

    public function deleteRepeatUserPlayInfo2()
    {
        $gameIds = [157, 148, 150, 151, 158, 175, 142, 143, 172, 173, 154, 155, 176, 165, 164, 179, 156, 153, 180];
        foreach ($gameIds as $gameId) {
            $this->doDeleteRepeatUserPlayInfo2($gameId);
        }
    }

    public function doDeleteRepeatUserPlayInfo2($gameId)
    {
        $sql = 'select id from tab_user_play_info a left join (
            select role_id, server_id, game_id, count(1) from tab_user_play_info where server_id="' . $serverId . '" and game_id = ' . $gameId . ' GROUP BY role_id, server_id, game_id, server_name having count(1) > 1
            ) b on a.role_id=b.role_id where a.server_id=b.server_id and a.game_id=b.game_id and a.server_id="' . $serverId . '" and a.game_id = ' . $gameId . ' order by a.role_id, a.server_id, a.game_id';
        $model = new \Think\Model();

        $servers = M('server', 'tab_')->field('server_id')->where(['game_id' => $gameId])->group('server_id')->select();
        foreach ($servers as $server) {
            $serverId = $server['server_id'];
            $sql = 'select a.id, a.role_id, a.server_id, a.game_id, a.role_level from tab_user_play_info a left join (
                select role_id, server_id, game_id, count(1) from tab_user_play_info where server_id="' . $serverId . '" and game_id = ' . $gameId . ' GROUP BY role_id, server_id, game_id having count(1) > 1
                ) b on a.role_id=b.role_id where a.server_id=b.server_id and a.game_id=b.game_id and a.server_id="' . $serverId . '" and a.game_id = ' . $gameId . ' order by a.role_id, a.server_id, a.game_id';
            // var_dump($sql);

            $result = $model->query($sql);
            $uniqueRole = null;
            $items = [];
            foreach ($result as $item) {
                $items[$item['role_id']][] = $item;
            }

            $maxRoleIds = [];
            $repeatIds = [];
            foreach ($items as $roles) {
                $maxRole = null;
                foreach ($roles as $role) {
                    if ($maxRole == null) {
                        $maxRole = $role;
                    } elseif ($role['role_level'] >= $maxRole['role_level']) {
                        $repeatIds[] = $maxRole['id'];
                        $maxRole = $role;
                    } else {
                        $repeatIds[] = $role['id'];
                    }
                }
                $maxRoleIds[] = $maxRole['id'];
            }
            if (count($repeatIds) > 0) {
                M('user_play_info', 'tab_')->where(['id' => ['in', $repeatIds], 'game_id' => $gameId, 'server_id' => $serverId])->delete();
                echo M()->getLastSql();
                echo PHP_EOL;
            }
        }
    }

    public function resetIndexChart()
    {
        for ($i=1; $i<100; $i++) {
            $item = M('index_chart', 'tab_')->where(['id' => $i])->find();
            if ($item) {
                $item['new_user_hours'] = json_encode(unserialize($item['new_user_hours']));
                $item['active_user_hours'] = json_encode(unserialize($item['active_user_hours']));
                $item['active_user_list'] = json_encode(unserialize($item['active_user_list']));
                $item['pay_user_hours'] = json_encode(unserialize($item['pay_user_hours']));
                $item['pay_user_list'] = json_encode(unserialize($item['pay_user_list']));
                $item['pay_money_hours'] = json_encode(unserialize($item['pay_money_hours']));
                $item['promote_new_hours'] = json_encode(unserialize($item['promote_new_hours']));
                $item['all_count'] = json_encode(unserialize($item['all_count']));
                M("index_chart_1", "tab_")->add($item);
            }
        }
    }
}