from dataclasses import dataclass

from pot_libs.common.components.fields import Cid
from pot_libs.sanic_api import Model
from pot_libs.sanic_api.column import Float, List, Str, Opt, Int, Dict
from unify_api.utils.response_code import DbErr


@dataclass
class PvEvaluateReq(Model):
    cid: int = Int("cid").eg(45)
    start: str = Str("开始时间").eg("2019-05")
    end: str = Str("结束时间").eg("2019-12")


@dataclass
class PvEvaluateComputeReq(Model):
    cid: int = Int("cid").eg(45)
    start: str = Str("开始时间").eg("2019-05")
    end: str = Str("结束时间").eg("2019-12")
    area_conversion_ratio: float = Float("面积折算系数").eg(0.8)
    capacity_per_meter: float = Float("单位面积容量").eg(100)
    install_space: float = Float("场地面积").eg(1000)
    self_use_ratio: float = Float("自用比例").eg(1)
    internet_ratio: float = Float("上网比例").eg(0)
    efficiency: float = Float("光伏发电效率").eg(0.80)
    evaluate_year: int = Int("发电年限").eg(25)
    rmb_per_w: float = Float("建设单价").eg(4.3)
    maintenance_per_wp: float = Float("维护成本").eg(0.05)
    coal_in_grid: float = Float("上网电价").eg(0.45)


@dataclass
class PvEvaluateResp(Model):
    rule: int = Opt(Int("一充一放:1、两充两放:2").eg(1))
    sum_kwh_p: float = Float("峰值总耗电量").eg(1)
    electrovalence: dict = Dict("电价时段").eg({"v": ["01:00"]})
    slot: list = List("时间").eg(["00:00", "01:00"])
    p: list = List("负荷").eg(["12", "13"])
    kwh: list = List("电量").eg(["1", "2"])


@dataclass
class PvEvaluateTwoResp(Model):
    rule: int = Opt(Int("一充一放:1、两充两放:2").eg(1))
    sum_kwh_p: float = Float("峰时段总耗电量").eg(1)
    sum_kwh_s: float = Opt(Float("尖时段总耗电量").eg(1))
    electrovalence: dict = Dict("电价时段").eg({"v": ["01:00"]})
    kwh_slot: list = List("电量时间").eg(["00:00", "01:00"])
    p_slot: list = List("负荷时间").eg(["00:00", "01:00"])
    p: list = List("负荷").eg(["12", "13"])
    kwh: list = List("电量").eg(["1", "2"])


@dataclass
class Optimizecurve(Model):
    """光伏优化曲线"""
    slot: list = List('slot').items(Str())
    before_curve: list = List('优化前').items(Float())
    after_curve: list = List('优化后').items(Float())
    pv_curve: list = List('pv_curve').items(Float())


@dataclass
class ComputeTable(Model):
    """光伏测算表"""
    slot: list = List('年份').items(Int())
    year_attenuation: list = List('年衰减值').items(Float())
    surplus_capacity: list = List('剩余容量').items(Float())
    year_add_electric: list = List('年发电量').items(Float())
    wp_rmb: list = List('维护成本').items(Float())
    all_rmb: list = List('累计总成本').items(Float())
    this_year_earnings: list = List('本年收益').items(Float())
    all_earnings: list = List('累计收益').items(Float())


@dataclass
class PvEvaluateComputeResp(Model):
    optimize_curve: Optimizecurve = Optimizecurve   # 优化曲线
    compute_table: list = List('测算表')  # 测算表
    invest_capacity: float = Float("装机容量").eg(1000.123)
    first_year_kwh: float = Float("首年发电量").eg(1000.123)
    static_period: float = Float("回收周期").eg(1000.123)
    total_capacity: float = Float("建设面积").eg(1000.123)
    invest_charge: float = Float("建设投资").eg(1000.123)
    c_emissions: float = Float("首年碳减排").eg(1000.123)
    co2_emissions: float = Float("首年co2减排").eg(1000.123)
    year_earnings: float = Float("预期年收益").eg(1000.123)
    all_c_emissions: float = Float("累计碳减排").eg(1000.123)
    tree: int = Int("植树").eg(1000)
    download_url: str = Str("下载连接").eg("")


@dataclass
class EssEvaluateReq (Model):
    cid: int = Int("cid").eg(45)
    start: str = Str("开始时间").eg("2019-05")
    end: str = Str("结束时间").eg("2019-12")
    work_day: int = Int("1 全部 2工作日 3非工作日").eg(1)


@dataclass
class EssEvaluateComputeReq(Model):
    cid: int = Int("cid").eg(45)
    start: str = Str("开始时间").eg("2019-05")
    end: str = Str("结束时间").eg("2019-12")
    rule: int = Int("一充一放:1、两充两放:2").eg(1)
    install_capacity: float = Float("储能容量").eg(1000)
    pcs_type: float = Float("pcs类型").eg(123)
    decay_rate: float = Float("衰减率").eg(0.03)
    DOD: float = Float("放电深度").eg(0.9)
    year_use_days: int = Int("年利用天数").eg(330)
    maintenance_ratio_per_year: float = Float("运维费用占静态投资比例").eg(0.03)
    subsidy_year: int = Int("补贴年限").eg(10)
    epc_price: float = Float("建设单价").eg(1.4)
    kwh_subsidy: float = Float("度电补贴").eg(0)


@dataclass
class OptCurve(Model):
    """储能优化曲线"""
    slot: list = List('slot').items(Str())
    load_curve: list = List('load_curve').items(Float())
    bat_curve: list = List('bat_curve').items(Float())
    load_bat_curve: list = List('load_bat_curve').items(Float())


# @dataclass
# class EssComputeTable(Model):
#     """储能测算表"""
#     slot: list = List('年份').items(Int())
#     surplus_capacity: list = List('剩余容量').items(Float())
#     count_num: list = List('累计充放数').items(Float())
#     earnings: list = List('充放电收益').items(Float())
#     wp_rmb: list = List('维护成本').items(Float())
#     all_rmb: list = List('累计总成本').items(Float())
#     this_year_earnings: list = List('本年收益').items(Float())
#     all_earnings: list = List('累计收益').items(Float())


@dataclass
class EssEvaluateComputeResp(Model):
    evaluate_table: OptCurve = OptCurve
    ess_compute_table: list = List('测算表')  # 测算表
    invest_capacity: float = Float("储能容量").eg(1000.123)
    static_period: int = Int("回收期").eg(10)
    pcs_capacity: float = Float("PCS选型").eg(1000)
    month_average_dc_kwh: float = Float("月削峰电量").eg(1000.123)
    month_dc_benefit: float = Float("预期价差收益").eg(1000.123)
    download_url: str = Str("download_url").eg("")


@dataclass
class ElectrovalenceSettingReq(Model):
    cid: int = Int("cid").eg(45)
    price_md: float = Float("需量单价").eg(35)
    price_tc: float = Float("容量单价").eg(23)
    std_cos: float = Float("力调电费").eg(0.85)
    electrovalence: list = List("电镀电费").eg([{
        "name": "s", "price": "0.123", "slot": [["12:00", "13:00"]]}])


@dataclass
class ElectrovalenceReq(Model):
    cid: int = Int("cid").eg(45)


@dataclass
class ElectrovalenceResp(Model):
    price_md: float = Float("需量单价").eg(1000.123)
    price_tc: float = Float("容量单价").eg(1000.123)
    std_cos: float = Float("力调电费").eg(1000.123)
    electrovalence: list = List("电度电费:s尖,p峰,f平,v谷").eg([{
        "name": "s", "price": "0.123", "slot": ["12:00-13:00"]}])