package io.renren.modules.app.service.impl;

import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

import io.renren.modules.app.dao.HZzsyybbDao;
import io.renren.modules.app.entity.HZzsyybbEntity;
import io.renren.modules.app.service.HZzsyybbService;

import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

@Service("hZzsyybbService")
public class HZzsyybbServiceImpl extends ServiceImpl<HZzsyybbDao, HZzsyybbEntity> implements HZzsyybbService {

	/**
	 * 分页模糊查询
	 * 
	 * @param pageNum
	 * @param pageSize
	 * @param
	 * @return
	 */
	@Override
	public PageInfo<HZzsyybbEntity> queryByPage(Integer pageNum, Integer pageSize, HZzsyybbEntity hZzsyybbEntity) {
		PageInfo<HZzsyybbEntity> pageInfo = null;
		if (hZzsyybbEntity.getNum().equals("1")) {
			List<HZzsyybbEntity> hZzsyybbEntitys = baseMapper.queryByPage(hZzsyybbEntity);
			pageInfo = new PageInfo<HZzsyybbEntity>(hZzsyybbEntitys);
		}else{
			List<HZzsyybbEntity> hZzsyybbEntitys = baseMapper.queryByPage(hZzsyybbEntity);
			String item1 = "";
			String item2 = "";
			Date date;
			String kjqj = hZzsyybbEntity.getKjqj().substring(5, 7);
			SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-mm");
			if (kjqj.equals("12")) {
				try {
					date = (Date) formatter2.parse(hZzsyybbEntity.getKjqj());
					Calendar calendar = Calendar.getInstance();
					calendar.setTime(date);
					calendar.add(Calendar.MONTH, -1);
					Date kjqj2 = (Date) calendar.getTime();
					String dateString = formatter2.format(kjqj2);
					for (int i = 0; i < hZzsyybbEntitys.size(); i++) {
						item1 = hZzsyybbEntitys.get(i).getItem1();
						item2 = hZzsyybbEntitys.get(i).getItem2();
						if (item1.equals("") && item2.equals("")) {
							continue;
						} else {
							String item1Vules = algorithm(item1, hZzsyybbEntity.getZtbm(), dateString,
									hZzsyybbEntity.getSfyj());
							String item2Vules = algorithm(item2, hZzsyybbEntity.getZtbm(), hZzsyybbEntity.getKjqj(),
									hZzsyybbEntity.getSfyj());
							hZzsyybbEntitys.get(i).setItem1(item1Vules);
							hZzsyybbEntitys.get(i).setItem2(item2Vules);
						}
					}
				} catch (ParseException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}else{
				for (int i = 0; i < hZzsyybbEntitys.size(); i++) {
					item1 = hZzsyybbEntitys.get(i).getItem1();
					item2 = hZzsyybbEntitys.get(i).getItem2();

					if (item1.equals("") && item2.equals("")) {
						continue;
					} else {
						String item1Vules = algorithm(item1, hZzsyybbEntity.getZtbm(), hZzsyybbEntity.getKjqj(),
								hZzsyybbEntity.getSfyj());
						String item2Vules = algorithm(item2, hZzsyybbEntity.getZtbm(), hZzsyybbEntity.getKjqj(),
								hZzsyybbEntity.getSfyj());
						hZzsyybbEntitys.get(i).setItem1(item1Vules);
						hZzsyybbEntitys.get(i).setItem2(item2Vules);
					}
				}
			}
			pageInfo = new PageInfo<HZzsyybbEntity>(hZzsyybbEntitys);
		}
		return pageInfo;
	}

	/**
	 * 单个或批量删除
	 * 
	 * @param ids
	 */
	@Override
	public void deleteBatch(String[] ids) {
		this.deleteBatchIds(Arrays.asList(ids));
	}

	/**
	 * 算法1
	 */
	public String algorithm(String str, String ztbm, String kjqj, String sfyj) {
		int _11_pos = 1;
		int _11_str = 0;
		char _11_flag = '0';
		char _km_flag = '0';
		int _km_len = 0;
		int _fu_len = 0;
		String _n_je = "0";
		String _c_temp = "";
		String _c_func = "";
		String _c_kmdm = "";
		_11_str = str.length();

		sfyj = baseMapper.selectKJQJ(ztbm, kjqj);

		if (_11_str > 4) {
			int num = 0;
			while (_11_pos <= _11_str) {

				_c_temp = str.substring(0 + num, 1 + num);
				List<String> list = new ArrayList<String>();
				list.add("0");
				list.add("1");
				list.add("2");
				list.add("3");
				list.add("4");
				list.add("5");
				list.add("6");
				list.add("7");
				list.add("8");
				list.add("9");
				list.add("+");
				list.add("-");
				list.add("Q");
				list.add("C");
				list.add("M");
				list.add("J");
				list.add("F");
				list.add("D");
				list.add("B");
				list.add("N");

				boolean flag = list.contains(_c_temp);
				if (flag == false) {
					return ("0");
				}

				List<String> list2 = new ArrayList<String>();
				list2.add("0");
				list2.add("1");
				list2.add("2");
				list2.add("3");
				list2.add("4");
				list2.add("5");
				list2.add("6");
				list2.add("7");
				list2.add("8");
				list2.add("9");
				boolean flag2 = list2.contains(_c_temp);

				// 已找到公式
				if (_11_flag == '1' && _km_flag == '0' && flag2 == false) {
					return "0";
				}

				List<String> list3 = new ArrayList<String>();
				list3.add("0");
				list3.add("1");
				list3.add("2");
				list3.add("3");
				list3.add("4");
				list3.add("5");
				list3.add("6");
				list3.add("7");
				list3.add("8");
				list3.add("9");
				list3.add("+");
				list3.add("-");
				boolean flag3 = list3.contains(_c_temp);

				// 未找到公式
				if (_11_flag == '0' && flag3 == true) {
					return "0";
				}

				List<String> list4 = new ArrayList<String>();
				list4.add("+");
				list4.add("-");
				boolean flag4 = list4.contains(_c_temp);

				if (_km_flag != '1' && _11_flag != '0' && flag4 == true) {
					return "-1.1234";
				}

				// 计算
				if (_c_temp.equals("+") && _11_flag == '1' && _km_flag == '1') {
					BigDecimal decimal1 = new BigDecimal(String.valueOf(_n_je));
					BigDecimal decimal2 = new BigDecimal(
							String.valueOf(algorithm2(_c_func, ztbm, kjqj, _c_kmdm, sfyj)));
					BigDecimal add = decimal1.add(decimal2);
					_n_je = add.toString();

					_11_flag = '0';
					_km_flag = '0';
					_km_len = 0;
					_c_func = "";
					_c_kmdm = "";
					_fu_len = 0;
				}
				if (_c_temp.equals("-") && _11_flag == '1' && _km_flag == '1') {
					BigDecimal decimal1 = new BigDecimal(String.valueOf(_n_je));
					BigDecimal decimal2 = new BigDecimal(
							String.valueOf(algorithm2(_c_func, ztbm, kjqj, _c_kmdm, sfyj)));
					BigDecimal result = decimal1.subtract(decimal2);
					_n_je = result.toString();

					_11_flag = '0';
					_km_flag = '0';
					_km_len = 0;
					_c_func = "";
					_c_kmdm = "";
					_fu_len = 0;
				}

				// 找公式
				List<String> list5 = new ArrayList<String>();
				list5.add("Q");
				list5.add("C");
				list5.add("M");
				list5.add("J");
				list5.add("F");
				list5.add("D");
				list5.add("B");
				list5.add("N");
				boolean flag5 = list5.contains(_c_temp);

				if (flag5 == true) {
					_c_func = _c_func + _c_temp;

					List<String> list6 = new ArrayList<String>();
					list6.add("NC");
					list6.add("QC");
					list6.add("QM");
					list6.add("JF");
					list6.add("DF");
					list6.add("BNJF");
					list6.add("BNDF");
					boolean flag6 = list6.contains(_c_func);
					if (flag6 == true) {
						_11_flag = '1';
					}
					_fu_len = _fu_len + 1;
					if (_fu_len > 4) {
						return "0";
					}
				}

				flag2 = list2.contains(_c_temp);
				if (flag2 == true) {
					_km_len = _km_len + 1;
					if (_km_len == 1) {
						_km_flag = '1';
					}
					_c_kmdm = _c_kmdm + _c_temp;
				}
				num = num + 1;
				_11_pos = _11_pos + 1;
			}
		} else {
			return "0";
		}
		return _n_je;
	}

	// 计算2
	public String algorithm2(String func, String ztbm, String kjqj, String kmdm, String sfyj) {

		String je = "0";

		List<String> list6 = new ArrayList<String>();
		list6.add("NC");
		list6.add("QC");
		list6.add("QM");
		list6.add("JF");
		list6.add("DF");
		list6.add("BNJF");
		list6.add("BNDF");
		boolean flag6 = list6.contains(func);
		if (flag6 == false) {
			return "0";
		}
		if (func.equals("NC")) {
			je = baseMapper.selectNC(ztbm, kjqj, kmdm);

		}
		if (func.equals("QC")) {
			je = baseMapper.selectQC(ztbm, kjqj, kmdm);

		}
		if (func.equals("QM")) {

			if (sfyj.equals("1")) {
				je = baseMapper.selectQM_1(ztbm, kjqj, kmdm);

			} else {
				String je1 = baseMapper.selectQM_else1(ztbm, kjqj, kmdm);
				String tempje = baseMapper.selectQM_else2(ztbm, kjqj, kmdm);
				BigDecimal decimal1 = new BigDecimal(String.valueOf(je1));
				BigDecimal decimal2 = new BigDecimal(String.valueOf(tempje));
				BigDecimal add = decimal1.add(decimal2);
				System.out.println(add);
				return add.toString();

			}
		}
		if (func.equals("JF")) {
			je = baseMapper.selectJF(ztbm, kjqj, kmdm);

		}
		if (func.equals("DF")) {
			je = baseMapper.selectDF(ztbm, kjqj, kmdm);

		}
		if (func.equals("BNJF")) {
			je = baseMapper.selectBNJF(ztbm, kjqj, kmdm);

		}
		if (func.equals("BNDF")) {
			je = baseMapper.selectBNDF(ztbm, kjqj, kmdm);

		}

		return je;
	}

	//增值收益表公式修改
	@Override
	public void updateZZSYYBB(HZzsyybbEntity hZzsyybbEntity) {
		baseMapper.updateZZSYYBB(hZzsyybbEntity);
	}
}