# -*- coding: utf-8 -*-
import argparse
import json

import pytz
import requests

from datetime import datetime

server_robot = {
    'webhook': 'https://open.feishu.cn/open-apis/bot/v2/hook/926982f5-e7af-40f5-81fd-27d8f42718e4',
}

level_header_template_map = {
    "info": "turquoise",
    "error": "red",
    "warn": "yellow"
}

level_header_title_content_map = {
    "info": "广告模型自动更新通知",
    "error": "广告模型自动更新告警",
    "warn": "广告模型自动更新告警"
}

level_task_status_map = {
    "info": "任务执行成功",
    "error": "任务执行失败",
    "warn": "任务执行失败",
}


def send_card_msg_to_feishu(webhook, card_json):
    """发送消息到飞书"""
    headers = {'Content-Type': 'application/json'}
    payload_message = {
        "msg_type": "interactive",
        "card": card_json
    }
    print(f"推送飞书消息内容: {json.dumps(payload_message)}")
    response = requests.request('POST', url=webhook, headers=headers, data=json.dumps(payload_message))
    print(response.text)


def timestamp_format(timestamp: str) -> str:
    try:
        return (datetime.utcfromtimestamp(int(timestamp))
                .replace(tzinfo=pytz.UTC)
                .astimezone(pytz.timezone('Asia/Shanghai'))
                .strftime('%Y-%m-%d %H:%M:%S')
                )
    except ValueError as e:
        return timestamp


def seconds_convert(seconds):
    hours = seconds // 3600
    minutes = (seconds % 3600) // 60
    seconds = seconds % 60
    return f"{hours}小时 {minutes}分钟 {seconds}秒"


def _monitor(level, msg: str, start, elapsed, top10):
    """消息推送"""
    """消息推送"""
    now = datetime.now()
    msg = msg.replace("\\n", "\n").replace("\\t", "\t")
    mgs_text = f"- 当前时间: {now.strftime('%Y-%m-%d %H:%M:%S')}" \
               f"\n- 任务开始时间: {timestamp_format(start)}" \
               f"\n- 任务状态: {level_task_status_map[level]}" \
               f"\n- 任务耗时: {seconds_convert(elapsed)}" \
               f"\n- 任务描述: {msg}"
    card_json = {
        "schema": "2.0",
        "header": {
            "title": {
                "tag": "plain_text",
                "content": level_header_title_content_map[level]
            },
            "template": level_header_template_map[level]
        },
        "body": {
            "elements": [
                {
                    "tag": "markdown",
                    "content": mgs_text,
                    "text_align": "left",
                    "text_size": "normal",
                    "element_id": "overview"
                }
            ]
        }
    }
    if top10 is not None and len(top10) > 0:
        collapsible_panel = {
            "tag": "collapsible_panel",
            "header": {
                "title": {
                    "tag": "markdown",
                    "content": "**Top10差异详情**"
                },
                "vertical_align": "center",
                "padding": "4px 0px 4px 8px"
            },
            "border": {
                "color": "grey",
                "corner_radius": "5px"
            },
            "element_id": "detail",
            "elements": [
                {
                    "tag": "markdown",
                    "content": top10.replace("\\n", "\n").replace("\\t", "\t"),
                    "element_id": "Top10CID"
                }
            ]
        }
        card_json['body']['elements'].append(collapsible_panel)

    send_card_msg_to_feishu(
        webhook=server_robot.get('webhook'),
        card_json=card_json
    )


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='告警Utils')
    parser.add_argument('--level', type=str, help='通知级别, info, warn, error', required=True)
    parser.add_argument('--msg', type=str, help='消息', required=True)
    parser.add_argument('--start', type=str, help='任务开始时间', required=True)
    parser.add_argument('--elapsed', type=int, help='任务耗时【秒】', required=True)
    parser.add_argument("--top10", type=str, help='Top10打分详情', required=False)
    args = parser.parse_args()

    _monitor(
        level=args.level,
        msg=args.msg,
        start=args.start,
        elapsed=args.elapsed,
        top10=args.top10
    )