<?php

namespace Home\Controller;
use Think\Controller;
use App\Model\GameModel;

/**
 * 后台首页控制器
 * @author 麦当苗儿 <zuojiazi@vip.qq.com>
 */
class DownController extends Controller {
    public  function down_error($message=''){
        $this->assign("message",$message);
        $this->display();
    }
    public function down_file($game_id=0,$promote_id=0){
        // 旧版兼容
        A('Package')->download();
        die();

        $applyModel = M('Apply','tab_');
        $map['status']        = 1;
        $map['enable_status'] = 1;
        $data = $applyModel
        ->field('game_id,tab_apply.game_name,promote_id,promote_account,relation_game_id,pack_url,plist_url,`status`,enable_status,tab_apply.sdk_version')
        ->join("tab_game ON tab_apply.game_id = tab_game.id AND promote_id = $promote_id AND game_id = $game_id ")
        ->where($map)
        ->find();
        $system_type = 1;
        if(strpos($_SERVER['HTTP_USER_AGENT'], 'iPhone')||strpos($_SERVER['HTTP_USER_AGENT'], 'iPad')){
            $system_type = 2;
        }
        $gamemodel = new GameModel();
        $source = $gamemodel->getGameDownInfo($game_id);
        $pack_url = $this->package($source['packet'],$promote_id);
        M('Game','tab_')->where('id='.$data['game_id'])->setInc('dow_num');
        if(is_mobile_request()){
            if($data['sdk_version'] == 1 && get_devices_type()==2)$this->redirect("Down/down_error",array('message'=>"请使用安卓浏览器下载"));
            // if($data['sdk_version'] == 1 && is_weixin()) $this->redirect("Down/down_error",array('message'=>"请使用安卓浏览器下载"));
            if($data['sdk_version'] == 2 && get_devices_type()==1)$this->redirect("Down/down_error",array('message'=>"请使用ios浏览器下载"));
        }
        switch ($data['sdk_version']) {
            case 1:
                if(!empty($pack_url)){
                    if(preg_match("/oss/", $pack_url)){
                        $url=str_replace('-internal', '', $pack_url);
                        echo "<script>window.location.href='$url';</script>";
                    }elseif(preg_match("/clouddn/", $pack_url)){
                        $url = "http://".$pack_url;
                        redirect($url);
                    }elseif(preg_match("/myqcloud/", $pack_url)){
                        redirect($pack_url);
                    }elseif(preg_match("/bcebos/", $pack_url)){
                        redirect($pack_url);
                    }else{
                        if (!file_exists($pack_url)){
                            $this->error('文件不存在哦 亲!');
                        }else{
                            redirect("http://".$_SERVER['HTTP_HOST'].ltrim($pack_url,'.'));
                        }
                    }
                }else{
                    $this->error('原包地址不存在');
                }
                break;
            default:
                switch ($system_type) {
                    case 1:
                        if(!empty($pack_url)){
                            if(preg_match("/oss/", $pack_url)){
                                $url=str_replace('-internal', '', $pack_url);
                                echo "<script>window.location.href='$url';</script>";
                            }elseif(preg_match("/clouddn/", $pack_url)){
                                $url = "http://".$pack_url;
                                redirect($url);
                            }elseif(preg_match("/myqcloud/", $pack_url)){
                                redirect($pack_url);
                            }elseif(preg_match("/bcebos/", $pack_url)){
                                redirect($pack_url);
                            }else{
                                $this->down($pack_url);
                            }
                        }else{
                            $this->error('原包地址不存在');
                        }
                        break;
                    default:
                        $plist_url = substr($data['plist_url'],'1',strlen($data['plist_url']));
                        Header("HTTP/1.1 303 See Other");
                        Header("Location: "."itms-services://?action=download-manifest&url="."https://".$_SERVER["HTTP_HOST"]."/".$plist_url);
                        break;
                }
                break;
        }
    }

		/**
		 * 投放包下载
		 * @param
		 * @author 鹿文学
		 */
		public function launch_down_file($game_id=0,$promote_id=0,$platform_id=0,$position=1) {

			/* 检查游戏是否存在 */
			//$game = M('game','tab_')->field('id,game_name')->where(['id'=>$game_id])->find();
			//if(!is_array($game)) {$this->error('游戏不存在');}

			/* 检查渠道包是否存在或更改 */
			$applymodel = M('apply','tab_');

			$apply = $applymodel->field('id,sdk_version,pack_url,plist_url')
						->where(['game_id'=>$game_id,'promote_id'=>$promote_id])->find();
			//if(!is_array($apply)) {$this->error('渠道不存在');}

			$launchmodel = M('apply_launch','tab_');

			$map = array(
				'platform_id'=>$platform_id,
				'apply_id'=>$apply['id'],
				'position'=>$position,
			);

			$launch = $launchmodel->where($map)->find();

			//if(!is_array($launch)) {$this->error('游戏包不存在');}

			/* 检查原包是否存在或更改 */
			$gamesource = M('game_source','tab_')->field('id,file_name,source_version')->where(['game_id'=>$game_id])->find();
			if(!is_array($gamesource)) {$this->error('文件不存在哦');}

			if($gamesource['file_name'] == $launch['game_source_filename']) {


				$system_type = 1;
        if(strpos($_SERVER['HTTP_USER_AGENT'], 'iPhone')||strpos($_SERVER['HTTP_USER_AGENT'], 'iPad')){
            $system_type = 2;
        }

        $pack_url = $launch['launch_down_url'];
        M('Game','tab_')->where(['id'=>$game_id])->setInc('dow_num');
        if(is_mobile_request()){
            if($apply['sdk_version'] == 1 && get_devices_type()==2)$this->redirect("Down/down_error",array('message'=>"请使用安卓浏览器下载"));
            if($apply['sdk_version'] == 1 && is_weixin())$this->redirect("Home/promotionofregistration",array('pid'=>$promote_id,'gid'=>$game_id,'lid'=>$platform_id,'p'=>$position,'message'=>"请使用安卓浏览器下载"));
            if($apply['sdk_version'] == 2 && get_devices_type()==1)$this->redirect("Down/down_error",array('message'=>"请使用ios浏览器下载"));
        }
        switch ($apply['sdk_version']) {
            case 1:
                if(!empty($pack_url)){
                    if(preg_match("/oss/", $pack_url)){
                        $url=str_replace('-internal', '', $pack_url);
                        echo "<script>window.location.href='$url';</script>";
                    }elseif(preg_match("/clouddn/", $pack_url)){
                        $url = "http://".$pack_url;
                        redirect($url);
                    }elseif(preg_match("/myqcloud/", $pack_url)){
                        redirect($pack_url);
                    }elseif(preg_match("/bcebos/", $pack_url)){
                        redirect($pack_url);
                    }else{

												$url = ROOTTT . substr($pack_url,stripos($pack_url,'uploads'));

                        if (!file_exists($url)){
                            $this->error('文件不存在哦 亲!');
                        }else{
                            redirect($pack_url);
                        }
                    }
                }else{
                    $this->error('原包地址不存在');
                }
                break;
            default:
                switch ($system_type) {
                    case 1:
                        if(!empty($pack_url)){
                            if(preg_match("/oss/", $pack_url)){
                                $url=str_replace('-internal', '', $pack_url);
                                echo "<script>window.location.href='$url';</script>";
                            }elseif(preg_match("/clouddn/", $pack_url)){
                                $url = "http://".$pack_url;
                                redirect($url);
                            }elseif(preg_match("/myqcloud/", $pack_url)){
                                redirect($pack_url);
                            }elseif(preg_match("/bcebos/", $pack_url)){
                                redirect($pack_url);
                            }else{
                                $this->down($pack_url);
                            }
                        }else{
                            $this->error('原包地址不存在');
                        }
                        break;
                    default:
                        $plist_url = $launch['launch_plist_url'];
												if(stripos($plist_url,'https://') === false) {
													$plist_url = 'https://'.$_SERVER['HTTP_HOST'].str_replace('./','/',$plist_url);
												}
                        Header("HTTP/1.1 303 See Other");
                        Header("Location: "."itms-services://?action=download-manifest&url=".$plist_url);
                        break;
                }
                break;
        }




			} else {

				$applymodel->where(['id'=>$apply['id']])->setField('enable_status',2);

				$this->error('游戏正在打包,请稍候');

			}

		}


    public function media_down_file($game_id=0,$type=1){
        $model = M('Game','tab_');
        $map['tab_game.id'] = $game_id;
        $map['file_type'] = $type;
        $data = $model
        ->field('tab_game_source.*,tab_game.game_name,tab_game.add_game_address,tab_game.ios_game_address')
        ->join("left join tab_game_source on tab_game.id = tab_game_source.game_id")->where($map)->find();
        if($type==1){
            if($data['file_url']!=''||!varify_url($data['add_game_address'])){
                $this->down($data['file_url']);
            }
            else{
                Header("HTTP/1.1 303 See Other");
                Header("Location: ".$data['add_game_address']);
            }
        }else{
            if($data['file_url']!=''||!varify_url($data['ios_game_address'])){
                $this->down($data['file_url']);
            }
            else{
                Header("HTTP/1.1 303 See Other");
                Header("Location: ".$data['ios_game_address']);
            }
        }
    }

    public function down($file, $isLarge = false, $rename = NULL)
    {
        if(headers_sent())return false;
        if(!$file) {
            $this->error('文件不存在哦 亲!');
        }
        if($rename==NULL){
            if(strpos($file, '/')===false && strpos($file, '\\')===false)
                $filename = $file;
            else{
                $filename = basename($file);
            }
        }else{
            $filename = $rename;
        }

        header('Content-Description: File Transfer');
        header("Content-Type: application/force-download;");
        header('Content-Type: application/octet-stream');
        header("Content-Transfer-Encoding: binary");
        header("Content-Disposition: attachment; filename=\"$filename\"");
        header('Expires: 0');
        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
        header('Pragma: public');
        header('Content-Length: '.filesize($file));//$_SERVER['DOCUMENT_ROOT'].
        header("Pragma: no-cache"); //不缓存页面
        ob_clean();
        flush();
        if($isLarge)
            self::readfileChunked($file);
        else
            readfile($file);
    }

    public function down_material($game_id){
        $map['status'] = 1;
        $game = M("game",'tab_')->where($map)->find($game_id);
        $material = $game['material_url'];
        if(file_exists($material) && is_file($material)){
            clearstatcache();
            $this->down($material);
        }else{
            clearstatcache();
            $this->error('下载地址错误');
        }

    }

    /**
     * 安卓打包渠道信息
     * @param $source_info  原包信息
     * @param $promote_id
     * @return string
     * author: xmy 280564871@qq.com
     */
    public function package($source_info, $promote_id)
    {
        $file_path = $source_info['file_url'];
        //验证原包是否存在
        if (!varify_url($file_path)) {
            $this->error("未上传原包");
        } else {

            $result = M('apply', 'tab_')
                    ->alias('a')
                    ->field('id, pack_url, plist_url')
                    ->where(['a.game_id'=>$source_info['game_id'],'a.promote_id'=>$promote_id])
                    ->find();
            if(empty($result)) {
                $this->error('此游戏不存在');
            }

            if(GameModel::ANDROID == $source_info['sdk_version']){
                if(varify_url($result['pack_url'])) {
                    return $result['pack_url'];
                }
            }elseif(GameModel::IOS == $source_info['sdk_version']){
                if(varify_url($result['plist_url'])) {
                    return $result['plist_url'];
                }
            }else{
                $this->error('游戏版本错误');
            }

            $zip = new \ZipArchive();

            if ($source_info['sdk_version'] == 1) {
                $str_ver = ".apk";
                $file_name = "GamePack";
                $url_ver = "META-INF/mch.properties";
            } else {
                $zip_open_game_source = zip_open(get_game_source_file_url($source_info['game_id']));
                if ($zip_open_game_source) {
                    while ($zip_entry = zip_read($zip_open_game_source)) {
                        if (preg_match("/.app/", zip_entry_name($zip_entry))) {
                            $ios_app = substr(zip_entry_name($zip_entry), 8) . "<br/>";
                        }
                        $new_ios_1 = explode("/", $ios_app);
                    }
                    zip_close($zip_open_game_source);
                }
                $str_ver = ".ipa";
                $file_name = "IosGamePack";
                $url_ver = "Payload/" . $new_ios_1[0] . "/_CodeSignature/TXChannel";

            }

            $new_name = "game_package" . $source_info['game_id'] . "-" . $promote_id . $str_ver;
            $to = "./Uploads/" . $file_name . "/" . $new_name;
            copy(get_game_source_file_url($source_info['game_id']), ROOTTT . ltrim($to, './'));
            $zip_res = $zip -> open(ROOTTT . ltrim($to, './'), \ZipArchive::CREATE);

            if ($zip_res == true) {
                #打包数据
                $pack_data = array(
                        "game_id" => $source_info["game_id"],
                        "game_name" => $source_info['game_name'],
                        "game_appid" => get_game_appid($source_info["game_id"], "id"),
                        "promote_id" => $promote_id,
                        "promote_account" => get_promote_account($promote_id),
                        "source_version" => $source_info['source_version'],
                );
                $zip -> addFromString($url_ver, json_encode($pack_data));
                $zip->close();

                $newname = $new_name;

                if (get_tool_status("oss_storage") == 1) {

                    if (C("oss_storage.is_cname")) {
                        $to = "http://" . C("oss_storage.domain") . "/" . str_replace("IosGamePack", "GamePack", $file_name) . "/" . $newname;
                    } else {
                        $to = "https://" . C("oss_storage.bucket") . "." . C("oss_storage.domain") . "/" . str_replace("IosGamePack", "GamePack", $file_name) . "/" . $newname;
                        $to = str_replace('-internal', '', $to);
                    }
                    if (!empty(C('oss_storage.bd_domain')) && strlen(C('oss_storage.bd_domain')) > 5) {
                        $to = C('oss_storage.bd_domain') . "/GamePack/" . $newname;
                    }
                    $new_to = ROOTTT . "Uploads/" . $file_name . "/" . $newname;
                    $updata['savename'] = $newname;
                    $updata['path'] = $new_to;
                    $this -> upload_game_pak_oss($updata);
                    @unlink($new_to);

                } elseif (get_tool_status("cos_storage") == 1) {

                    $new_to = ROOTTT . "Uploads/" . $file_name . "/" . $newname;

                    $updata['path'] = $new_to;
                    $updata['savename'] = 'GamePack/'. $newname;

                    $to = $this->upload_cos($updata);

                }

                $promote = array('game_id' => $source_info['game_id'], 'promote_id' => $promote_id);
                $plist_url = '';
                if ($source_info['sdk_version'] == 2) {
                    $plist_url = $this -> create_plist($promote['game_id'], $promote['promote_id'], get_payload_name($source_info['game_id']), $to);
                }
                $jieguo = $this -> updateinfo($result['id'], $to, $promote, $plist_url);

                if ($source_info['sdk_version'] == 2) {
                    return $plist_url;
                }else{
                    return $to;
                }
            }

            return $to;

        }
    }

    /**
     *上传到OSS
     */
    public function upload_game_pak_oss($return_data = null)
    {
        /**
         * 根据Config配置,得到一个OssClient实例
         */
        try {
            Vendor('OSS.autoload');
            $ossClient = new \OSS\OssClient(C("oss_storage.accesskeyid"), C("oss_storage.accesskeysecr"), C("oss_storage.domain"));
        } catch (OssException $e) {
            $this -> error($e -> getMessage());
        }
        $bucket = C('oss_storage.bucket');
        // if(preg_match('/.apk/',$return_data['savename']) ){
        $oss_name = "GamePack";
        // }else{
        //       $oss_name="IosGamePack";
        // }
        $oss_file_path = $oss_name . "/" . $return_data["savename"];
        $avatar = $return_data["path"];
        try {

            $this -> multiuploadFile($ossClient, $bucket, $oss_file_path, $avatar);
            return true;
        } catch (OssException $e) {
            /* 返回JSON数据 */
            $this -> error($e -> getMessage());
        }
    }

    /**
     * 腾讯云上传
     *
     * @param null $data
     *
     * @return mixed
     *
     * @author: 鹿文学[lwx]<fyj301415926@126.com>
     * @since: 2019\4\18 0018 17:40
     */
    public function upload_cos($data=null) {

        Vendor('COS5.vendor.autoload');

        $schema=C("cos_storage.schema")?:"https";

        $secretId = C("cos_storage.SecretId"); //"云 API 密钥 SecretId";
        $secretKey = C("cos_storage.SecretKey"); //"云 API 密钥 SecretKey";
        $region = C("cos_storage.domain"); //设置一个默认的存储桶地域
        $cosClient = new \Qcloud\Cos\Client(
                array(
                        'region' => $region,
                        'schema' => $schema, //协议头部,默认为http
                        'credentials'=> array(
                                'secretId'  => $secretId ,
                                'secretKey' => $secretKey
                        )
                )
        );


        $bucket = C("cos_storage.bucket"); //存储桶名称 格式:BucketName-APPID
        $key = $data['savename'];
        $srcPath = $data["path"];//本地文件绝对路径

        try {
            $result = $cosClient->Upload(
                    $bucket = $bucket,
                    $key = $key,
                    $body = fopen($srcPath, 'rb')
            );
            $location = $result['Location'];
            if(!preg_match('/^(http)|(https)/', $location)) {
                $result['Location'] = 'https://' . $result['Location'];
            }
            return $result['Location'];
        } catch (\Exception $e) {
            $this->error($e->getMessage());
        }

    }

    public function create_plist($game_id = 0, $promote_id = 0, $marking = "", $url = "", $platform_id = 0, $position=1)
    {
        $find_web_stie = M('config') -> field('value') -> where(['name' => 'WEB_SITE']) -> find();
        $xml = new \DOMDocument();
        $xml -> load(ROOTTT . 'Uploads/Plist/testdemo.Plist');
        $online = $xml -> getElementsByTagName('dict');//查找节点
        $asd = $online -> item(1) -> getElementsByTagName('string');//第二个节点下所有string
        foreach ($asd as $key => $value) {
            switch ($value -> textContent) {
                case 'ipa_url':
                    if (preg_match("/Uploads/", $url)) {
                        $value -> nodeValue = "https://" . $find_web_stie['value'] . ltrim($url, ".");//"https://iosdemo.vlcms.com/app/MCHSecretary.ipa";//替换xml对应的值
                    } else {
                        $value -> nodeValue = $url;
                    }
                    break;
                case 'icon':
                    $icon_url = get_cover(get_game_icon_id($game_id), 'path', 2);
                    if (preg_match("/http/", $icon_url)) {
                        $value -> nodeValue = $icon_url;
                    } else {
                        $value -> nodeValue = "https://" . $find_web_stie['value'] . $icon_url;
                    }
                    break;
                case 'com.dell':
                    $value -> nodeValue = $marking;
                    break;
                case '1.0.0':
                    $value -> nodeValue = game_version($game_id);
                    break;
                case 'mchdemo':
                    $value -> nodeValue = get_ios_game_name($game_id);
                    break;

            }
            if ($promote_id == 0) {
                $xml -> save(ROOTTT . "Uploads/SourcePlist/$game_id.Plist");
            } elseif ($platform_id > 0) {
                $ppname = $game_id . "-" . $promote_id . "-" . $platform_id . "-" .$position;
                $xml -> save(ROOTTT . "Uploads/GamePlist/$ppname.Plist");
            } else {
                $pname = $game_id . "-" . $promote_id;
                $xml -> save(ROOTTT . "Uploads/GamePlist/$pname.Plist");
            }
        }
        if ($promote_id == 0) {
            return "./Uploads/SourcePlist/$game_id.Plist";
        } elseif ($platform_id > 0) {
            $ppname = $game_id . "-" . $promote_id . "-" . $platform_id . "-" . $position;
            return "./Uploads/GamePlist/$ppname.Plist";
        } else {
            return "./Uploads/GamePlist/$pname.Plist";
        }


    }

    public function multiuploadFile($ossClient, $bucket, $url, $file)
    {
        //$file = __FILE__;
        $options = array();
        try {
            #初始化分片上传文件
            $uploadId = $ossClient -> initiateMultipartUpload($bucket, $url);
            //$ossClient->multiuploadFile($bucket, $url, $file, $options);
        } catch (OssException $e) {
            printf(__FUNCTION__ . ": initiateMultipartUpload FAILED\n");
            printf($e -> getMessage() . "\n");
            return;
        }
        /*
         * step 2. 上传分片
         */
        $partSize = 5 * 1000 * 1024;
        $uploadFile = $file;
        $uploadFileSize = filesize($uploadFile);
        $pieces = $ossClient -> generateMultiuploadParts($uploadFileSize, $partSize);
        $responseUploadPart = array();
        $uploadPosition = 0;
        $isCheckMd5 = true;
        foreach ($pieces as $i => $piece) {
            $fromPos = $uploadPosition + (integer) $piece[$ossClient ::OSS_SEEK_TO];
            $toPos = (integer) $piece[$ossClient ::OSS_LENGTH] + $fromPos - 1;
            $upOptions = array(
                    $ossClient ::OSS_FILE_UPLOAD => $uploadFile,
                    $ossClient ::OSS_PART_NUM => ($i + 1),
                    $ossClient ::OSS_SEEK_TO => $fromPos,
                    $ossClient ::OSS_LENGTH => $toPos - $fromPos + 1,
                    $ossClient ::OSS_CHECK_MD5 => $isCheckMd5,
            );
            if ($isCheckMd5) {
                $contentMd5 = \OSS\Core\OssUtil ::getMd5SumForFile($uploadFile, $fromPos, $toPos);
                $upOptions[$ossClient ::OSS_CONTENT_MD5] = $contentMd5;
            }
            //2. 将每一分片上传到OSS
            try {
                $responseUploadPart[] = $ossClient -> uploadPart($bucket, $url, $uploadId, $upOptions);
            } catch (OssException $e) {
                printf(__FUNCTION__ . ": initiateMultipartUpload, uploadPart - part#{$i} FAILED\n");
                printf($e -> getMessage() . "\n");
                return;
            }
        }
        $uploadParts = array();
        foreach ($responseUploadPart as $i => $eTag) {
            $uploadParts[] = array(
                    'PartNumber' => ($i + 1),
                    'ETag' => $eTag,
            );
        }
        /**
         * step 3. 完成上传
         */
        try {
            $ossClient -> completeMultipartUpload($bucket, $url, $uploadId, $uploadParts);
        } catch (OssException $e) {
            printf(__FUNCTION__ . ": completeMultipartUpload FAILED\n");
            printf($e -> getMessage() . "\n");
            return;
        }
    }

    /**
     *修改申请信息
     */
    public function updateinfo($id, $pack_url, $promote, $plist_url)
    {
        $model = M('Apply', "tab_");
        $data['id'] = $id;
        $data['pack_url'] = $pack_url;
        $data['dow_url'] = '/index.php?s=/Home/Down/down_file/game_id/' . $promote['game_id'] . '/promote_id/' . $promote['promote_id'];
        $data['dow_status'] = 1;
        $data['enable_status'] = 1;
        $data['plist_url'] = $plist_url;
        $res = $model -> save($data);
        return $res;
    }

}