<?php

namespace app\api\controller\publics;

use app\models\article\Article;
use app\models\article\ArticleCategory;
use app\models\article\ArticleGood;
use app\models\article\ArticleReply;
use app\models\user\EnterpriseUser;
use app\Request;
use crmeb\services\CacheService;
use crmeb\services\UtilService;

/**
 * 文章类
 * Class ArticleController
 * @package app\api\controller\publics
 */
class ArticleController
{
    /**
     * 文章列表
     * @param Request $request
     * @param $cid
     * @return mixed
     */
    public function lst(Request $request, $cid)
    {
        list($page, $limit) = UtilService::getMore([
            ['page', 1],
            ['limit', 10],
        ], $request, true);
        $list = Article::cidByArticleList($cid, $page, $limit, "id,title,image_input,visit,from_unixtime(add_time,'%Y-%m-%d %H:%i') as add_time,synopsis,url") ?? [];
        if (is_object($list)) $list = $list->toArray();
        return app('json')->successful($list);
    }

    /**
     * 文章详情
     * @param $id
     * @return mixed
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\db\exception\DbException
     */
    public function details($id, Request $request)
    {   
        $content = Article::getArticleOne($id);
        if (!$content) return app('json')->fail('此文章已经不存在!');
        $content["visit"] = $content["visit"] + 1;
        $content["cart_name"] = ArticleCategory::getArticleCategoryField($content['cid']);
        $content['add_time'] = date($content['add_time']);
        $uid = $request->uid();
        $content['mer'] = EnterpriseUser::getInfo($content['mer_id'], $uid);
        $content['goods'] = ArticleGood::where('aid', $id)->where('status', 1)->count();
        if ($request->isLogin()) {
            $content['is_goods'] = ArticleGood::where('aid', $id)->where('uid', $request->uid())->find();
        }
        Article::edit(['visit' => $content["visit"]], $id);//增加浏览次数
        //根据文章查询对应的订阅号信息

        return app('json')->successful($content);
    }

    /**
     * 首页推荐文章
     * @return mixed
     */
    public function hot(Request $request)
    {
        $page = $request->get();
        $list = Article::getArticleListHot("id,title,image_input,visit,add_time,synopsis,url,mer_id,is_hot,is_top", $page) ?? [];
        if (is_object($list)) $list = $list->toArray();
        return app('json')->successful($list);
    }

    //检索
    public function search(Request $request)
    {
        $data = $request->get();
        $model = new Article();
        $res = $model->search($data);
        if (is_object($res)) $res = $res->toArray();
        return app('json')->successful($res);


    }

    // 相关阅读
    public function relevant(Request $request)
    {
        $type = $request->get('type');
        $num = mt_rand(0, 20);
        $list = Article::where('cid', $type)->where('status',1)->where('is_check',1)->limit($num, 5)->select();
        $ct = count($list);
        if (empty($ct)) {
            $list = Article::where('cid', $type)->where('status',1)->where('is_check',1)->limit(0, 5)->select();
        }
        if (is_object($list)) $list = $list->toArray();
        return app('json')->successful($list);


    }

    /**
     * 文章 banner
     * @return mixed
     */
    public function banner()
    {
        $list = Article::getArticleListBanner("id,title,image_input,visit,from_unixtime(add_time,'%Y-%m-%d %H:%i') as add_time,synopsis,url") ?? [];
        if (is_object($list)) $list = $list->toArray();
        return app('json')->successful($list);
    }


    public function replyList($id, Request $request)
    {
        $page = $request->get('page', 1);
        $limit = $request->get('limit', 10);
        $list = ArticleReply::with('user')
            ->where('aid', $id)
            ->order('id desc')
            ->page($page, $limit)->select()
            ->each(function ($item) {
                if ($item['to_id']) {
                    $item['to'] = ArticleReply::with('user')->where('id', $item['to_id'])->find();
                }
            });
        $count = ArticleReply::where('aid', $id)->count();
        return app('json')->success('ok', compact('list', 'count'));
    }

    public function reply($id, Request $request)
    {
        $last_time = CacheService::get('reply_' . $request->uid() . '_' . $id, 0);
        if (time() - $last_time < 60) return app('json')->fail('请勿连续多次提交评论');
        CacheService::set('reply_' . $request->uid() . '_' . $id, time());
        list($content, $to_id) = UtilService::postMore([
            ['content', '', '', '', ['not_empty_check'], ['请输入回复的内容']],
            ['to_id', 0]
        ], $request, true);
        $res = ArticleReply::create(['uid' => $request->uid(), 'aid' => $id, 'to_id' => $to_id, 'add_time' => time(), 'content' => $content]);
        if ($to_id) {
            //发送通知
        }
        if ($res)
            return app('json')->success('评论成功');
        else {
            return app('json')->fail('评论失败');
        }
    }

    public function good($id, Request $request)
    {
        $info = ArticleGood::where('aid', $id)->where('uid', $request->uid())->find();
        if ($info) {
            $res = ArticleGood::where('id', $info['id'])->update(['status' => ($info['status'] ? 0 : 1)]);
        } else {
            $res = ArticleGood::create(['uid' => $request->uid(), 'aid' => $id, 'status' => 1]);
        }

        if ($res)
            return app('json')->success('操作成功');
        else {
            return app('json')->fail('操作失败');
        }
    }

    public function myReply(Request $request)
    {
        $page = $request->get('page', 1);
        $limit = $request->get('limit', 10);
        $list = ArticleReply::with('article')->where('uid', $request->uid())->order('id desc')->page($page, $limit)->select()
            ->each(function ($item) {
                if ($item['to_id']) {
                    $item['to'] = ArticleReply::with('user')->where('id', $item['to_id'])->find();
                }
            });
        $count = ArticleReply::where('uid', $request->uid())->count();
        return app('json')->success('ok', compact('list', 'count'));
    }

    public function toMyReply(Request $request)
    {
        $page = $request->get('page', 1);
        $limit = $request->get('limit', 10);
        $ids = ArticleReply::where('uid', $request->uid())->column('id');
        $list = ArticleReply::with(['user', 'article'])->where('to_id', 'in', $ids)->where('to_id', '<>', 0)->order('id desc')->page($page, $limit)->select()
            ->each(function ($item) {
                if ($item['to_id']) {
                    $item['to'] = ArticleReply::where('id', $item['to_id'])->find();
                }
            });
        $count = ArticleReply::where('to_id', 'in', $ids)->where('to_id', '<>', 0)->count();
        return app('json')->success('ok', compact('list', 'count'));
    }
}