<?php
/**
 * Sync.php
 *
 * @Author: Ghaoo
 * @Date  2020/7/27 0027
 */

namespace Weasy\Core;


use addons\qyexternal\model\Contacts;
use addons\qyexternal\model\FollowUser;
use addons\qyexternal\model\GroupChat;
use addons\qyexternal\model\UserBehavior;
use think\Log;
use Weasy\External\Api\CorpAPI;

class Sync
{
    public $corp;
    public $external;
    public $contacts;

    public function __construct($corp)
    {
        $this->corp = $corp;
        $this->external = new CorpAPI($corp->corp_id, $corp->external_secret);
        $this->contacts = new CorpAPI($corp->corp_id, $corp->contacts_secret);
    }

    /**
     * @Note: 同步配置了客户联系功能的成员列表
     * @Author: Ghaoo
     * @throws \Weasy\External\Utils\Error\HttpError
     * @throws \Weasy\External\Utils\Error\InternalError
     * @throws \Weasy\External\Utils\Error\NetWorkError
     * @throws \Weasy\External\Utils\Error\ParameterError
     * @throws \Weasy\External\Utils\Error\QyApiError
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function FollowUserList()
    {
        $follow = $this->external->ExternalContactGetFollowUserList();
        $users = [];
        foreach ($follow as $key => $uid) {
            $user = $this->contacts->UserGet($uid);
            $users[$key] = [
                "corp_id" => $this->corp->corp_id,
                "corp_name" => $this->corp->name,
                "userid" => $uid,
                "name" => $user->name,
                "mobile" => $user->mobile,
                "email" => $user->email,
                "avatar" => $user->avatar,
                "gender" => $user->gender,
            ];

            $fu = FollowUser::where("corp_id", $this->corp->corp_id)->where("userid", $uid)->find();

            if ($fu) {
                $users[$key]["id"] = $fu->id;
            }
        }
        $users = array_values($users);

        $model = new FollowUser();
        $model->saveAll($users);
    }

    /**
     * @Note: 同步企业下所有客户信息
     * @Author: Ghaoo
     * @throws \Weasy\External\Utils\Error\HttpError
     * @throws \Weasy\External\Utils\Error\InternalError
     * @throws \Weasy\External\Utils\Error\NetWorkError
     * @throws \Weasy\External\Utils\Error\ParameterError
     * @throws \Weasy\External\Utils\Error\QyApiError
     */
    public function ContactsList($userid, $cursor = "")
    {
        try {
            $contacts = $this->external->ExternalContactBatch($userid, $cursor);

            $this->saveExternalContact($contacts['external_contact_list'], $userid);

            if (!empty($contacts['next_cursor'])) {
                $this->ContactsList($userid, $cursor);
            }

        } catch (\Exception $e){
            //Log::write($e->getTraceAsString());
        }
    }


    /**
     * @Note: 保存外部联系人数据
     * @Author: Ghaoo
     * @param $contacts
     * @param $userid
     */
    protected function saveExternalContact($contacts, $userid)
    {
        foreach ($contacts as $contact) {
            try {

                $user = Contacts::where("corp_id", $this->corp->corp_id)->where("external_userid", $contact['external_contact']["external_userid"])->find();
                if (!$user) {
                    $user = new Contacts();
                    $user->corp_id = $this->corp->corp_id;
                    $user->corp_name = $this->corp->name;
                    $user->external_userid = $contact['external_contact']["external_userid"];
                    $user->name = $contact["external_contact"]["name"];
                    $user->avatar = $contact["external_contact"]["avatar"];
                    $user->type = $contact["external_contact"]["type"];
                    $user->gender = $contact["external_contact"]["gender"];

                    if (isset($contact["external_contact"]["unionid"])) {
                        $user->unionid = $contact["external_contact"]["unionid"];
                    }

                    $user->follow_user = json_encode([$userid]);
                } else {
                    $follow_user = json_decode($user->follow_user, true);
                    array_push($follow_user, $userid);
                    $user->follow_user = json_encode($follow_user);
                }

                $user->save();
            } catch (\Exception $e) {
                Log::write([$e->getMessage(), $e->getTraceAsString()]);
            }
        }
    }

    /**
     * @Note: 同步企业下所有客户群信息
     * @Author: Ghaoo
     * @throws \Weasy\External\Utils\Error\HttpError
     * @throws \Weasy\External\Utils\Error\InternalError
     * @throws \Weasy\External\Utils\Error\NetWorkError
     * @throws \Weasy\External\Utils\Error\ParameterError
     * @throws \Weasy\External\Utils\Error\QyApiError
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function GroupChatList()
    {
        $chats = $this->external->ExternalContactGroupChatList(0, 1000);

        if ($chats) {
            $group_chats = [];
            foreach ($chats as $key=>$item) {
                $group = GroupChat::where("corp_id", $this->corp->corp_id)->where("chat_id", $item["chat_id"])->find();
                if ($group) {
                    $group_chats[$key]["id"] = $group->id;
                }

                $group_chats[$key]["corp_id"] = $this->corp->corp_id;
                $group_chats[$key]["corp_name"] = $this->corp->name;
                $group_chats[$key]["chat_id"] = $item["chat_id"];
                $chat = $this->external->ExternalContactGroupChatGet($item["chat_id"]);

                $group_chats[$key]["name"] = $chat["name"];
                $group_chats[$key]["owner"] = $chat["owner"];
                $group_chats[$key]["create_time"] = $chat["create_time"];
                if (isset($chat["notice"])) {
                    $group_chats[$key]["notice"] = $chat["notice"];
                }
            }
            $m = new GroupChat();
            $m->saveAll($group_chats);
        }
    }

    /**
     * @Note: 同步员工数据
     * @Author: Ghaoo
     * @param $userid
     * @param $start_time
     * @param $end_time
     * @throws \Weasy\External\Utils\Error\HttpError
     * @throws \Weasy\External\Utils\Error\InternalError
     * @throws \Weasy\External\Utils\Error\NetWorkError
     * @throws \Weasy\External\Utils\Error\ParameterError
     * @throws \Weasy\External\Utils\Error\QyApiError
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function UserBehaviorData($userid, $start_time, $end_time)
    {

        $data = $this->external->ExternalContactBehaviorData($userid, $start_time, $end_time);

        $udata = [];
        foreach ($data as $key=>$datum) {
            if ($behavior = UserBehavior::where("corp_id", $this->corp->corp_id)->where("userid", $userid)->where("date", $datum["stat_time"])->find()) {
                $udata[$key]["id"] = $behavior->id;
            }
            $udata[$key]["corp_id"] = $this->corp->corp_id;
            $udata[$key]["userid"] = $userid;
            $udata[$key]["date"] = $datum["stat_time"];
            $udata[$key]["chat_cnt"] = $datum["chat_cnt"];
            $udata[$key]["message_cnt"] = $datum["message_cnt"];
            $udata[$key]["reply_percentage"] = isset($datum["reply_percentage"])?$datum["reply_percentage"]:0;
            $udata[$key]["avg_reply_time"] = isset($datum["avg_reply_time"])?$datum["avg_reply_time"]:0;
            $udata[$key]["negative_feedback_cnt"] = $datum["negative_feedback_cnt"];
            $udata[$key]["new_apply_cnt"] = $datum["new_apply_cnt"];
            $udata[$key]["new_contact_cnt"] = $datum["new_contact_cnt"];
        }

        $behavior = new UserBehavior();
        $behavior->saveAll($udata);
    }

}