package com.gyee.frame.service;

import com.gyee.frame.common.spring.InitialRunner;
import com.gyee.frame.model.auto.Windturbine;
import com.gyee.frame.model.auto.Windturbinepowercurvefitting;
import com.gyee.frame.util.StringUtils;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;


@Service
public class PowerToPowerService {

	private final String QS = "0";
	private final String FD = "-1";
	private final String GF = "-2";

	public double getPowerByWp(double speed, String wpId, double step) {
		double power = 0.0;
		List<Windturbine> wtls=new ArrayList<>();
		if(wpId.equals(QS))
		{

		}else if(wpId.equals(FD)) {
			for(Windturbine wt:InitialRunner.wtallls)
			{
				if (wt.getWindpowerstationid().endsWith("FDC"))
				{
					wtls.add(wt);
				}
			}
		}
		else if (InitialRunner.wp_wtmap.containsKey(wpId)) {
			wtls = InitialRunner.wp_wtmap.get(wpId);
		}else if (InitialRunner.pj_wtmap.containsKey(wpId)) {
			wtls = InitialRunner.pj_wtmap.get(wpId);
		}else if (InitialRunner.ln_wtmap.containsKey(wpId)) {
			wtls = InitialRunner.ln_wtmap.get(wpId);
		}

			for (Windturbine wt : wtls) {
				Map<Double, Windturbinepowercurvefitting> map = InitialRunner.wpcmap.get(wt.getId());
				if (map.containsKey(speed)) {
					Windturbinepowercurvefitting wc = map.get(speed);

					double actualpower = wc.getActualpower();
					// / <summary>
					// /电量分析主要针对省公司和各风场的每月实际发电量与计划的对比分析，可以查看省公司及各风场每月计划的完成情况和总体的计划完成情况，可以同比和环比进行比较；
					// /对省公司和各风场的实际发电量与理论发电量的对比分析，利用标准功率曲线中的风速，理论功率，和固定时间段的风频进行统计，设计统计分析公式为：
					// /理论发电量=（T*f1/f）*P1+（T*f2/f）*P2+…………（T*fn/f）*Pn
					// /T是选取的时间段；
					// /f是所有风频的和；
					// /f1、f2、fn是某风速对应的风频；
					// /P1、Pn是某风速对应理论曲线上的功率。
					// /必要性：如果理论电量能够实现计算的准确，调峰电量就可以用理论电量来减去实际电量得出。
					// /b、可选一段时间内的实际功率和理论功率能够形成曲线形式展示对比,理论功率根据实际风速利用理论功率曲线得出。
					// /c、风频数据取值时间段需要统一。
					// / </summary>
					// / <param name="powerDataList">功率集合</param>
					// / <param name="hours">时长小时数</param>
					// / <returns>理论发电量</returns>
					power = power + new BigDecimal(step).multiply(new BigDecimal(actualpower)).divide(new BigDecimal(10000), 2, RoundingMode.HALF_EVEN).doubleValue();

				}
			}

		return StringUtils.round(power, 2);
	}

	public double getPowerByWp(Map<Double, Integer> speedmap, String wpId, double step) {
		double power = 0.0;
		List<Windturbine> wtls=new ArrayList<>();
		if(wpId.equals(QS))
		{
			for(Windturbine wt:InitialRunner.wtallls)
			{
				wtls.add(wt);
			}
		}else if(wpId.equals(FD)) {
			for(Windturbine wt:InitialRunner.wtallls)
			{
				if (wt.getWindpowerstationid().endsWith("FDC"))
				{
					wtls.add(wt);
				}
			}
		}
		else if (InitialRunner.wp_wtmap.containsKey(wpId)) {
			wtls = InitialRunner.wp_wtmap.get(wpId);
		}else if (InitialRunner.pj_wtmap.containsKey(wpId)) {
			wtls = InitialRunner.pj_wtmap.get(wpId);
		}else if (InitialRunner.ln_wtmap.containsKey(wpId)) {
			wtls = InitialRunner.ln_wtmap.get(wpId);
		}else if (InitialRunner.wtmap.containsKey(wpId)) {
			wtls = new ArrayList<>();
			Windturbine wt=InitialRunner.wtmap.get(wpId);
			wtls.add(wt);

		}

			for (Windturbine wt : wtls) {
				Map<Double, Windturbinepowercurvefitting> map = InitialRunner.wpcmap.get(wt.getId());

				Set<Map.Entry<Double, Integer>> set = speedmap.entrySet();
				for (Iterator<Map.Entry<Double, Integer>> it = set.iterator(); it.hasNext(); ) {
					Map.Entry<Double, Integer> entry = (Map.Entry<Double, Integer>) it.next();
					// System.out.println(entry.getKey() + "--->" +
					// entry.getValue());

					double speed = entry.getKey() < 24.99 ? entry.getKey() : 24.99;
					if (null != map && map.containsKey(speed)) {
						Windturbinepowercurvefitting wc = map.get(speed);

						double actualpower = wc.getActualpower();
						// / <summary>
						// /电量分析主要针对省公司和各风场的每月实际发电量与计划的对比分析，可以查看省公司及各风场每月计划的完成情况和总体的计划完成情况，可以同比和环比进行比较；
						// /对省公司和各风场的实际发电量与理论发电量的对比分析，利用标准功率曲线中的风速，理论功率，和固定时间段的风频进行统计，设计统计分析公式为：
						// /理论发电量=（T*f1/f）*P1+（T*f2/f）*P2+…………（T*fn/f）*Pn
						// /T是选取的时间段；
						// /f是所有风频的和；
						// /f1、f2、fn是某风速对应的风频；
						// /P1、Pn是某风速对应理论曲线上的功率。
						// /必要性：如果理论电量能够实现计算的准确，调峰电量就可以用理论电量来减去实际电量得出。
						// /b、可选一段时间内的实际功率和理论功率能够形成曲线形式展示对比,理论功率根据实际风速利用理论功率曲线得出。
						// /c、风频数据取值时间段需要统一。
						// / </summary>
						// / <param name="powerDataList">功率集合</param>
						// / <param name="hours">时长小时数</param>
						// / <returns>理论发电量</returns>

						power = power + new BigDecimal(step).multiply(new BigDecimal(entry.getValue())).divide(new BigDecimal(speedmap.size()), 2, RoundingMode.HALF_EVEN).multiply(new BigDecimal(actualpower)).divide(new BigDecimal(10000), 2, RoundingMode.HALF_EVEN).doubleValue();

					}
				}

			}

		return StringUtils.round(power, 2);
	}


}
