# from 供蒸汽方案 import 供蒸汽方案
# from 供冷方案 import 供冷方案
# from 供蒸汽制冷方案 import 供蒸汽制冷方案
# from 燃气轮机类 import 燃气轮机类
# from 燃气内燃机类 import 燃气内燃机类
# from 燃气锅炉类 import 燃气锅炉类
# from 螺杆机组类 import 螺杆机组类
import math

import copy
from .Data import 数据类
from .Sample import 设备样本类


class 配置组合类:
	def __init__(self, 数据, 蒸汽负荷, 技术路线列表):
		self.产蒸汽 = False
		self.制冷 = False
		self.数据 = 数据
		self.设备样本库 = 设备样本类(self.数据)

		self.方案列表 =[]
		self.配置方案列表 = []
		self.蒸汽负荷峰值 = 蒸汽负荷

		self.待解决蒸汽负荷 = self.蒸汽负荷峰值
		self.燃气轮机样本列表 = self.设备样本库.燃气轮机样本列表
		self.燃气轮机最大规模 = self.数据.数据索引['燃气轮机最大规模']
		self.燃气轮机最小规模 = self.数据.数据索引['燃气轮机最小规模']

		self.燃气内燃机样本列表 = self.设备样本库.燃气内燃机样本列表
		self.燃气内燃机最大规模 = self.数据.数据索引['燃气内燃机最大规模']
		self.燃气内燃机最小规模 = self.数据.数据索引['燃气内燃机最小规模']

		self.技术路线列表 = 技术路线列表
		self.供蒸汽方案备用设备 = '燃气锅炉'

		待解决蒸汽负荷 = self.待解决蒸汽负荷
		self.蒸汽方案设备筛选 ={
								'燃气轮机': self.供蒸汽方案筛选燃气轮机,
								'燃气内燃机': self.供蒸汽方案筛选燃气内燃机,
								'燃气锅炉': self.供蒸汽方案筛选燃气锅炉,
								}

		self.供蒸汽方案组合(self.技术路线列表, [], 待解决蒸汽负荷)


	def 供蒸汽方案组合(self, 技术路线列表, 设备配置, 待解决负荷):
		if 技术路线列表 == []:
			燃气轮机_flag = False
			燃气内燃机_flag = False
			for 设备 in 设备配置:
				if 设备['锅炉额定产汽量'] == 0:
					设备配置.remove(设备)
			for 设备 in 设备配置:
				if 设备['名称'] == '燃气轮机' :
					燃气轮机_flag = True
				elif 设备['名称'] == '燃气内燃机' :
					燃气内燃机_flag = True

			if 燃气轮机_flag == True and 燃气内燃机_flag == True:
				pass
			else:
				发电机余热设备总额定产汽量 = 0
				for 设备样本 in 设备配置:
					if 设备样本['名称'] == '燃气轮机' or 设备样本['名称'] == '燃气内燃机':
						发电机余热设备总额定产汽量 += 设备样本['锅炉额定产汽量']
				备用设备样本 = self.蒸汽方案设备筛选[self.供蒸汽方案备用设备](发电机余热设备总额定产汽量)[0][0]
				设备配置.append(备用设备样本)
				self.配置方案列表.append(设备配置)
		else:
			技术路线列表拷贝 = copy.deepcopy(技术路线列表)
			技术路线 = 技术路线列表拷贝.pop(0)
			筛选后的设备样本列表 = self.蒸汽方案设备筛选[技术路线] (待解决负荷)                 # 需确保返回的样本列表非空, 否则将导致无法进入下面的循环
			for 设备样本list in 筛选后的设备样本列表:
				设备配置拷贝 = copy.deepcopy(设备配置)
				解决负荷 = 0
				for 设备样本 in 设备样本list:
					设备配置拷贝.append(设备样本)
					解决负荷 += 设备样本['锅炉额定产汽量']
				待解决负荷拷贝 = 待解决负荷
				待解决负荷拷贝 -= 解决负荷
				self.供蒸汽方案组合(技术路线列表拷贝, 设备配置拷贝, 待解决负荷拷贝)

	def 供蒸汽方案筛选燃气轮机(self, 蒸汽负荷):
		筛选后的设备样本列表 = []
		for 燃气轮机样本 in self.燃气轮机样本列表:
			if 燃气轮机样本['锅炉额定产汽量'] == 0:
				筛选后的设备样本列表.append([燃气轮机样本])
			else:
				for i in  range(int(self.数据.数据索引['燃气轮机最大台数'])):
					台数 = i+1
					if 燃气轮机样本['锅炉额定产汽量'] * 台数 <= 1.1 * 蒸汽负荷 and \
							self.燃气轮机最小规模 <= 燃气轮机样本['发电功率'] / self.数据.数据索引['燃气轮机发电功率修正'] * 台数 and \
							燃气轮机样本['发电功率'] / self.数据.数据索引['燃气轮机发电功率修正'] * 台数 <= self.燃气轮机最大规模:
						筛选后的设备样本列表.append([燃气轮机样本] * 台数)
		return 筛选后的设备样本列表

	def 供蒸汽方案筛选燃气内燃机(self, 蒸汽负荷):
		筛选后的设备样本列表 = []
		for 燃气内燃机样本 in self.燃气内燃机样本列表:
			if 燃气内燃机样本['锅炉额定产汽量'] == 0:
				筛选后的设备样本列表.append([燃气内燃机样本])
			else:
				for i in  range(int(self.数据.数据索引['燃气内燃机最大台数'])):
					台数 = i+1
					if 燃气内燃机样本['锅炉额定产汽量'] * 台数 <= 1.1 * 蒸汽负荷 and self.燃气内燃机最小规模 <= 燃气内燃机样本['发电功率'] * 台数 and 燃气内燃机样本['发电功率'] * 台数 <= self.燃气内燃机最大规模:
						筛选后的设备样本列表.append([燃气内燃机样本] * 台数)
		return 筛选后的设备样本列表

	def 供蒸汽方案筛选燃气锅炉(self, 蒸汽负荷):
		筛选后的设备样本列表 = []
		燃气锅炉样本 = {'名称': '燃气锅炉', '锅炉额定产汽量': max(0, math.ceil(蒸汽负荷))}
		筛选后的设备样本列表.append([燃气锅炉样本])
		return 筛选后的设备样本列表

