from apps.enm.models import Mpoint, MpointStat, EnStat, MpLog
import re
import traceback
from apps.mtm.services import get_mgroup_goals
from django.db.models import Q
import datetime
from django.utils import timezone


def translate_eval_formula(exp_str: str, year: int, month: int, day: int, hour: int):
    """
    传入
    """
    pattern = r"\${(.*?)}"
    matches = re.findall(pattern, exp_str)
    for match in matches:
        mpst = MpointStat.objects.filter(Q(mpoint__id=match) | Q(mpoint__name=match) | Q(
            mpoint__code=match), type='hour', year=year, month=month, day=day, hour=hour).first()
        if mpst:
            exp_str = exp_str.replace(f"${{{match}}}", str(mpst.val))
    rval = eval(exp_str)
    return rval


def get_day_s(year: int, month: int, day: int, hour: int, hour_split: int = 21):
    """
    根据给定的小时数, 计算出班天
    """
    if hour <= hour_split:
        return year, month, day
    else:
        now = datetime.datetime(year, month, day, hour)
        now2 = now + datetime.timedelta(days=1)
        return now2.year, now2.month, now2.day

# cal_rule = {
#     "电石渣": {
#         "total_production": 0.4,
#         "elec_consume_unit": 0.4,
#         "production_cost_unit": 0.2
#     },
#     "原料磨":{
#         "production_hour": 0.3,
#         "elec_consume_unit": 0.3,
#         "production_cost_unit": 0.1,
#         "辅料_细度":0.05,
#         "辅料_水分":0.04,
#         "干混生料_CaO":0.04
#     }
# }
# def cal_team_score(data):
#     """
#     计算月度绩效
#     """
#     qua_rate = {}
#     month_s = data['month_s']
#     for item in data['qua_data']:
#         qua_rate[f'{item["material_name"]}_{item["testitem_name"]}'] = item["rate_pass"]

#     goal_dict = get_mgroup_goals(data['mgroup'], data['year_s'], False)
#     goal_data = {}
#     try:
#         rule = cal_rule[data['mgroup_name']]
#         score = 0
#         for key in rule:
#             new_key = f'{key}_{month_s}'
#             goal_data[new_key] = goal_dict[new_key]
#             if '-' in key:
#                 score = score + qua_rate.get(key, 0)/goal_data[new_key]*rule[key]
#             else:
#                 score = score + data.get(key)/goal_data[new_key]*rule[key]
#                 print(score)
#         # enstat.goal_data = goal_data
#         # enstat.score =score
#         # enstat.save(update_fields=['goal_data', 'score'])
#     except:
#         print(traceback.format_exc())
#     return goal_data, score


def shutdown_or_startup(mplog: MpLog):
    from apps.wpm.models import StLog
    from apps.wpm.tasks import cal_exp_duration_hour
    from apps.wpm.services import get_sflog
    mpoint = mplog.mpoint
    mgroup = mpoint.mgroup
    last_stlog = StLog.objects.filter(
        mgroup=mgroup, is_shutdown=True).order_by('start_time').last()  # 找到最后一次停机记录
    if last_stlog:
        if mplog.tag_update >= last_stlog.start_time:  # 认为是有效信号
            if last_stlog.end_time is None and mplog.tag_val == 1:  # 从停到开
                last_stlog.end_time = mplog.tag_update
                last_stlog.duration = (
                    last_stlog.end_time - last_stlog.start_time).total_seconds()/3600
                last_stlog.save()
                mgroup.is_runing = True
                mgroup.save()
                cal_exp_duration_hour(last_stlog.id)  # 触发时间分配
            elif last_stlog.end_time and mplog.tag_val == 0 and mplog.tag_update > last_stlog.end_time:  # 从开到停
                StLog.objects.create(
                    title='停机',
                    is_shutdown=True,
                    mgroup=mgroup,
                    end_time=None,
                    start_time=mplog.tag_update,
                    sflog=get_sflog(mgroup, mplog.tag_update)
                )
                mgroup.is_runing = False
                mgroup.save()
    else:
        StLog.objects.create(
            title='停机',
            is_shutdown=True,
            mgroup=mgroup,
            end_time=None,
            start_time=mplog.tag_update,
            sflog=get_sflog(mgroup, mplog.tag_update))
        mgroup.is_runing = False
        mgroup.save()
