<?php

namespace App\Http\Controllers\Api;

use App\Exceptions\FormException;
use App\Model\LogModel;
use App\Model\MediaCategoryModel;
use App\Model\MediaModel;
use App\Model\QiniuModel;
use App\Tool\Constant;
use App\Tool\SrsHookValidate;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use MongoBinData;

use MongoDB\BSON\UTCDateTime;
use Qiniu\Auth;

class MediaController extends Controller
{

    /**
     * 获取媒资ID
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     * @throws \App\Exceptions\ControllerException
     */
    public function media_list(Request $request)
    {

        $result = handler_drive(function () use ($request) {

            SrsHookValidate::srsHookCallback($request, [
                'params' => 'required'
            ]);

            return MediaModel::getMediaList($request);

        });

        return success($result);
    }

    /**
     * 获取媒资播放地址
     * @param Request $request
     * @param $media_id
     * @return \Illuminate\Http\JsonResponse
     * @throws \App\Exceptions\ControllerException
     */
    public function play_url(Request $request, $media_id)
    {

        $result = handler_drive(function () use ($request, $media_id) {
            return MediaModel::playUrl($media_id);
        });

        return success($result);

    }


    /**
     * 获取媒资列表
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     * @throws \App\Exceptions\ControllerException
     */
    public function mediaListOnce(Request $request)
    {

        $res = handler_drive(function () use ($request) {

            SrsHookValidate::srsHookCallback($request, [
                'page' => 'integer',
                'sort' => '',
                'page_size' => 'integer',
                'start_time' => 'date',
                'end_time' => 'date',
                'category_id' => ''
            ]);

            if (!isset($request->category_id)) {
                $request->replace(array_merge($request->all(), ['category_id' => '5efa9cb5d16f5a214671fd86']));
            }

            return MediaModel::mediaList($request);

        });

        return success($res);
    }


    public function test(Request $request)
    {

        $res = [];

        for ($i = 0; $i <= 5; $i++) {

            $url = "http://eoffcn.com/api/user/media_list_once?page=" . $i . '&page_size=1000';
            $result = http_request_code($url, null, 'GET');

            $medias = json_decode($result, true);

            if (isset($medias['data']['data']) && !empty($medias['data']['data'])) {

                $data = $medias['data']['data'];


                if (!empty($data)) {

                    foreach ($data as $media) {
                        $tmp_arr = MediaModel::where("media_name", $media['media_name'])->where("media_type_id", "5efa9ca25b742508e81f2d55")->get();
                        if (count($tmp_arr) >= 2) {

                            var_dump($media);
                            MediaModel::deleteMediaById($request, $media["_id"]);

                        }

                    }
                }

            }
            echo "sleep";

        }

        return success($res);

    }


    /**
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     * @throws \App\Exceptions\ControllerException
     */
    public function handleMediaUrl(Request $request)
    {
        $res = handler_drive(function () use ($request) {
            SrsHookValidate::srsHookCallback($request, [
                'media_name' => '',
                'username' => '',
                'page' => 'integer',
                'media_id' => '',
                'description' => '',
                'sort' => '',
                'page_size' => 'integer',
            ]);
            return MediaModel::handleMediaUrl($request);
        });
        return success($res);
    }


    /**
     * 视频上传成功之后，回调重新上传
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     * @throws \App\Exceptions\ControllerException
     */
    public function hookRestoreMedia(Request $request)
    {


        $id = handler_drive(function () use ($request) {
            SrsHookValidate::srsHookCallback($request, array_merge([
                'media_name' => 'required',
                'secret_key' => '',
                'media_url' => 'required',
                'description' => '',
                'duration' => '',
                'media_type' => '',
                'shop_id' => '',
                'status'  => '',
                'is_fake' => '',
            ]));

            LogModel::addlog(["loghookRestoreMedia" => $request->all()]);

            $data_time = Carbon::now();
            $params = array(
                'media_id' => MediaModel::getMediaId(),
                'media_type' => '5efa9cb5d16f5a214671fd86',//默认，中公网校
                'start_time' => $data_time,
                'end_time' => $data_time,
                'access_key' => '',
                'description' => $request->description ?? '',
                'is_fake' => $request->is_fake??'',
            );
            //shop_id为100时，代表的是北大学堂的视频
            if ($request->shop_id == '100') {
                $catg = MediaCategoryModel::getCategoryByName("北大学堂");
                $params['media_type'] = $catg['_id'];
            }
            $request->replace(array_merge($request->all(), $params));
            $id = MediaModel::hookRestoreMedia($request);
            return $id;
        });
        return success($id);
    }

    /**
     * 更新百度status
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     * @throws \App\Exceptions\ControllerException
     */
    public function updateMediaStatus(Request $request, $media_id)
    {
        $id = handler_drive(function () use ($request, $media_id) {
            SrsHookValidate::srsHookCallback($request, [
                'status' => '',
                'secret_key' => '',
                'media_url' => '',
                'media_name' => '',
                'description' => '',
                'duration' => '',
                'media_type' => '',
                'shop_id' => '',
            ], function ($items) {
                $request = $items;
                if ($request->status) {
                    if (!$request->media_url) {
                        throw new FormException("参数缺失");
                    }
                }
            });

            /**
             * 设置开始时间与结束时间
             */
            $params = array(
                'media_type' => '5efa9cb5d16f5a214671fd86',//默认，中公网校
                'access_key' => '',
                'description' => $request->description ?? '',
            );
            if ($request->shop_id == '100') {
                $params['media_type'] = "5f3d073a033f5a336b2b4346";
            }
            $request->replace(array_merge($request->all(), $params));
            LogModel::addlog(['media_id' => $media_id, "更新媒资状态" => json_encode($request->all())]);
            $id = MediaModel::updateMediaStatus($request, $media_id);
            return $id;
        });
        return success($id);

    }

    /**
     * 更新数据日期
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     * @throws \App\Exceptions\ControllerException
     */
    public function updateDatetime(Request $request)
    {
        $id = handler_drive(function () use ($request) {
            $id = MediaModel::updateDatetime($request);
            return $id;
        });
        return success($id);
    }

    /**
     *
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     * @throws \App\Exceptions\ControllerException
     */
    public function getMediaInfoByNum(Request $request)
    {
        $data = handler_drive(function () use ($request) {
            return MediaModel::getMediaInfoByNum($request);
        });
        return success($data);
    }

    /**
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     * @throws \App\Exceptions\ControllerException
     */
    public function getMediaForeverM3u8(Request $request)
    {
        $data = handler_drive(function () use ($request) {
            return MediaModel::getMediaForeverM3u8($request);
        });
        return success($data);
    }

    /**
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     * @throws \App\Exceptions\ControllerException
     */
    public function getMediaListByMediaIds(Request $request)
    {
        $data = handler_drive(function () use ($request) {
            SrsHookValidate::srsHookCallback($request, [
                'media_ids' => 'required',
            ]);
            return MediaModel::getMediaListByMediaIds($request);
        });
        return success($data);
    }

    /**
     * @param Request $request
     * @return mixed
     * @throws FormException
     * @throws \App\Exceptions\ControllerException
     * @throws \App\Exceptions\DatabaseException
     */
    public function screenShotCallback(Request $request)
    {
        LogModel::addlog(["接受screen_shot_rollback信号"=>$request->all()]);
        $data = handler_drive(function () use ($request) {
            SrsHookValidate::srsHookCallback($request, [
                'media_id' => 'required',
                'screenshot' => '',
                'width' => '',
                'height' => '',
                'type' => 'required',
            ]);
            return MediaModel::UpdateScreenShotInfo($request);
        });
        return success($data);
    }

    /**
     * @throws FormException
     * @throws \App\Exceptions\ControllerException
     * @throws \App\Exceptions\DatabaseException
     */
    public function runScreenShot(Request $request){
        $data = handler_drive(function () use ($request) {
            SrsHookValidate::srsHookCallback($request,[
                'media_id' => '',
                'start_time'  => 'required|date',
                'end_time'    => 'required|date|after_or_equal:start_time',
            ],null,[
                'start_time.date'    => '开始时间格式错误',
                'start_time.required'=> '开始时间不能为空',
                'end_time.required'  => '结束时间不能为空',
                'end_time.date'      => '结束时间格式错误',
                'end_time.after_or_equal' => '结束时间不能小于开始时间'
            ]);
            return MediaModel::runScreenShotMedia($request);
        });
        return success($data);
    }

}
