#!python
# -*- coding: UTF-8 -*-
##############################################
# Home	: https://www.netkiller.cn
# Author: Neo <netkiller@msn.com>
##############################################

try:
    import requests
    import os
    import sys
    import logging
    import logging.handlers
    import json
    from optparse import OptionParser, OptionGroup
    import time
    import hmac
    import hashlib
    import base64
    import urllib.parse
except ImportError as err:
    print("Error: %s" % (err))


class Dingtalk():

    def __init__(self):
        self.headers = {'Content-Type': 'application/json'}
        self.url = "https://oapi.dingtalk.com/robot/send"

        usage = "usage: %prog [options] message"
        self.parser = OptionParser(usage)
        self.parser.add_option(
            "-t", "--token", dest="token", help="access_token", default='', metavar="Token")
        self.parser.add_option('-s', '--secret', dest='secret', help='密钥',
                               default=None, metavar='')
        self.parser.add_option('-l', '--logfile', dest='logfile', help='日志文件',
                               default='/var/tmp/dingtalk.log', metavar='/var/log/dingtalk.log')
        self.parser.add_option(
            '', "--stdin", action="store_true", dest="stdin", help="标准输入")

        self.parser.add_option(
            '', "--text", action="store_true", dest="text", default=False, help="查看配置")
        group = OptionGroup(self.parser, "Markdown")
        group.add_option(
            '', "--markdown", action="store_true", dest="markdown", help="Markdown 格式")
        group.add_option('', '--title', dest='title', help='标题',
                         default=None, metavar='')
        self.parser.add_option_group(group)
        self.parser.add_option(
            "-d", "--debug", action="store_true", dest="debug", help="debug mode")

        (options, args) = self.parser.parse_args()

        if options.logfile:
            logging.basicConfig(level=logging.NOTSET, format='%(asctime)s %(levelname)-8s %(message)s', datefmt='%Y-%m-%d %H:%M:%S',
                                filename=options.logfile, filemode='a')

        self.logging = logging.getLogger()

        if options.debug:
            print("="*50)
            print(options, args)
            print("="*50)

        if options.token:
            self.token = options.token
            self.params = {'access_token': self.token}
        if options.secret:
            self.secret(options.secret)
        if args:
            message = ' '.join(args)
        elif options.stdin:
            message = sys.stdin.read()
        else:
            self.usage()

        # print(message)

        if options.text:
            self.text(message)
        elif options.markdown:
            self.markdown(options.title, message)
        else:
            self.text(message)

    def secret(self, secret):
        self.timestamp = str(round(time.time() * 1000))
        # secret = 'SEC90485937c351bfaed41fea8eda5f1e155bbf22842d5f9d6871999e05822fd894'
        secret_enc = secret.encode('utf-8')
        string_to_sign = '{}\n{}'.format(self.timestamp, secret)
        string_to_sign_enc = string_to_sign.encode('utf-8')
        hmac_code = hmac.new(secret_enc, string_to_sign_enc,
                             digestmod=hashlib.sha256).digest()
        sign = urllib.parse.quote(base64.b64encode(hmac_code))
        # print(timestamp)
        # print(sign)
        self.params = {'access_token': self.token, "sign": sign}
        self.params["timestamp"] = self.timestamp
        return sign

    def text(self, message):

        data = json.dumps({
            "msgtype": "text",
            "text": {
                "content": message
            }
        })
        # print(self.params)
        self.logging.info(data)
        res = requests.post(url=self.url, data=data,
                            params=self.params, headers=self.headers)
        self.logging.info(res.json())

    def markdown(self, title: object, text: object):
        """
        发送markdown
        """
        data = {
            "msgtype": "markdown",
            "markdown": {
                "title": title,
                "text": text
            },
            # "at": {
            #     "atMobiles": [
            #     ],
            #     "atUserIds": [
            #         *atUserIds
            #     ],
            #     "isAtAll": False
            # }
        }
        # print("data:", data)
        self.logging.info(data)
        # self.params["timestamp"] = self.timestamp
        r = requests.post(
            url=self.url,
            data=json.dumps(data),
            params=self.params,
            headers=self.headers
        )
        # print("-----------------")
        # print(r.json())
        self.logging.info(r.json())

    def usage(self):
        self.parser.print_help()
        print("\nHomepage: http://www.netkiller.cn\tAuthor: Neo <netkiller@msn.com>")
        print("Help: https://github.com/netkiller/devops/blob/master/doc/dingtalk.md")
        exit()


if __name__ == '__main__':
    try:
        dingtalk = Dingtalk()
    except PermissionError as err:
        print(err)
