<?php
// +----------------------------------------------------------------------
// | likeadmin快速开发前后端分离管理后台（PHP版）
// +----------------------------------------------------------------------
// | 欢迎阅读学习系统程序代码，建议反馈是我们前进的动力
// | 开源版本可自由商用，可去除界面版权logo
// | gitee下载：https://gitee.com/likeshop_gitee/likeadmin
// | github下载：https://github.com/likeshop-github/likeadmin
// | 访问官网：https://www.likeadmin.cn
// | likeadmin团队 版权所有 拥有最终解释权
// +----------------------------------------------------------------------
// | author: likeadminTeam
// +----------------------------------------------------------------------

namespace app\common\logic;

use app\common\enum\notice\NoticeEnum;
use app\common\enum\YesNoEnum;
use app\common\model\channel\OfficialAuth;
use app\common\model\notice\NoticeRecord;
use app\common\model\notice\NoticeSetting;
use app\common\model\user\User;
use app\common\model\user\UserAuth;
use app\common\model\master_worker\MasterWorker;
use app\common\model\master_worker\MasterWorkerAuth;
use app\common\service\sms\SmsMessageService;
use app\common\service\wechat\WeChatOaService;
use think\facade\Log;

/**
 * 通知逻辑层
 * Class NoticeLogic
 * @package app\common\logic
 */
class NoticeLogic extends BaseLogic
{

    /**
     * @notes 根据场景发送短信
     * @param $params
     * @return bool
     * @author 段誉
     * @date 2022/9/15 15:28
     */
    public static function noticeByScene($params)
    {
        try {
            $noticeSetting = NoticeSetting::where('scene_id', $params['scene_id'])->findOrEmpty()->toArray();
            if (empty($noticeSetting)) {
                throw new \Exception('找不到对应场景的配置');
            }
            //$noticeSetting['designated_user'] && $params['params']['user_id'] = $noticeSetting['designated_user'];
            if($noticeSetting['designated_user']){
                $designated_users = explode(',', $noticeSetting['designated_user']);
                foreach ($designated_users as $user_id) {
                    $params['params']['user_id'] = $user_id;
                    self::noticeBySceneOne($params,$noticeSetting);
                }
            }else{
                self::noticeBySceneOne($params,$noticeSetting);
            }
            return true;
        } catch (\Exception $e) {
            Log::info('NoticeLogic-noticeByScene:'.$e->getMessage());
            self::setError($e->getMessage());
            return false;
        }
    }

    public static function noticeBySceneOne($params,$noticeSetting)
    {
        try {
            // 合并额外参数
            $params = self::mergeParams($params,$noticeSetting['recipient']);
            $res = false;
            Log::info('NoticeLogic-noticeByScene:'.json_encode($params));
            // 短信验证码通知(具有时效性)
            if (isset($noticeSetting['sms_notice']['status']) && $noticeSetting['sms_notice']['status'] == YesNoEnum::YES && $noticeSetting['type'] == NoticeEnum::VERIFICATION_CODE) {
                $res = (new SmsMessageService())->send($params);
                Log::info('NoticeLogic-noticeByScene-send:'.json_encode([$res]));
            }
            // 短信业务通知
            if (isset($noticeSetting['sms_notice']['status']) && $noticeSetting['sms_notice']['status'] == YesNoEnum::YES && $noticeSetting['type'] == NoticeEnum::BUSINESS_NOTIFICATION) {
                $res = (new SmsMessageService())->sendBusiness($params);
                Log::info('NoticeLogic-noticeByScene-sendBusiness:'.json_encode([$res]));
            }
            // 微信公众号消息模板业务通知
            if (isset($noticeSetting['oa_notice']['status']) && $noticeSetting['oa_notice']['status'] == YesNoEnum::YES
                && $noticeSetting['type'] == NoticeEnum::BUSINESS_NOTIFICATION
                && isset($params['params']['openid']) && !empty($params['params']['openid'])
            ) {
                $res = (new WeChatOaService())->sendTemplateMessage($params);
                Log::info('NoticeLogic-noticeByScene-sendTemplateMessage:'.json_encode([$res]));
            }
            return $res;
        } catch (\Exception $e) {
            Log::info('NoticeLogic-noticeByScene:'.$e->getMessage());
            self::setError($e->getMessage());
            return false;
        }
    }

    /**
     * @notes 整理参数
     * @param $params
     * @return array
     * @author 段誉
     * @date 2022/9/15 15:28
     */
    public static function mergeParams($params,$recipient)
    {
        if($recipient == 1) {
            // 用户相关
            if (!empty($params['params']['user_id'])) {
                $user = User::findOrEmpty($params['params']['user_id'])->toArray();
                $params['params']['nickname'] = $user['nickname'];
                $params['params']['user_name'] = $user['nickname'];
                $params['params']['user_sn'] = $user['sn'];
                $params['params']['mobile'] = $user['mobile'];
                $wx_user = UserAuth::where('user_id',$params['params']['user_id'])->findOrEmpty()->toArray();
                $params['params']['openid'] = '';
                $params['params']['unionid'] = '';
                if(isset($wx_user['unionid']) && !empty($wx_user['unionid'])) {
                    $openid = OfficialAuth::where('unionid',$wx_user['unionid'])->where('subscribe',1)->value('openid');
                    $params['params']['openid'] = $openid?:'';
                    $params['params']['unionid'] = $wx_user['unionid']?:'';
                }
            }
        }elseif($recipient == 3) {
            // 工程师相关
            if (!empty($params['params']['user_id'])) {
                $user = MasterWorker::findOrEmpty($params['params']['user_id'])->toArray();
                $params['params']['nickname'] = $user['nickname'];
                $params['params']['user_name'] = $user['nickname'];
                $params['params']['user_sn'] = $user['sn'];
                $params['params']['mobile'] = $user['mobile'];
                $wx_user = MasterWorkerAuth::where('worker_id',$params['params']['user_id'])->findOrEmpty()->toArray();
                $params['params']['openid'] = '';
                $params['params']['unionid'] = '';
                if(isset($wx_user['unionid']) && !empty($wx_user['unionid'])) {
                    $openid = OfficialAuth::where('unionid',$wx_user['unionid'])->where('subscribe',1)->value('openid');
                    $params['params']['openid'] = $openid?:'';
                    $params['params']['unionid'] = $wx_user['unionid']?:'';
                }
            }
        }else{
            // 后台账号
            if (!empty($params['params']['user_id'])) {

            }
        }
        if (isset($params['params']['order_id']) && !empty($params['params']['order_id'])) {
            // 跳转路径
            $jumpPath = self::getPathByScene($params['scene_id'], $params['params']['order_id'] ?? 0);
            $params['url'] = $jumpPath['url'];
            $params['page'] = $jumpPath['page'];
        }
        return $params;
    }


    /**
     * @notes 根据场景获取跳转链接
     * @param $sceneId
     * @param $extraId
     * @return string[]
     * @author 段誉
     * @date 2022/9/15 15:29
     */
    public static function getPathByScene($sceneId, $extraId)
    {
        // 小程序主页路径
        $page = '';
        switch (intval($sceneId)) {
            case 113:
            case 118:
            //case 100:
                $page = "/subPages/detail/detail?id={$extraId}";
                break;
            case 116:
                $page = '/pages/tabView/workbench';
                break;
            /*case 118:
                $page = '/pages/tabView/user';
                break;*/
            case 124: //返修工程师预约上门通知
                $page = "/subPages/return_work_detail/return_work_detail?id={$extraId}";
                break;
        }

        // 公众号主页路径
        $url = '';
        return [
            'url' => $url,
            'page' => $page,
        ];
    }


    /**
     * @notes 替换消息内容中的变量占位符
     * @param $content
     * @param $params
     * @return array|mixed|string|string[]
     * @author 段誉
     * @date 2022/9/15 15:29
     */
    public static function contentFormat($content, $params)
    {
        foreach ($params['params'] as $k => $v) {
            $search = '{' . $k . '}';
            $content = str_replace($search, $v, $content);
        }
        return $content;
    }


    /**
     * @notes 添加通知记录
     * @param $params
     * @param $noticeSetting
     * @param $sendType
     * @param $content
     * @param string $extra
     * @return NoticeRecord|\think\Model
     * @author 段誉
     * @date 2022/9/15 15:29
     */
    public static function addNotice($params, $noticeSetting, $sendType, $content, $extra = '')
    {
        return NoticeRecord::create([
            'user_id' => $params['params']['user_id'] ?? 0,
            'title' => self::getTitleByScene($sendType, $noticeSetting),
            'content' => $content,
            'scene_id' => $noticeSetting['scene_id'],
            'read' => YesNoEnum::NO,
            'recipient' => $noticeSetting['recipient'],
            'send_type' => $sendType,
            'notice_type' => $noticeSetting['type'],
            'extra' => $extra,
        ]);
    }


    /**
     * @notes 通知记录标题
     * @param $sendType
     * @param $noticeSetting
     * @return string
     * @author 段誉
     * @date 2022/9/15 15:30
     */
    public static function getTitleByScene($sendType, $noticeSetting)
    {
        switch ($sendType) {
            case NoticeEnum::SMS:
                $title = '';
                break;
            case NoticeEnum::OA:
                $title = $noticeSetting['oa_notice']['name'] ?? '';
                break;
            case NoticeEnum::MNP:
                $title = $noticeSetting['mnp_notice']['name'] ?? '';
                break;
            default:
                $title = '';
        }
        return $title;
    }

}