from unify_api.modules.energy_optimize.procedures.energy_utils import \
    get_slots_between_date, get_current_date, format_chart_data, DATA_FORMAT, \
    format_value


def process_capacity(capacity):
    pcs = capacity["PCS"]
    battery = capacity["battery"]
    return {
        "PCS": {
            "value": pcs,
            "unit": "kW"
        },
        "battery": {
            "value": battery,
            "unit": "kWh"
        }
    }


def process_opt_analysis(opt_analysis):
    """用户侧储能"""
    processed_result = {}
    for k in opt_analysis:
        flag = "%s_flag" % k
        processed_result[k] = {}
        red_place = []
        if opt_analysis[k][flag] == False:
            status = "good"
            info = "无储能优化空间。"
        else:
            status = "bad"
            if k == "peak_valley":
                info = "可减少峰时段电网用电%s度/月。" % \
                       opt_analysis["peak_valley"]["peak_valley_kwh"]
                red_place = ["%s度/月" % opt_analysis[k]["peak_valley_kwh"]]
            elif k == "max_demand":
                info = "存在空间,可降低用电成本%s元/月。" % \
                       opt_analysis["max_demand"]["max_demand_benifit"]
                red_place = [
                    "%s元/月" % opt_analysis["max_demand"]["max_demand_benifit"]]
            elif k == "economic_operation":
                info = "存在空间,可降低峰荷%skW,最高负载率降低为%s。" % \
                       (opt_analysis["economic_operation"]["reduce_peak"],
                        opt_analysis["economic_operation"][
                            "reduce_load_factor"])
                red_place = [
                    "%skW" % opt_analysis["economic_operation"]["reduce_peak"],
                    "%s" % opt_analysis["economic_operation"][
                        "reduce_load_factor"]]

        processed_result[k]["status"] = status
        processed_result[k]["info"] = info
        processed_result[k]["red_place"] = red_place
    return processed_result


def pv_process_opt_analysis(opt_analysis):
    """分布式光伏"""
    processed_result = {}
    for k in opt_analysis:
        flag = "%s_flag" % k
        processed_result[k] = {}
        red_place = []
        if opt_analysis[k][flag] == False:
            status = "good"
            # info = "根据用户负荷特效及算法分析,该指标无储能优化空间."
            info = "无优化空间."

        else:
            status = "bad"
            if k == "peak_clip":
                info = "可减少峰段电网用电量%s度/月,消纳光伏用电费用需根据用户与光伏电站协商电价确定。" % \
                       opt_analysis[k]["peak_clip_kwh"]
                red_place = ["%s度/月" % opt_analysis[k]["peak_clip_kwh"]]
            elif k == "max_demand":
                info = "存在空间,可降低用电成本%s元/月。" % \
                       opt_analysis["max_demand"]["max_demand_benifit"]
                red_place = [
                    "%s元/月" % opt_analysis["max_demand"]["max_demand_benifit"]]
            elif k == "economic_operation":
                info = "存在空间,可降低峰荷%skW,最高负载率降低为%s。" % \
                       (opt_analysis["economic_operation"]["reduce_peak"],
                        opt_analysis["economic_operation"][
                            "reduce_load_factor"])
                red_place = [
                    "%skW" % opt_analysis["economic_operation"]["reduce_peak"],
                    "%s" % opt_analysis["economic_operation"][
                        "reduce_load_factor"]]

        processed_result[k]["status"] = status
        processed_result[k]["info"] = info
        processed_result[k]["red_place"] = red_place
    return processed_result


def get_user_energy_storage_curve(inlid, storage_optimize_tools_data):
    # 优化曲线
    opt_curve = storage_optimize_tools_data["opt_curve"]

    slots = get_slots_between_date(get_current_date(), get_current_date(),
                                   "15min")
    curve_datas = {}
    for slot in slots:
        curve_datas[slot[0]] = {}
        for item in ["Unoptimized load curve", "Optimized load curve",
                     "Load action curve"]:
            curve_datas[slot[0]][item] = ""
        for value in opt_curve:
            if value["quarter_time"] == slot[0].strftime("%H:%M:%S"):
                curve_datas[slot[0]]["Unoptimized load curve"] = value[
                    "load_curve"]
                curve_datas[slot[0]]["Optimized load curve"] = value[
                    "load_bat_curve"]
                curve_datas[slot[0]]["Load action curve"] = value["bat_curve"]
    capacity_scale_chart = {
        "data": format_chart_data(curve_datas, date_type="15min"),
        "unit": DATA_FORMAT["default"]["unit"]
    }
    return capacity_scale_chart


def get_user_energy_storage_economic_evaluate(inlid,
                                              storage_optimize_tools_data):
    """
    工厂版 用电优化 综合能源优化工具 用户侧储能 经济测算
    :param inlid:
    :return:
    """
    # 经济测算
    invest_income_table = {}
    for values in storage_optimize_tools_data["economic_evaluate"][
        "invest_income_table"]:
        keys = list(values.keys())
        k = values["rate_of_investment"]
        invest_income_table[k] = [format_value(values[sub_k], "big_money4")[0]
                                  for sub_k in keys[1:]]
    return {
        "investment": {
            "value": format_value(
                storage_optimize_tools_data["economic_evaluate"]["ttl_invest"],
                "big_money")[0],
            "unit": DATA_FORMAT["big_money"]["unit"]
        },
        "conversion_days": {
            "value":
                format_value(storage_optimize_tools_data["economic_evaluate"][
                                 "year_use_days"],
                             "day")[0],
            "unit": DATA_FORMAT["day"]["unit"]
        },
        "peak_valley_year_income": {
            "value": format_value(
                storage_optimize_tools_data["economic_evaluate"][
                    "peak_valley_year_income"],
                "big_money")[0],
            "unit": DATA_FORMAT["big_money"]["unit"]
        },
        "max_demand_year_income": {
            "value": format_value(
                storage_optimize_tools_data["economic_evaluate"][
                    "max_demand_year_income"],
                "big_money")[0],
            "unit": DATA_FORMAT["big_money"]["unit"]
        },
        "ttl_income": {
            "value": format_value(
                storage_optimize_tools_data["economic_evaluate"]["ttl_income"],
                "big_money")[0],
            "unit": DATA_FORMAT["big_money"]["unit"]
        },
        "static_invest_years": {
            "value": format_value(
                storage_optimize_tools_data["economic_evaluate"][
                    "static_invest_years"], "year")[0],
            "unit": DATA_FORMAT["year"]["unit"]
        },
        "invest_income_table": invest_income_table
    }