package cn.tsy.idsse.dsds.service.sample;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import cn.hme.data.model.frame.optr.FrameOptr;
import cn.hme.framework.web.exception.BusinessException;
import cn.tsy.data.idsse.dsds.mapper.dict.DictDataMapper;
import cn.tsy.data.idsse.dsds.mapper.dict.DictEquipmentMapper;
import cn.tsy.data.idsse.dsds.mapper.dict.DictPlatformMapper;
import cn.tsy.data.idsse.dsds.mapper.sample.SampleLineMapper;
import cn.tsy.data.idsse.dsds.mapper.sample.SampleRegMapper;
import cn.tsy.data.idsse.dsds.mapper.sample.SampleStationMapper;
import cn.tsy.data.idsse.dsds.mapper.voyage.VoyageRegMapper;
import cn.tsy.data.idsse.dsds.model.sample.SampleLine;
import cn.tsy.data.idsse.dsds.model.sample.SampleReg;
import cn.tsy.data.idsse.dsds.model.sample.SampleStation;

@Service
public class SampleRegService {
	@Autowired
	private SampleRegMapper mReg;
	@Autowired
	private DictPlatformMapper mPlatform;
	@Autowired
	private DictEquipmentMapper mEquipment;
	@Autowired
	private DictDataMapper mData;
	@Autowired
	private VoyageRegMapper mVoyage;
	@Autowired
	private SampleLineMapper mLine;
	@Autowired
	private SampleStationMapper mStation;

	/***********************
	 * 增加或者修改
	 * 
	 */
	public void editSample(SampleReg sample, SampleStation satation, SampleLine line, FrameOptr optr) {
//		FrameAssertHelper.isNotNull(sample.getVoyage_id(), "航次号不能为空！");
//		FrameAssertHelper.isNotEmpty(sample.getPlatform_type(), "平台类型不能为空！");
//		FrameAssertHelper.isNotEmpty(sample.getPlatform_name(), "平台名称不能为空！");
//		FrameAssertHelper.isNotEmpty(sample.getDiving_name(), "潜次号不能为空！");
//		FrameAssertHelper.isNotNull(sample.getEquipment_id(), "设备类型不能为空！");
//		FrameAssertHelper.isNotNull(sample.getData_id(), "数据样品类型不能为空！");
//		FrameAssertHelper.isNotEmpty(sample.getJob_type(), "作业类型不能为空！");
//		// TS2-37-1_SY665_JXS_WW_
//		// 数据样品编号： 航次号_潜次号_设备类型_数据样品类型_作业序号
//		//
//		VoyageReg voyage = this.mVoyage.find(sample.getVoyage_id());
//		FrameAssertHelper.isNotNull(voyage, "未找到指定的航次信息，请检查！");
//		if (sample.getTsy_id() == null) {
//
//			DictEquipment equipment = this.mEquipment.find(sample.getEquipment_id());
//			DictData data = this.mData.find(sample.getData_id());
//			sample.setCreate_time(LocalDateTime.now());
//			sample.setEquipment_type(equipment.getEquipment_name());
//			sample.setEquipment_alias(equipment.getEquipment_alias());
//			sample.setData_alias(data.getData_alias());
//			sample.setSample_type(data.getData_name());
//			sample.setVoyage_name(voyage.getVoyage_name());
//			// 新增，需要生成数据集和数据样品编号
//			String dataset_name = voyage.getVoyage_name() + "_" + sample.getDiving_name() + "_" + sample.getEquipment_alias() + "_" + sample.getData_alias();
//			// 找到序号
//			Integer total = this.mReg.selectCount(SqlQuery.create().eq("dataset_name", dataset_name));
//			String sample_code = "";
//			int seq = 1;
//			if (total == null || total - 0 == 0)
//				sample_code = dataset_name + "_01";
//			else {
//				seq = total + 1;
//				sample_code = dataset_name + "_" + StringHelper.leftPadding(seq + "", 2, '0');
//			}
//
//			sample.setDataset_name(dataset_name);
//			sample.setSample_seq(seq);
//			sample.setSample_code(sample_code);
//			sample.setSample_name(sample_code);
//			this.mReg.insert(sample);
//			if (sample.getJob_type().equals(VoyageJobType.Line)) {
//				line.setSample_id(sample.getTsy_id());
//				this.mLine.insert(line);
//			}
//			if (sample.getJob_type().equals(VoyageJobType.Station)) {
//				satation.setSample_id(sample.getTsy_id());
//				this.mStation.insert(satation);
//			}
//		} else {
//			this.mReg.update(sample);
//			if (sample.getJob_type().equals(VoyageJobType.Line)) {
//				line.setSample_id(sample.getTsy_id());
//				this.mLine.update(line);
//			}
//			if (sample.getJob_type().equals(VoyageJobType.Station)) {
//				satation.setSample_id(sample.getTsy_id());
//				this.mStation.update(satation);
//			}
//		}

	}

//	public List<SampleReg> uploadSample(List<List<String>> values, FrameOptr optr) {
//		/****
//		 *  *航次名称	*平台类型	*平台名称	*潜次序号	布放经度	布放纬度	布放深度	
//		 *  入水时间	出水时间	左舷	右舷	主驾	
//		 *  坐底时间	抛载时间	回收时间	
//		 *  *设备类型	设备序列号	
//		 *  *作业类型	*样品类型	序号	采样时间	经度	纬度	深度	测线号	深度	开始经度	开始纬度	结束经度	结束纬度	开始时间	结束时间	备注	数据公开期限
//		 */
//
//		FrameAssertHelper.hasValue(values, "导入的文件中无有效数据，请检查！");
//		List<SampleReg> sampleArray = new ArrayList<>();
//		for (int i = 1; i < values.size(); i++) {
//			List<String> list = values.get(i);
//			if (list.get(0) == null || list.get(0).trim().length() == 0)
//				break;
//			// *航次名称 *平台类型 *平台名称 *潜次序号 布放经度 布放纬度 布放深度
//			// 入水时间 出水时间 左舷 右舷 主驾 坐底时间 抛载时间 回收时间
//			// *设备类型 设备序列号 *作业类型 *样品类型 文物器号
//			String voyage_name = list.get(0);
//			String platform_type = list.get(1);
//			String platform_name = list.get(2);
//			String diving_name = list.get(3);
//			String wiring_lon = list.get(4);
//			String wiring_lat = list.get(5);
//			String wiring_deep = list.get(6);
//			String water_in_time = list.get(7);
//			String water_out_time = list.get(8);
//			String driver_left = list.get(9);
//			String driver_right = list.get(10);
//			String driver_master = list.get(11);
//			String bottom_time = list.get(12);
//			String down_time = list.get(13);
//			String receive_time = list.get(14);
//			String equipment_type = list.get(15);
//			String equipment_sn = list.get(16);
//			String job_type = list.get(17);
//			String sample_type = list.get(18);
//			String antique_sn = list.get(19);
//			// 采样时间 经度 纬度 深度
//			String sampling_time = list.get(20);
//			String sampling_lon = list.get(21);
//			String sampling_lat = list.get(22);
//			String sampling_deep = list.get(23);
//			// 测线号	深度	开始经度	开始纬度	结束经度	结束纬度	开始时间	结束时间	备注	数据公开期限
//			String line_sn = list.get(24);
//			String line_deep = list.get(25);
//			String start_lon = list.get(26);
//			String start_lat = list.get(27);
//			String end_lon = list.get(28);
//			String end_lat = list.get(29);
//			String start_time = list.get(30);
//			String end_time = list.get(31);
//			String remark = list.get(32);
//			String data_role = list.get(33);
//
//			SampleReg sa = new SampleReg();
//			VoyageReg voyage = this.mVoyage.findWithColumn("voyage_name", voyage_name);
//			if (voyage == null)
//				throwError(i, "航次[" + voyage_name + "]未找到，请先添加该航次");
//			sa.setVoyage_id(voyage.getTsy_id());
//			sa.setVoyage_name(voyage_name);
//			DictPlatform platform = this.mPlatform.findWithColumn("platform_name", platform_type);
//			if (platform == null)
//				throwError(i, "平台类型[" + platform_type + "]未找到，请先添加该平台类型");
//			sa.setPlatform_type(platform_type);
//			sa.setPlatform_name(platform_name);
//			DictEquipment equipment = this.mEquipment.findWithColumn("equipment_name", equipment_type);
//			if (equipment == null)
//				throwError(i, "设备类型[" + equipment_type + "]未找到，请先添加该设备类型");
//			sa.setEquipment_alias(equipment.getEquipment_alias());
//			sa.setEquipment_id(equipment.getTsy_id());
//			sa.setEquipment_type(equipment_type);
//			DictData data = this.mData.findWithColumn("data_name", sample_type);
//			if (data == null)
//				throwError(i, "数据样品类型[" + sample_type + "]未找到，请先添加该数据样品类型");
//			sa.setData_alias(data.getData_alias());
//			sa.setData_id(data.getTsy_id());
//			sa.setSample_type(sample_type);
//			sa.setDiving_name(diving_name);
//			sa.setEquipment_sn(equipment_sn);
//
//			sa.setCreate_time(LocalDateTime.now());
//			// 新增，需要生成数据集和数据样品编号
//			String dataset_name = voyage.getVoyage_name() + "_" + diving_name + "_" + sa.getEquipment_alias() + "_" + sa.getData_alias();
//			// 找到序号
//			Integer total = this.mReg.selectCount(SqlQuery.create().eq("dataset_name", dataset_name));
//			String sample_code = "";
//			int seq = 1;
//			if (total == null || total - 0 == 0)
//				sample_code = dataset_name + "_01";
//			else {
//				seq = total + 1;
//				sample_code = dataset_name + StringHelper.leftPadding(seq + "", 2, '0');
//			}
//			sa.setDataset_name(dataset_name);
//			sa.setSample_seq(seq);
//			sa.setSample_code(sample_code);
//			if (StringHelper.hasValue(antique_sn))
//				sa.setAntique_sn(antique_sn);
//			if (StringHelper.hasValue(remark))
//				sa.setSample_remark(remark);
//			sa.setJob_type(job_type);
//			SampleLine line = new SampleLine();
//			SampleStation st = new SampleStation();
//			if (StringHelper.isEmpty(job_type))
//				throwError(i, "作业类型为空，请检查！");
//			if (VoyageJobType.Line.equals(job_type)) {
//				if (StringHelper.hasValue(line_sn))
//					line.setLine_sn(line_sn);
//				if (StringHelper.hasValue(start_lon))
//					line.setStart_lon(checkValue(start_lon));
//				if (StringHelper.hasValue(start_lat))
//					line.setStart_lat(checkValue(start_lat));
//				if (StringHelper.hasValue(end_lon))
//					line.setEnd_lon(checkValue(end_lon));
//				if (StringHelper.hasValue(end_lat))
//					line.setEnd_lat(checkValue(end_lat));
//				if (StringHelper.hasValue(start_time))
//					line.setStart_time(LocalDateHelper.parseDateTime(start_time));
//				if (StringHelper.hasValue(end_time))
//					line.setEnd_time(LocalDateHelper.parseDateTime(end_time));
//
//			} else if (VoyageJobType.Station.equals(job_type)) {
//				if (StringHelper.hasValue(wiring_lon))
//					st.setWiring_lon(checkValue(wiring_lon));
//				if (StringHelper.hasValue(wiring_lat))
//					st.setWiring_lat(checkValue(wiring_lat));
//				if (StringHelper.hasValue(wiring_deep))
//					st.setWiring_deep(wiring_deep);
//
//				if (StringHelper.hasValue(water_in_time))
//					st.setWater_in_time(LocalDateHelper.parseDateTime(water_in_time));
//				if (StringHelper.hasValue(water_out_time))
//					st.setWater_out_time(LocalDateHelper.parseDateTime(water_out_time));
//
//				if (StringHelper.hasValue(driver_left))
//					st.setDriver_left(driver_left);
//				if (StringHelper.hasValue(driver_right))
//					st.setDriver_right(driver_right);
//				if (StringHelper.hasValue(driver_master))
//					st.setDriver_master(driver_master);
//
//				if (StringHelper.hasValue(bottom_time))
//					st.setBottom_time(LocalDateHelper.parseDateTime(bottom_time));
//				if (StringHelper.hasValue(down_time))
//					st.setDown_time(LocalDateHelper.parseDateTime(down_time));
//				if (StringHelper.hasValue(receive_time))
//					st.setReceive_time(LocalDateHelper.parseDateTime(receive_time));
//				if (StringHelper.hasValue(sampling_time))
//					st.setSampling_time(LocalDateHelper.parseDateTime(sampling_time));
//				if (StringHelper.hasValue(sampling_lat))
//					st.setSampling_lat(checkValue(sampling_lat));
//				if (StringHelper.hasValue(sampling_lon))
//					st.setSampling_lon(checkValue(sampling_lon));
//				if (StringHelper.hasValue(sampling_deep))
//					st.setSampling_deep(sampling_deep);
//			} else
//				throwError(i, "作业类型[" + job_type + "]必须为测线作业或者站位作业！");
//
//			this.editSample(sa, st, line, optr);
//			sampleArray.add(sa);
//		}
//		return new ArrayList<>();
//	}

	/****************
	 * 删除数据样品
	 * 
	 */
	public void deleteSample(int sample_id) {
		/****************
		 * @todo 判断是否能实际删除
		 */
		this.mLine.deleteByColumn("sample_id", sample_id);
		this.mStation.deleteByColumn("sample_id", sample_id);
		this.mReg.deleteByKey(sample_id);
	}

	public void throwError(int row, String msg) {
		throw new BusinessException("数据样品信息导入失败->第[" + (row + 3) + "]行:" + msg);

	}

	// 经纬度保留4位
	public String checkValue(String value) {
		try {
			return String.format("%.4f", Double.parseDouble(value));
		} catch (Exception e) {
			return value;
		}
	}
}
