import argparse
import pandas as pd 
from pymongo import MongoClient
import requests
from flask import Flask,request,jsonify
from waitress import serve
import time
import logging
import traceback
app = Flask('processing_limit_power_by_records——service')

def get_data_from_mongo(args):
    mongodb_connection,mongodb_database,mongodb_read_table = args['mongodb_connection'],args['mongodb_database'],args['mongodb_read_table']
    client = MongoClient(mongodb_connection)
    # 选择数据库（如果数据库不存在，MongoDB 会自动创建）
    db = client[mongodb_database]
    collection = db[mongodb_read_table]  # 集合名称
    data_from_db = collection.find()  # 这会返回一个游标（cursor）
    # 将游标转换为列表，并创建 pandas DataFrame
    df = pd.DataFrame(list(data_from_db))
    client.close()
    return df
    

def insert_data_into_mongo(res_df,args):
    mongodb_connection,mongodb_database,mongodb_write_table = args['mongodb_connection'],args['mongodb_database'],args['mongodb_write_table']
    client = MongoClient(mongodb_connection)
    db = client[mongodb_database]
    if mongodb_write_table in db.list_collection_names():
        db[mongodb_write_table].drop()
        print(f"Collection '{mongodb_write_table} already exist, deleted successfully!")
    collection = db[mongodb_write_table]  # 集合名称
    # 将 DataFrame 转为字典格式
    data_dict = res_df.to_dict("records")  # 每一行作为一个字典
    # 插入到 MongoDB
    collection.insert_many(data_dict)
    print("data inserted successfully!")
    


def limit_record_judgement(power,args):
    timeBegin,timeEnd,station_code,col_time = args['timeBegin'], args['timeEnd'], args['station_code'], args['col_time']
    url = f'http://itil.jiayuepowertech.com:9958/itil/api/power-limitation?timeBegin={timeBegin}&timeEnd={timeEnd}'
    try:
        res = requests.get(url).json()
    except requests.RequestException as e:
        print(f"请求失败: {e}")
        return []
    ele_info = [item for item in res.get('data', []) if item['stationCode'] == station_code]
    initial_count = len(power)
    clean_record = []
    for ele in ele_info:
        begin,end = ele['timeBegin'], ele['timeEnd']
        ele_limits = pd.date_range(start=begin, end=end, freq='min').strftime("%Y-%m-%d %H:%M:%S").tolist()
        if len(ele_limits) > 0:
            clean_record = clean_record + ele_limits
    print(f"根据限电记录清洗，{timeBegin}至{timeEnd}，限电时长共计{round(len(clean_record)/60,2)}小时")
    return power[~power[col_time].isin(clean_record)]

@app.route('/processing_limit_power_by_records', methods=['POST'])
def processing_limit_power_by_records():
    # 获取程序开始时间  
    start_time = time.time()  
    result = {}
    success = 0
    print("Program starts execution!")
    try:
        args = request.values.to_dict()
        print('args',args)
        logger.info(args)
        power_df = get_data_from_mongo(args)
        res_df = limit_record_judgement(power_df,args)
        insert_data_into_mongo(res_df,args)
        success = 1
    except Exception as e:
        my_exception = traceback.format_exc()
        my_exception.replace("\n","\t")
        result['msg'] = my_exception
    end_time = time.time() 
   
    result['success'] = success
    result['args'] = args
    result['start_time'] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(start_time))
    result['end_time'] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(end_time))
    print("Program execution ends!")
    return result
    
if __name__=="__main__":
    print("Program starts execution!")
    logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    logger = logging.getLogger("processing_limit_power_by_records log")
    from waitress import serve
    serve(app, host="0.0.0.0", port=10088)
    print("server start!")