#! /usr/bin/env python3
# -*- 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)
