<?php

namespace App\Http\Controllers\Wechat\OfficialAccount;

use App\Http\Controllers\Channel\BaseController as ChannelBaseController;

use App\Modules\OfficialAccount\Models\ForceSubscribeUsers;
use App\Modules\OfficialAccount\Services\ForceSubscribeService;
use App\Modules\OfficialAccount\Services\CustomMsgService;
use App\Http\Controllers\Channel\OfficialAccount\Transformers\CustomMsgControllerTransformer;
use App\Http\Controllers\Wechat\OfficialAccount\Transformers\ForceSubscribeUsersTransformer;
use App\Modules\User\Models\SubscribeRecord;
use Illuminate\Http\Request;
use GuzzleHttp\Client;
use App\Libs\OSS;
use Redis;
use OSS\Core\OssException;
use OSS\OssClient;

class ForceSubscribeUsersController extends ChannelBaseController
{

    /**
     * @apiDefine OfficialAccount 公众号
     */


    /**
     * @apiVersion 1.0.0
     * @api {GET} OfficialAccount/forceSubscribeUsersByAppidAndOpenId 通过appid和openid获取强关用户
     * @apiGroup OfficialAccount
     * @apiName forceSubscribeUsersByAppidAndOpenId
     * @apiParam   {Number}  appid 微信appID.
     * @apiParam   {Number}  openid 公众号openid.
     * @apiSuccess {Number}  uid 用户id.
     * @apiSuccess {Number}  official_account_id 公众账号id.
     * @apiSuccess {Number}  distribution_channel_id 分配的渠道id.
     * @apiSuccess {Number}  openid 公众号openid.
     * @apiSuccess {Number}  appid 微信appID.
     * @apiSuccess {Number}  is_subscribed 是否强关.
     * @apiSuccess {String}  subscribe_time 强关时间.
     * @apiSuccess {String}  unsubscribe_time 取关时间.
     * @apiSuccess {String}  last_interactive_time 强关用户与公众号最后交互时间.
     * @apiSuccessExample {json} Success-Response:
     *
     *       {
     *           "code": 0,
     *           "msg": "",
     *           "data": {
     *               "uid": 12121212,
     *               "official_account_id": 11111,
     *               "distribution_channel_id": 2323213,
     *               "appid": 112211,
     *               "openid": 11232,
     *               "is_subscribed": 0,
     *               "subscribe_time": "2017-11-22 21:37:15",
     *               "unsubscribe_time": "2017-11-22 22:36:50",
     *               "last_interactive_time": "2017-11-22 22:36:50"
     *           }
     *       }   
     */

    function forceSubscribeUsersByAppidAndOpenId(Request $request)
    {
        
        $appid = $request->has('appid') ? $request->input('appid') : '';
        
        if(empty($appid)) {
            return response()->error("PARAM_EMPTY");
        }
        
        $openid = $request->has('openid') ? $request->input('openid') : '';

        if(empty($openid)) {
            return response()->error("PARAM_EMPTY");
        }

        $forceSubscribeUsers['appid'] = $appid;
        $forceSubscribeUsers['openid'] = $openid;
        $forceSubscribeUsersService = ForceSubscribeService::forceSubscribeUsersByAppidAndOpenId($forceSubscribeUsers);
        return response()->item(new ForceSubscribeUsersTransformer(), $forceSubscribeUsersService);
    }




    function forceSubscribeUsersByOpenidAndAppidAndChannelId(Request $request)
    {
        
        $appid = $request->has('appid') ? $request->input('appid') : '';
        
        if(empty($appid)) {
            return response()->error("PARAM_EMPTY");
        }
        
        $openid = $request->has('openid') ? $request->input('openid') : '';

        if(empty($openid)) {
            return response()->error("PARAM_EMPTY");
        }

        $distribution_channel_id = $request->has('distribution_channel_id') ? $request->input('distribution_channel_id') : '';

        if(empty($distribution_channel_id)) {
            return response()->error("PARAM_EMPTY");
        }

        $forceSubscribeUsers['appid'] = $appid;
        $forceSubscribeUsers['openid'] = $openid;
        $forceSubscribeUsers['distribution_channel_id'] = $distribution_channel_id;
        $forceSubscribeUsersService = ForceSubscribeService::forceSubscribeUsersByOpenidAndAppidAndChannelId($forceSubscribeUsers);
        return response()->item(new ForceSubscribeUsersTransformer(), $forceSubscribeUsersService);
    }



    /**
     * @apiDefine OfficialAccount 公众号
     */

    /**
     * @apiVersion 1.0.0
     * @api {GET} OfficialAccount/forceSubscribeUsersByUid 通过uid获取强关用户
     * @apiGroup OfficialAccount
     * @apiName forceSubscribeUsersByUid
     * @apiParam   {Number}  uid 用户id.
     * @apiSuccess {Number}  uid 用户id.
     * @apiSuccess {Number}  official_account_id 公众账号id.
     * @apiSuccess {Number}  distribution_channel_id 分配的渠道id.
     * @apiSuccess {Number}  openid 公众号openid.
     * @apiSuccess {Number}  appid 微信appID.
     * @apiSuccess {Number}  is_subscribed 是否强关.
     * @apiSuccess {String}  subscribe_time 强关时间.
     * @apiSuccess {String}  unsubscribe_time 取关时间.
     * @apiSuccess {String}  last_interactive_time 强关用户与公众号最后交互时间.
     * @apiSuccessExample {json} Success-Response:
     *
     *       {
     *           "code": 0,
     *           "msg": "",
     *           "data": {
     *               "uid": 12121212,
     *               "official_account_id": 11111,
     *               "distribution_channel_id": 2323213,
     *               "appid": 112211,
     *               "openid": 11232,
     *               "is_subscribed": 0,
     *               "subscribe_time": "2017-11-22 21:37:15",
     *               "unsubscribe_time": "2017-11-22 22:36:50",
     *               "last_interactive_time": "2017-11-22 22:36:50"
     *           }
     *       }   
     */

    function forceSubscribeUsersByUid(Request $request)
    {
        
        $uid = $request->has('uid') ? $request->input('uid') : '';
        
        if(empty($uid)) {
            return response()->error("PARAM_EMPTY");
        }
        $forceSubscribeUsers['uid'] = $uid;
        $forceSubscribeUsersService = ForceSubscribeService::forceSubscribeUsersByUid($forceSubscribeUsers);
        return response()->item(new ForceSubscribeUsersTransformer(), $forceSubscribeUsersService);
    }



    /**
     * @apiVersion 1.0.0
     * @api {POST} OfficialAccount/addForceSubscribeUsers 增加强关用户
     * @apiGroup OfficialAccount
     * @apiName addForceSubscribeUsers
     * @apiParam {Number}  uid 用户id.
     * @apiParam {Number}  official_account_id 公众账号id.
     * @apiParam {Number}  distribution_channel_id 分配的渠道id.
     * @apiParam {Number}  openid 公众号openid.
     * @apiParam {Number}  appid 微信appID.
     * @apiParam {Number}  is_subscribed 是否强关.
     * @apiParam {String}  subscribe_time 强关时间.
     * @apiParam {String}  unsubscribe_time 取关时间.
     * @apiParam {String}  last_interactive_time 强关用户与公众号最后交互时间.
     * @apiSuccessExample {json} Success-Response:
     *
     *       {
     *           "code": 0,
     *           "msg": "",
     *           "data": []
     *       }    
     */
    function addForceSubscribeUsers(Request $request) {

        $uid = $request->has('uid') ? $request->input('uid') : '';
        if(empty($uid)) {
            return response()->error("PARAM_EMPTY");
        }
        $appid = $request->has('appid') ? $request->input('appid') : '';
        if(empty($appid)) {
            return response()->error("PARAM_EMPTY");
        }
        $openid = $request->has('openid') ? $request->input('openid') : '';
        if(empty($openid)) {
            return response()->error("PARAM_EMPTY");
        }
        $is_subscribed = $request->has('is_subscribed') ? $request->input('is_subscribed') : '1';

        $distribution_channel_id = $request->has('distribution_channel_id') ? $request->input('distribution_channel_id') : '';

        $last_interactive_time = date("Y-m-d H:i:s");

        $unionid = $request->has('unionid') ? $request->input('unionid') : '1';

        $province = $request->has('province') ? $request->input('province') : '';

        $city = $request->has('city') ? $request->input('city') : '';

        $country = $request->has('country') ? $request->input('country') : '';

        $nick_name = $request->has('nick_name') ? $request->input('nick_name') : '';

        $sex = $request->has('sex') ? $request->input('sex') : '';

        $headimgurl = $request->has('head_img') ? $request->input('head_img') : '';

        $forceSubscribeUsers['uid'] = $uid;
        $forceSubscribeUsers['appid'] = $appid;
        $forceSubscribeUsers['openid'] = $openid;
        $forceSubscribeUsers['nick_name'] = $nick_name;
        $forceSubscribeUsers['is_subscribed'] = $is_subscribed;
        $forceSubscribeUsers['distribution_channel_id'] = $distribution_channel_id;
        $forceSubscribeUsers['last_interactive_time'] = $last_interactive_time;
        $forceSubscribeUsers['unionid'] = $unionid;
        $forceSubscribeUsers['province'] = $province;
        $forceSubscribeUsers['city'] = $city;
        $forceSubscribeUsers['country'] = $country;
        $forceSubscribeUsers['sex'] = $sex;
        $forceSubscribeUsers['headimgurl'] = $headimgurl;


        $resultStatus = ForceSubscribeService::addForceSubscribeUsers($forceSubscribeUsers);

        // 更新交互中间表
        $tempResultStatus = ForceSubscribeService::tempForceSubscribeUsersLastTimeUpdate($forceSubscribeUsers);
        
        // 插入关注记录表
        $subscribe_record = [
	        'appid'=>$appid,
	        'openid'=>$openid,
	        'distribution_channel_id'=>$distribution_channel_id,
	        'is_subscribed'=>1,
	        'subscribe_time'=>date('Y-m-d H:i:s'),
        ];
        SubscribeRecord::create_subscribe_record($subscribe_record);
        
        if ($resultStatus == 1) {
            return response()->success();
        }elseif ($resultStatus == 2) {
            return response()->error('ADDFORCESUBSCRIBEUSER_UNSUCCESSFUL');
        }elseif ($resultStatus == 0) {
            return response()->error('ADDFORCESUBSCRIBEUSER_UNSUCCESSFUL');
        }else{
            return response()->error('ADDFORCESUBSCRIBEUSER_UNSUCCESSFUL');
        }

    }



    /**
     * @apiVersion 1.0.0
     * @api {GET} OfficialAccount/ForceSubscribeUsersLastTimeUpdate 强关用户与公众号最后交互时间更新
     * @apiGroup OfficialAccount
     * @apiName ForceSubscribeUsersLastTimeUpdate
     * @apiParam {Number}  openid 公众号openid.
     * @apiParam {String}  last_interactive_time 强关用户与公众号最后交互时间.
     * @apiSuccessExample {json} Success-Response:
     *
     *       {
     *           "code": 0,
     *           "msg": "",
     *           "data": []
     *       }    
     */
    function forceSubscribeUsersLastTimeUpdate(Request $request) {
        $openid = $request->has('openid') ? $request->input('openid') : '';
        \Log::info('forceSubscribeUsersLastTimeUpdate_start:'.$openid);
        
        if(empty($openid)) {
            return response()->error("PARAM_EMPTY");
        }
        $last_interactive_time = $request->has('last_interactive_time') ? $request->input('last_interactive_time') : '';
        if(empty($last_interactive_time)) {
            return response()->error("PARAM_EMPTY");
        }
        $distribution_channel_id = $request->has('distribution_channel_id') ? $request->input('distribution_channel_id') : '';
        $forceSubscribeUsers['distribution_channel_id'] = $distribution_channel_id;
        
        $appid = $request->has('appid') ? $request->input('appid') : '';
        $forceSubscribeUsers['appid'] = $appid;
        
        $forceSubscribeUsers['openid'] = $openid;
        $forceSubscribeUsers['last_interactive_time'] = $last_interactive_time;
        $resultStatus = ForceSubscribeService::forceSubscribeUsersLastTimeUpdate($forceSubscribeUsers);
        
        // 更新交互中间表
        $tempResultStatus = ForceSubscribeService::tempForceSubscribeUsersLastTimeUpdate($forceSubscribeUsers);
        
        if ($resultStatus == 1) {
            return response()->success();
        }elseif ($resultStatus == 2) {
            return response()->error("FORCESUBSCRIBEUSER_NOT_FOUND");
        }elseif ($resultStatus == 0) {
            return response()->error('UPDATEFORCESUBSCRIBEUSER_UNSUCCESSFUL');
        }else{
            return response()->error('UPDATEFORCESUBSCRIBEUSER_UNSUCCESSFUL');
        }
    }

    /**
     * @apiVersion 1.0.0
     * @api {GET} OfficialAccount/updateForceSubscribeUsers 强关用户强制更新uid
     * @apiGroup OfficialAccount
     * @apiName updateForceSubscribeUsers
     * @apiParam {Number}  openid 公众号openid.
     * @apiParam {String}  uid 强关用户uid.
     * @apiSuccessExample {json} Success-Response:
     *
     *       {
     *           "code": 0,
     *           "msg": "",
     *           "data": []
     *       }
     */
    function updateForceSubscribeUsers(Request $request) {
    
    	$openid = $request->has('openid') ? $request->input('openid') : '';
    	if(empty($openid)) {
    		return response()->error("PARAM_EMPTY");
    	}
    	$uid = $request->has('uid') ? $request->input('uid') : '';
    	if(empty($uid)) {
    		return response()->error("PARAM_EMPTY");
    	}
    	
    	$forceSubscribeUsers = array();
    	$forceSubscribeUsers['openid'] = $openid;
    	$forceSubscribeUsers['uid'] = $uid;
    	$resultStatus = ForceSubscribeService::updateSubscribeUsersUid($forceSubscribeUsers);
    	if ($resultStatus == 1) {
    		return response()->success();
    	}elseif ($resultStatus == 2) {
    		return response()->error("FORCESUBSCRIBEUSER_NOT_FOUND");
    	}elseif ($resultStatus == 0) {
    		return response()->error('UPDATEFORCESUBSCRIBEUSER_UNSUCCESSFUL');
    	}else{
    		return response()->error('UPDATEFORCESUBSCRIBEUSER_UNSUCCESSFUL');
    	}
    }

    /**
     * @apiVersion 1.0.0
     * @api {GET} OfficialAccount/cancelForceSubscribeUsers 取消用户强制关注
     * @apiGroup OfficialAccount
     * @apiName cancelForceSubscribeUsers
     * @apiParam {Number}  uid 用户id.
     * @apiParam {Number}  openid 公众号openid.
     * @apiSuccessExample {json} Success-Response:
     *
     *       {
     *           "code": 0,
     *           "msg": "",
     *           "data": []
     *       }    
     */
    function cancelForceSubscribeUsers(Request $request) {

        // $uid = $request->has('uid') ? $request->input('uid') : '';
        $openid = $request->has('openid') ? $request->input('openid') : '';
        if(empty($openid)) {
            return response()->error("PARAM_EMPTY");
        }

        $appid = $request->has('appid') ? $request->input('appid') : '';
        if(empty($appid)) {
            return response()->error("PARAM_EMPTY");
        }
        $distribution_channel_id = $request->has('distribution_channel_id') ? $request->input('distribution_channel_id') : '';
        $forceSubscribeUsers['distribution_channel_id'] = $distribution_channel_id;
        
        $forceSubscribeUsers['openid'] = $openid;

        $forceSubscribeUsers['appid'] = $appid;

        $resultStatus = ForceSubscribeService::cancelForceSubscribeUsers($forceSubscribeUsers);

        $unsubscribe_data = [
            'openid'=>$openid,
            'appid'=>$appid,
            'is_subscribed'=>0,
            'distribution_channel_id'=>$distribution_channel_id,
            'unsubscribe_time'=>date('Y-m-d H:i:s')
        ];
        // 更新交互中间表
        $tempResultStatus = ForceSubscribeService::updateTempForceUser($unsubscribe_data);
        
        // 插入关注记录表
        SubscribeRecord::create_subscribe_record($unsubscribe_data);
        
        if ($resultStatus == 1) {
            return response()->success();
        }elseif ($resultStatus == 2) {
            return response()->error("FORCESUBSCRIBEUSER_NOT_FOUND");
        }elseif ($resultStatus == 0) {
            return response()->error('UPDATEFORCESUBSCRIBEUSER_UNSUCCESSFUL');
        }else{
            return response()->error('CANCELFORCESUBSCRIBEUSER_UNSUCCESSFUL');
        }
        
    }


     /**
     * @apiVersion 1.0.0
     * @api {POST} OfficialAccount/subscribeForceSubscribeUsers 更新用户为强制关注
     * @apiGroup OfficialAccount
     * @apiName addForceSubscribeUsers
     * @apiParam {Number}  uid 用户id.
     * @apiParam {Number}  official_account_id 公众账号id.
     * @apiParam {Number}  distribution_channel_id 分配的渠道id.
     * @apiParam {Number}  openid 公众号openid.
     * @apiParam {Number}  appid 微信appID.
     * @apiParam {Number}  is_subscribed 是否强关.
     * @apiParam {String}  subscribe_time 强关时间.
     * @apiParam {String}  unsubscribe_time 取关时间.
     * @apiParam {String}  last_interactive_time 强关用户与公众号最后交互时间.
     * @apiSuccessExample {json} Success-Response:
     *
     *       {
     *           "code": 0,
     *           "msg": "",
     *           "data": []
     *       }    
     */
    function subscribeForceSubscribeUsers(Request $request) {

        $appid = $request->has('appid') ? $request->input('appid') : '';
        if(empty($appid)) {
            return response()->error("PARAM_EMPTY");
        }
        $openid = $request->has('openid') ? $request->input('openid') : '';
        if(empty($openid)) {
            return response()->error("PARAM_EMPTY");
        }
        

        $distribution_channel_id = $request->has('distribution_channel_id') ? $request->input('distribution_channel_id') : '';

        $last_interactive_time = date("Y-m-d H:i:s");

        $forceSubscribeUsers = ForceSubscribeUsers::getOneForceSubscribeUsersByOpenid($openid);
        if(count($forceSubscribeUsers) > 0){
        	$forceSubscribeUsers = $forceSubscribeUsers->toArray();
        }

        $forceSubscribeUsers['appid'] = $appid;
        $forceSubscribeUsers['openid'] = $openid;
        $forceSubscribeUsers['distribution_channel_id'] = $distribution_channel_id;
        $forceSubscribeUsers['last_interactive_time'] = $last_interactive_time;
        $resultStatus = ForceSubscribeService::subscribeForceSubscribeUsers($forceSubscribeUsers);
        ForceSubscribeService::tempSubscribeForceSubscribeUsers($forceSubscribeUsers);
        
        // 插入关注记录表
        $subscribe_record = [
	        'appid'=>$appid,
	        'openid'=>$openid,
	        'distribution_channel_id'=>$distribution_channel_id,
	        'is_subscribed'=>1,
	        'subscribe_time'=>date('Y-m-d H:i:s'),
        ];
        SubscribeRecord::create_subscribe_record($subscribe_record);
        
        if ($resultStatus == 1) {
            return response()->success();
        }elseif ($resultStatus == 2) {
            return response()->error("FORCESUBSCRIBEUSER_NOT_FOUND");
        }elseif ($resultStatus == 0) {
            return response()->error('UPDATEFORCESUBSCRIBEUSER_UNSUCCESSFUL');
        }else{
            return response()->error('CANCELFORCESUBSCRIBEUSER_UNSUCCESSFUL');
        }

    }

    //------------------------------------方法测试--


    function  testSendTextOfficialMsg(Request $request) {

        $user['uid'] = 13;
        $user['last_interactive_time'] = '2017-12-19 01:11:12';
        $user['distribution_channel_id'] = 1;
        $user['appid'] = 'wxdbc486f1b4f6a8c3';
        $user['openid'] = 'oAcqg1Lc9cjEPznNcjU_6oi1Wj0s';
        $user['is_subscribed'] = 1;
        $user['id'] = 16;
        $user['bid'] = 3;

        // CustomMsgService::add_news_top_book_test($user);
        CustomMsgService::add_news_top_book();
        
        return response()->success(['success'=>1]);
    }


    function forceSubscribeUserCountByChannelIdAndDate(Request $request) {

        $distribution_channel_id = $request->has('distribution_channel_id') ? $request->input('distribution_channel_id') : '';
        if(empty($distribution_channel_id)) {
            return response()->error("PARAM_EMPTY");
        }

        $startTime = $request->has('startTime') ? $request->input('startTime') : '';
        if(empty($startTime)) {
            return response()->error("PARAM_EMPTY");
        }

        $endTime = $request->has('endTime') ? $request->input('endTime') : '';
        if(empty($startTime)) {
            return response()->error("PARAM_EMPTY");
        }

        $usersCount = ForceSubscribeService::forceSubscribeUserCountByChannelIdAndDate($distribution_channel_id,$startTime,$endTime);

        return response()->success($usersCount);
        
    }


    function  customerImgUrlByChannelId(Request $request) {


        $distribution_channel_id = $request->has('distribution_channel_id') ? $request->input('distribution_channel_id') : '';

        if(empty($distribution_channel_id)) {
            return response()->error("PARAM_EMPTY");
        }

        $distributionChannelSetting = CustomMsgService::customerImgUrlByChannelId($distribution_channel_id);
        if (!empty($distributionChannelSetting)) {
            # code...
            return response()->success($distributionChannelSetting['customer_img_url']);
        }else{
            return response()->success(['data'=>0]);
        }
        
    }
    
    /**
     * 得到素材强关的映射关系(distribution_channel_id,openid => uid)
     * @param Request $request
     */
    function getMaterialForceSubscribeMapping(Request $request) {
    
    	$distribution_channel_id = $request->has('distribution_channel_id') ? $request->input('distribution_channel_id') : '';
    	if(empty($distribution_channel_id)) {
    		return response()->error("PARAM_EMPTY");
    	}
    
    	$openid = $request->has('openid') ? $request->input('openid') : '';
    	if(empty($openid)) {
    		return response()->error("PARAM_EMPTY");
    	}
    
    	$material_force_subscribe_mapping = ForceSubscribeService::getMaterialForceSubscribeMapping($distribution_channel_id,$openid);
    
    	return response()->success($material_force_subscribe_mapping);
    
    }


    function  uploadCustomerImgUrl(Request $request) {

        $distribution_channel_id = $request->has('distribution_channel_id') ? $request->input('distribution_channel_id') : '';

        if(empty($distribution_channel_id)) {
            return response()->error("PARAM_EMPTY");
        }
        // dd($request->hasFile('photo')); 
        if ($request->hasFile('photo')) {
            // dd(11);
            // $imagePath = $path = $request->photo->store('images');
            $file = $request->file('photo'); 

            $ossImgBackData = $this->ossObject()->uploadFile(env('OSS_BUCKET','yueduyun'), 'service/customimage_'.$distribution_channel_id.'_'.time().'.'.$file->getClientOriginalName(), $file->path());
            
            $ossImg = $ossImgBackData['oss-request-url'];

            $customerImgPram['distribution_channel_id'] = $distribution_channel_id;

            $customerImgPram['customer_img_url'] = $ossImg;

            $sustomMsgService = CustomMsgService::updateCustomerImgUrl($customerImgPram);

            return response()->item(new CustomMsgControllerTransformer(), $sustomMsgService);


        }   
 
    }


    function ossObject()
    {
        $accessKeyId = env('OSS_ACCESS_ID');
        $accessKeySecret = env('OSS_ACCESS_KEY');
        $endpoint = env('OSS_END_POINT');
        $ossClient = null;
        try {
            $ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint);
        } catch (OssException $e) {
            return null;
        }
        return $ossClient;
    }






    
}