<?php
namespace app\traits\account;

use app\validate\FeedbackValidate;
use app\model\{
    Feedback,
    FeedbackType
};
use app\exception\TraitException;
use think\Collection;
use think\Exception;

/**
 * 投诉与意见关联
 * Trait FeedbackTrait
 * @package app\traits\account
 */
trait FeedbackTrait
{
    /**
     * 投诉与意见分类
     */
    public function feedbackTypes()
    {
        try {
            return (new FeedbackType)->select();
        } catch (\Exception $e) {
            return new Collection();
        }
    }

    /**
     * 添加投诉与意见
     * 限制每个用户每日每个问题类型最多提交3次
     *
     * @param int $accountId
     * @param array $data 内容参数 ['type_id', 'content', 'user_name', 'user_phone']
     * @throws TraitException
     */
    public function addFeedback(int $accountId, array $data)
    {
        try {
            $validate = new FeedbackValidate();
            if (!$validate->scene('add')->check($data)) {
                throw new TraitException($validate->getError());
            }

            $allowTypeIds = $this->feedbackTypes()->column('id');
            if (!in_array($data['type_id'], $allowTypeIds)) {
                throw new TraitException('暂不支持该问题类型信息的提交');
            }

            $btStart    = date('Y-m-d 00:00:00');
            $btEnd      = date('Y-m-d 23:59:59');
            $hasCount   = Feedback::where('account_id', $accountId)
                ->where('type_id', $data['type_id'])
                ->whereBetweenTime('created_at', $btStart, $btEnd)
                ->count();
            if ($hasCount >= 3) {
                throw new TraitException('同一问题类型每日最多可提交3次,请勿频繁提交!谢谢您的反馈!');
            }

            Feedback::create([
                'account_id'    => $accountId,
                'type_id'       => $data['type_id'],
                'content'       => $data['content'],
                'user_name'     => $data['user_name'],
                'user_phone'    => $data['user_phone'],
                'ip'            => request()->ip(),
                'status'        => Feedback::STATUS_WAITING,
                'created_at'    => date('Y-m-d H:i:s'),
            ]);

        } catch (TraitException $e) {
            throw $e;
        }  catch (\Exception $e) {
            throw new TraitException('反馈信息提交失败!');
        }
    }


    /**
     * 反馈意见列表
     *
     * @param array $where
     * @param array $fields
     * @param int $page
     * @param int $size
     * @param callable|null $callback
     * @param array $orders
     * @return array
     */
    public function feedbackList(array $where = [], array $fields = [], int $page = 1, int $size = 10, callable $callback = null, array $orders = []): array
    {
        try {
            return Feedback::findList($where, $fields, $page, $size, $callback, $orders);
        } catch (\Exception $e) {
            return [
                'total'   => 0,
                'current' => $page,
                'size'    => $size,
                'list'    => new Collection(),
            ];
        }
    }

    /**
     * 更新反馈意见的状态为已处理
     *
     * @param array $ids
     * @return bool
     */
    public function feedbacksToDone(array $ids): bool
    {
        try {
            Feedback::whereIn('id', $ids)->update([
                'status'        => Feedback::STATUS_DONE,
                'updated_at'    => date('Y-m-d H:i:s')
            ]);
        } catch (\Exception $e) {
            return false;
        }

        return true;
    }
}