"""
钉钉通道接入

@author huiwen
@Date 2023/11/28
"""

# -*- coding=utf-8 -*-
import uuid

import requests
import web
from channel.dingtalk.dingtalk_message import DingTalkMessage
from bridge.context import Context
from bridge.reply import Reply, ReplyType
from common.log import logger
from common.singleton import singleton
from config import conf
from common.expired_dict import ExpiredDict
from bridge.context import ContextType
from channel.chat_channel import ChatChannel, check_prefix
from common import utils
import json
import os



import argparse
import logging
from dingtalk_stream import AckMessage
import dingtalk_stream

@singleton
class DingTalkChanel(ChatChannel,dingtalk_stream.ChatbotHandler):
    dingtalk_client_id = conf().get('dingtalk_client_id')
    dingtalk_client_secret = conf().get('dingtalk_client_secret')
    
    def setup_logger(self):
        logger = logging.getLogger()
        handler = logging.StreamHandler()
        handler.setFormatter(
            logging.Formatter('%(asctime)s %(name)-8s %(levelname)-8s %(message)s [%(filename)s:%(lineno)d]'))
        logger.addHandler(handler)
        logger.setLevel(logging.INFO)
        return logger
    def __init__(self):
        super().__init__()
        super(dingtalk_stream.ChatbotHandler, self).__init__()
        
        self.logger = self.setup_logger()
        # 历史消息id暂存,用于幂等控制
        self.receivedMsgs = ExpiredDict(60 * 60 * 7.1)
        
        logger.info("[dingtalk] client_id={}, client_secret={} ".format(
            self.dingtalk_client_id, self.dingtalk_client_secret))
        # 无需群校验和前缀
        conf()["group_name_white_list"] = ["ALL_GROUP"]
        
        

    def startup(self):
       
        credential = dingtalk_stream.Credential( self.dingtalk_client_id, self.dingtalk_client_secret)
        client = dingtalk_stream.DingTalkStreamClient(credential)
        client.register_callback_handler(dingtalk_stream.chatbot.ChatbotMessage.TOPIC,self)
        client.start_forever()

    def handle_single(self, cmsg:DingTalkMessage):
        # 处理单聊消息
        #  
    
        if cmsg.ctype == ContextType.VOICE:
           
            logger.debug("[dingtalk]receive voice msg: {}".format(cmsg.content))
        elif cmsg.ctype == ContextType.IMAGE:
            logger.debug("[dingtalk]receive image msg: {}".format(cmsg.content))
        elif cmsg.ctype == ContextType.PATPAT:
            logger.debug("[dingtalk]receive patpat msg: {}".format(cmsg.content))
        elif cmsg.ctype == ContextType.TEXT:
            expression = cmsg.my_msg
            
        cmsg.content = conf()["single_chat_prefix"][0] + cmsg.content
        
        context = self._compose_context(cmsg.ctype, cmsg.content, isgroup=False, msg=cmsg)
        
        if context:
            self.produce(context)

    def handle_group(self, cmsg:DingTalkMessage):
        # 处理群聊消息
        #  
    
        if cmsg.ctype == ContextType.VOICE:
           
            logger.debug("[dingtalk]receive voice msg: {}".format(cmsg.content))
        elif cmsg.ctype == ContextType.IMAGE:
            logger.debug("[dingtalk]receive image msg: {}".format(cmsg.content))
        elif cmsg.ctype == ContextType.PATPAT:
            logger.debug("[dingtalk]receive patpat msg: {}".format(cmsg.content))
        elif cmsg.ctype == ContextType.TEXT:
            expression = cmsg.my_msg
            
        cmsg.content = conf()["group_chat_prefix"][0] + cmsg.content
        context = self._compose_context(cmsg.ctype, cmsg.content, isgroup=True, msg=cmsg)
        context['no_need_at']=True
        if context:
            self.produce(context)


    async def process(self, callback: dingtalk_stream.CallbackMessage):
       


        try:
            
            incoming_message = dingtalk_stream.ChatbotMessage.from_dict(callback.data)
            dingtalk_msg = DingTalkMessage(incoming_message)
            if incoming_message.conversation_type == '1':
                self.handle_single(dingtalk_msg)
            else:
                self.handle_group(dingtalk_msg)   
            return AckMessage.STATUS_OK, 'OK'
        except Exception as e:
            logger.error(e)
            return self.FAILED_MSG


    def send(self, reply: Reply, context: Context):


        incoming_message = context.kwargs['msg'].incoming_message
        self.reply_text(reply.content, incoming_message)
       
        



    # def _compose_context(self, ctype: ContextType, content, **kwargs):
    #     context = Context(ctype, content)
    #     context.kwargs = kwargs
    #     if "origin_ctype" not in context:
    #         context["origin_ctype"] = ctype

    #     cmsg = context["msg"]
    #     context["session_id"] = cmsg.from_user_id
    #     context["receiver"] = cmsg.other_user_id

    #     if ctype == ContextType.TEXT:
    #         # 1.文本请求
    #         # 图片生成处理
    #         img_match_prefix = check_prefix(content, conf().get("image_create_prefix"))
    #         if img_match_prefix:
    #             content = content.replace(img_match_prefix, "", 1)
    #             context.type = ContextType.IMAGE_CREATE
    #         else:
    #             context.type = ContextType.TEXT
    #         context.content = content.strip()

    #     elif context.type == ContextType.VOICE:
    #         # 2.语音请求
    #         if "desire_rtype" not in context and conf().get("voice_reply_voice"):
    #             context["desire_rtype"] = ReplyType.VOICE

    #     return context