# -*- coding:utf-8 -*-
"""
data:2021/8/4 16:42

装置拆除:需要更新如下表:已兼容一分三情况
monitor:update demolished=1
change_meter_record:add new record with mid is NULL
change_sensor_record:add new record with sid, field is NULL
monitor_his_record:update demolished=1、demolished_ts
"""
import time
from asyncio import get_event_loop
from pot_libs.mysql_util.mysql_trans_util import MysqlUtil
from pot_libs.logger import log


async def _load_lids(mtids):
    sql = "SELECT id FROM power_iot.location WHERE mtid IN %s"
    async with MysqlUtil() as mysql_u:
        return [re["id"] for re in
                await mysql_u.fetchall(sql, (tuple(mtids),))]


async def dev_demolish(cid, sid):
    async with MysqlUtil() as mysql_u:
        # check monitor state
        sql = "SELECT mtid FROM power_iot.monitor " \
              "WHERE cid=%s AND sid=%s AND demolished=0"
        mtids = [re["mtid"] for re in await mysql_u.fetchall(sql, (cid, sid))]
        if not mtids:
            log.error(f"no monitor to demolish found, cid:{cid} sid:{sid}")
            return False, "该装置已经被拆除"
        
        sql = "SELECT pid,mtid FROM power_iot.point WHERE mtid IN %s"
        mtid_pid_list = await mysql_u.fetchall(sql, (tuple(mtids),)) or []
        mtid_pid_map = {re["mtid"]: re["pid"] for re in mtid_pid_list}
        if not mtid_pid_map:
            log.error(f"no mtid_pid_map found, mtids:{mtids}")
            return False, "该装置已经被拆除"
    
    now_ts = int(time.time())
    
    async with MysqlUtil() as mysql_u:
        try:
            # 1. update monitor
            sql = "UPDATE power_iot.monitor SET demolished=1 " \
                  "WHERE cid=%s AND sid=%s;"
            await mysql_u.execute(sql, args=(cid, sid))
            
            # 2. update monitor_his_record
            for mtid in mtids:
                # get install time
                record_sql = "select max(install_ts) install_ts from  " \
                             "power_iot.monitor_his_record " \
                             "WHERE mtid=%s AND sid=%s"
                start_ts = await mysql_u.fetch_value(record_sql,
                                                     (mtid, sid))
                if not start_ts:
                    sql = "SELECT create_time FROM point WHERE pid=%s;"
                    start_ts = await mysql_u.fetch_value(sql, (
                        mtid_pid_map.get(mtid),))
                log.info(
                    f"begin to demolish monitor:{mtid}, cid:{cid} sid:{sid} "
                    f"start_time:{start_ts} now_ts:{now_ts}")
                sql = "UPDATE power_iot.monitor_his_record " \
                      "SET demolished=1, demolished_ts=%s " \
                      "WHERE mtid=%s AND sid=%s AND install_ts=%s;"
                await mysql_u.execute(sql, (now_ts, mtid, sid, start_ts))
        except Exception as e:
            log.error(f"device demolish fail e:{e}")
            await mysql_u.rollback()
            return False, "装置拆除异常"
        else:
            await mysql_u.commit()
    
    log.info(f"finish demolish monitor:{mtids}, cid:{cid} sid:{sid} "
             f"start_time:{start_ts} now_ts:{now_ts}")
    
    return True, "操作成功"


if __name__ == '__main__':
    cid = 108
    sid = 'A1911000153'
    get_event_loop().run_until_complete(dev_demolish(cid, sid))