<?php

namespace App\Http\Controllers\Api\V1;

use App\Models\AccountLog;
use App\Models\BaseSettingsModel;
use App\Models\DreamImages;
use App\Models\DreamInfoModel;
use App\Models\InteractionInfo;
use App\Models\SearchInfoModel;
use App\Models\SupportDreamModel;
use App\Models\SystemInfoModel;
use App\Models\UserCareDream;
use App\Models\UserInfoModel;
use Illuminate\Http\Request;
use App\Services\Base\ErrorCode;

class DreamController extends Controller
{
    /**
     * @api {get} /api/dream/show    梦想详情
     * @apiDescription 梦想详情
     * @apiGroup Dream
     * @apiPermission Passport
     * @apiVersion 0.1.0
     * @apiParam {int} type home interaction paihang  默认all
     * @apiParam {int} id 梦想ID
     * @apiSuccessExample {json} Success-Response:
     * HTTP/1.1 200 OK
     *               主页
    {
        "status": true,
        "status_code": 0,
        "message": "",
        "data": {
            "dream": {                             梦想
                "id": 4,
                "user_id": 1,
                "name": "梦想标题1",
                "about": "梦想介绍",
                "coin": 2500,
                "time": 21,
                "get_coin": 600,
                "status": 0,
                "video": null,
                "score": 100079365,
                "sign": "",
                "created_at": "2017-06-25 11:47:45",
                "updated_at": "2017-06-25 15:10:50",
                "is_collection" : 1                         1已收藏  0未收藏
                "top3user": [                              支持者前三
                    {
                        "id": 2,
                        "phone": "13880642881",
                        "nickname": "name2",
                        "avatar": "https://timgsa.baidu.com/timg?imamb.224_0.jpeg",
                        "score": 2399
                    }
                ],
                "number": 1                                支持乘数
                "imgs": [                                  梦想图片
                    {
                        "title": "",
                        "pic": "https://timgsa.ba0170524%2Feaca9092ca852e6e9c6ec46b7b14f12f.jpg"
                    },
                    {
                        "title": "",
                        "pic": "https://timgsa.baid524%2Feaca9092ca852e6e9c6ec46b7b14f12f.jpg"
                    },
                    {
                        "title": "",
                        "pic": "https://timgsa20170524%2Feaca9092ca852e6e9c6ec46b7b14f12f.jpg"
                    }
                ],
                "user": {                            梦想用户
                    "id": 1,
                    "phone": "13880642880",
                    "nickname": "name1",
                    "avatar": "https://timgsumb.224_0.jpeg",
                    "birthday": "2000-06-21",
                    "sign": 0,
                    "money": 0,
                    "coin": 1300,
                    "sex": 1,
                    "signture": "",
                    "height": 170,
                    "work": "",
                    "emotion": 1,
                    "address": "",
                    "city": "",
                    "detail_address": "",
                    "status": 1,
                    "wechat": "",
                    "weibo": "",
                    "remember_token": "",
                    "created_at": "2017-06-25 10:27:08",
                    "updated_at": "2017-06-25 15:20:11",
                    "deleted_at": null
                }
            }
        }
    }
     * @apiErrorExample {json} Error-Response:
     *HTTP/1.1 400 Bad Request
     *{
     *  "status": false,
     *  "status_code": 1105,
     *  "message": "用户不存在",
     *  "data": null
     * }
     */
    public function show(Request $request)
    {
        $user = $this->getUser();
        $type = $request->type;    //类型
        $id = $request->id;    //梦想ID
        $user_care_dream = UserCareDream::where('user_id',$user->id)->where('dream_id',$id)->first();
        $is_collection = empty($user_care_dream) ? 0 :1 ;
        if (empty($id)) return $this->error(ErrorCode::KEY_ERROR);

        $support_dream = SupportDreamModel::where('dream_id',$id)->get();
        $top = [] ;
        $topuser = [];    //所有支持用户排行
        $top3user = [];   //  支持用户排行前三
        foreach ($support_dream as $item) {
            if (!array_key_exists($item->user_id,$top)) {
                $top[$item->user_id] = $item->score;
            }else{
                $top[$item->user_id] += $item->score;
            }
        }
        arsort($top);
        foreach ($top as $user_id => $score){
            $user = UserInfoModel::find($user_id);
            $user->score = $score;
            $topuser[] = $user;
            if(count($top3user) <= 2) $top3user[] = $user ;
        }
        if ($type == 'paihang') return $this->api($topuser);
        $interactions = InteractionInfo::where('dream_id',$id)->orderBy('id','desc')->get();
        foreach ($interactions as $item) {
            $item->comments;
            foreach ($item->comments as $comment) {
                $comment->pic = UserInfoModel::find($comment->user_id)->pic;
                $comment->replay;
                foreach ($comment->replay as $k1 => $v1){
                    $v1->pic =  UserInfoModel::find($v1->user_id)->pic;
                }
            }
        }
        if ($type == 'interaction') return $this->api($interactions);
//            梦想  图片  支持者前三    支持乘数参数    用户余额   梦想分数

//            $money = $user->money;
        $dream_info = DreamInfoModel::find($id);
        $setting = BaseSettingsModel::where('category','score')->select('key','value')->first();
        $a = count($setting) > 0 ? $setting->key : 0;
        $created_at = $dream_info ? $dream_info->created_at : 0;
        $b =  intval((time()-strtotime($created_at))/60) ;
        $c = count($setting) > 0 ? $setting->value : 0;
        //Todo 支持乘数目公式
        $number =round( -$a * $b + $c,1);
        if ($number <= 1) $number = 1;
        $dream = DreamInfoModel::with(['imgs','user'])->find($id);
        $dream->topuser = $topuser;
        $dream->top3user = $top3user;
        $dream->interactions = $interactions;
        $dream->number = $number;
        $dream->is_collection = $is_collection;
        $dream->a = $a;
        $dream->c = $c;
        return $this->api($dream);
    }

    /**
     * @api {post} /api/dream/support 支持梦想
     * @apiDescription 支持梦想
     * @apiGroup Dream
     * @apiPermission Passport
     * @apiVersion 0.1.0
     * @apiParam {int} coin 支持梦想币数量
     * @apiParam {int} id 梦想ID
     * @apiSuccessExample {json} Success-Response:
     * HTTP/1.1 200 OK
    {
        "status": true,
        "status_code": 0,
        "message": "",
        "data": {
                "id": 12,
                "user_id": 2,
                "name": "用户2梦想标题166",
                "about": "用户2梦想介绍666",
                "coin": 2500,
                "time": 21,
                "get_coin": 704,
                "status": 0,
                "video": null,
                "score": 158730,
                "mark": 158730,
                "sign": "",
                "created_at": "2017-06-25 13:10:56",
                "updated_at": "2017-06-27 18:16:02",
                "top3user": [                               支持者前三
                    {
                        "id": 1,
                        "phone": "13880642880",
                        "nickname": "name1",
                        "avatar": "https://timgsa.bumb.224_0.jpeg",
                        "birthday": "2000-06-21",
                        "sign": 0,
                        "money": 0,
                        "coin": 596,
                        "sex": 1,
                        "signture": "我的个性签名1",
                        "height": 170,
                        "work": "网红",
                        "emotion": 1,
                        "address": "",
                        "city": "上海",
                        "detail_address": "",
                        "status": 1,
                        "wechat": "",
                        "weibo": "",
                        "remember_token": "",
                        "created_at": "2017-06-25 10:27:08",
                        "updated_at": "2017-06-27 18:16:02",
                        "deleted_at": null,
                        "score": 5062
                    }
                ]
            "number": 4.8
            "is_collection" : 1              1已收藏   0未收藏

    }
    }
     * @apiErrorExample {json} Error-Response:
     *HTTP/1.1 400 Bad Request
     * {
     *     "state": false,
     *     "code": 1000,
     *     "message": "传入参数不正确",
     *     "data": null or []
     * }
     *  可能出现的代码
     * {
     *       "status": false,
     *       "status_code": 1303,
     *       "message": "余额不足",
     *       "data": null
     *  }
     *
     */
    public function support(Request $request)
    {
        $validator = \Validator::make($request->all(),
            [
                'coin'  => 'required',
                'id'  => 'required',
            ],
            [
                'coin.required'  => '梦想币不能为空',
                'id.required'  => '支持梦想id不能为空',
            ]
        );
        if($validator->fails()) return $this->validatorError($validator->messages()->all(),ErrorCode::CLIENT_WRONG_PARAMS);
        $user = $this->getUser();
        $dream_id = $request->id;
        $dream = DreamInfoModel::find($dream_id);
        $user_id = $dream->user_id;
        $coin = $request->coin;
        $user_care_dream = UserCareDream::where('user_id',$user->id)->where('dream_id',$dream_id)->first();
        $is_collection = empty($user_care_dream) ? 0 :1 ;
        $setting = BaseSettingsModel::where('category','score')->select('key','value')->first();
        $a = count($setting) > 0 ? $setting->key : '';
        $b =  intval((time()-strtotime($dream->created_at))/60) ;
        $c = count($setting) > 0 ? $setting->value : '';
        //Todo 支持乘数目公式
        $number =round( -$a * $b + $c,1);
        if ($number <= 1) $number = 1;

        if ($user->coin < $coin) {
            return $this->error(ErrorCode::COIN_NOT_ENOUGH);
        }else{
            $user->coin  -= $coin;
            $user->save();
            $dream->get_coin += $coin;
            $dream->mark += $coin*$number;
            $dream->save();
            $data = [
                'user_id'=>$user->id,
                'dream_id'=>$dream_id,
                'to_user_id'=>$user_id,
                'coin'=>$coin,
                'score'=>$coin*$number,
            ];
            $ok =   SupportDreamModel::create($data);
            if (!$ok) {
                return $this->error(ErrorCode::MERCHANT_SERVICE_STATUS_INVALID);
            }
            //                记录充值记录     新增系统消息
            $data = [
                'from_id' =>$user->id,
                'to_id' => $user_id,
                'from_amount' => $coin,
                'to_amount' => $coin,
                'from_type' => AccountLog::TYPE_COIN,
                'to_type' =>  AccountLog::TYPE_COIN,
                'op' =>  AccountLog::OP_SUPPORT,
            ];
            AccountLog::create($data);
            $message = UserInfoModel::find($user->id)->nickname.'为你的梦想捐赠'.$coin.'梦想币';
            $info = [
                'user_id' => $user_id,
                'message' => $message,
            ];
            SystemInfoModel::create($info);

//            支持成功返回数据到当前页面   top3user
            $support_dream = SupportDreamModel::where('dream_id',$dream_id)->get();
            $top = [] ;
            $top3user = [];   //  支持用户排行前三
            foreach ($support_dream as $item) {
                if (!array_key_exists($item->user_id,$top)) {
                    $top[$item->user_id] = $item->score;
                }else{
                    $top[$item->user_id] += $item->score;
                }
            }
            arsort($top);
            foreach ($top as $user_id => $score){
                $user = UserInfoModel::find($user_id);
                $user->score = $score;
                if(count($top3user) <= 2) $top3user[] = $user ;
            }
//            梦想分 mark
            $dream->top3user = $top3user;
            $dream->is_collection = $is_collection;
            $user_coin = $user->coin;
            return $this->api(compact('dream','user_coin'));
        }
    }

//    收藏关注梦想
    /**
     * @api {get} /api/dream/collection 收藏梦想
     * @apiDescription 收藏梦想
     * @apiGroup Dream
     * @apiPermission Passport
     * @apiVersion 0.1.0
     * @apiParam {int} id 梦想ID
     * @apiParam {int} is_collection 0取消关注 1关注
     * @apiSuccessExample {json} Success-Response:
     * HTTP/1.1 200 OK
     *{
     *      "status": true,
     *      "status_code": 0,
     *      "message": "",
     *     "data": {
     *          "is_collection": 1       1已关注 0 未关注
     *      }
     *}
     * @apiErrorExample {json} Error-Response:
     *HTTP/1.1 400 Bad Request
     * {
     *     "state": false,
     *     "code": 1000,
     *     "message": "传入参数不正确",
     *     "data": null or []
     * }
     *
     */
    public function collection(Request $request)
    {

        $validator = \Validator::make($request->all(),
            [
                'id'  => 'required',
                'is_collection'  => 'required',
            ],
            [
                'id.required'  => '收藏梦想id不能为空',
                'is_collection.required'  => '关注值不存在',
            ]
        );
        if($validator->fails()) return $this->validatorError($validator->messages()->all(),ErrorCode::CLIENT_WRONG_PARAMS);

        $user = $this->getUser();
        if(!$dream = DreamInfoModel::find($request->id)){
            $this->error(ErrorCode::CLIENT_WRONG_PARAMS);
        }

        $data = [
            'user_id' =>$user->id,
            'dream_id' =>$request->id,
            'dream_user_id' =>$dream->user_id,
        ];
        $is_collection = $request->is_collection;
        $user_care_dream = UserCareDream::where('user_id',$user->id)->
            where('dream_id',$request->id)->first();
        if ($is_collection) {
            if (empty($user_care_dream)) {
                UserCareDream::create($data);
            }
        }else{
            UserCareDream::where('user_id',$user->id)->
            where('dream_id',$request->id)->delete();
        }
        return $this->api($is_collection);

    }

    /**
     * @api {get}  /api/dream/search 梦想搜索
     * @apiDescription 梦想搜索)
     * @apiGroup Dream
     * @apiPermission none
     * @apiVersion 0.1.0
     * @apiParam {string}  keyword   关键字
     * @apiSuccessExample {json} Success-Response:
     * HTTP/1.1 200 OK
     *{
     *   "status": true,
     *   "status_code": 0,
     *   "message": "",
     *   "data": {
     *       "data": [
     *           {
     *              "dream": "haha",  梦想名
     *               "user_pic": [
     *               {
     *                  "pic": "",   用户头像
     *               }
     *               ],
     *              "dream_img": "",  梦想图片
     *          }
     *       ]
     *   }
     *}
     * @apiErrorExample {json} Error-Response:
     * HTTP/1.1 400 Bad Request
     */
    public function search(Request $request)
    {
        $user = $this->getUser();
        if (empty($request->keyword)) {
            return $this->api('');
        }
        $keyword ='%'.$request->keyword.'%';
        $data = DreamInfoModel::where('dream','like',$keyword)->
        orWhere('sign','like',$keyword)->get();
        foreach ($data as $k => $value) {
            $value->user_pic = $value->dreamFindUser;
            $value->dream_img = $value->dreamImgsFirst->pic;
        }
        $this->insertSearchTable($user->id,$request->keyword);
        return $this->api(compact('data'));
    }

    public function insertSearchTable($id,$keyword)
    {
        $info = SearchInfoModel::where('user_id',$id)->
        where('search',trim($keyword))->first();
        if (count($info) == 0) {
            SearchInfoModel::create(['user_id'=>$id,'search'=>trim($keyword),'times'=>1]);
        }else{
            $info->times += 1;
            $info->save();
        }

    }

    /**
     * @api {post} /api/dream/store 发布梦想
     * @apiDescription 发布梦想
     * @apiParam {string}  pics          梦想图片 数组
     * @apiParam {string}  video         梦想视频
     * @apiParam {string}  name          梦想标题
     * @apiParam {string}  about         梦想介绍
     * @apiParam {int}  coin             梦想币
     * @apiParam {int}  time             实现时间默认21*3600
     * @apiGroup Dream
     * @apiPermission Passport
     * @apiVersion 0.1.0
     * @apiSuccessExample {json} Success-Response:
     * {
     *    "status": true,
     *   "status_code": 0,
     *   "message": "",
     *    "data": ""
     *}
     * HTTP/1.1 200 OK
     * @apiErrorExample {json} Error-Response:
     * {
     *    "status": false,
     *    "status_code": 1203,
     *    "message": "附件不存在",
     *    "data": null
     * }
     * HTTP/1.1 400 Bad Request
     */
    public function store(Request $request)
    {
        $user = $this->getUser();
        $validator = \Validator::make($request->all(),
            [
                'name'  => 'required',
                'about'  => 'required',
                'coin'  => 'required|integer',
                'time'  => 'required|integer',
            ],
            [
                'name.required'  => '梦想标题必填',
                'about.required'  => '梦想介绍必填',
                'coin.required'  => '梦想币必填',
                'coin.integer'  => '梦想币必须是正整数',
                'time.required'  => '实现时间必填',
                'time.integer'  => '实现时间必须是正整数',
            ]
        );
        if($validator->fails()) return $this->validatorError($validator->messages()->all(),ErrorCode::CLIENT_WRONG_PARAMS);
        \Log::debug($user);
        $data2 = $user->myCareNum;
        $care_num = count($data2);
        $setting = BaseSettingsModel::where('category','paihang')->first();
        $a = $setting?$setting->key:1;
        $b = $setting?$setting->value:1;
        $t = 21*3600 / 60;

        $data = $request->except('_token','pics');
        $data['user_id'] = $user->id;
        $data['time'] = 21*3600;
        \Log::debug(' care_num:'.$care_num.' a:'.$a.' b:'.$b.' t:'.$t);
        if ($care_num == 0) {
            $data['score'] = (($a/$t) + $b)*100000000 ;
        }else{
            $data['score'] = (log($care_num) + ($a/$t) + $b)*100000000 ;
        }
        $data['created_at'] = date('Y-m-d H:i:s');
        $data['updated_at'] = date('Y-m-d H:i:s');
        $dream_id = DreamInfoModel::insertGetId($data);

        if ($dream_id) {
//            梦想创建成功 关联关系中最新动态+1
            /*         $info = UserCareUser::where('other_user_id',$user->id)->paginate(20);
                     foreach ($info as $item) {
                         $item->dream_num += 1;
                         $item->updated_at = date('Y-m-d H:i:s');
                         $item->save();
                     }*/
            $pics = $request->pics;
            $video = $request->video;
            if (!is_array($pics) && empty($pics) && empty($video)) {
                DreamInfoModel::destroy($dream_id);
                return $this->error(ErrorCode::ATTACHMENT_NOT_EXIST);
            }
            $data = [];
            if (is_array($pics)) {
                foreach ($pics as $v){
                    $data[] = [
                        'dream_id'=>$dream_id,
                        'pic' => $v,
                        'created_at' =>date('Y-m-d H:i:s'),
                        'updated_at' =>date('Y-m-d H:i:s'),
                    ];
                }
                DreamImages::insert($data);
            }
            return $this->api('');
        }
    }

}
