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.HZzsyfpDao;
import io.renren.modules.app.entity.HZzsyfpEntity;
import io.renren.modules.app.service.HZzsyfpService;
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("hZzsyfpService")
public class HZzsyfpServiceImpl extends ServiceImpl<HZzsyfpDao, HZzsyfpEntity> implements HZzsyfpService {


    /**
     * 分页模糊查询
     * @param pageNum
     * @param pageSize
     * @param hZzsyfpEntity
     * @return
     */
    @Override
    public PageInfo<HZzsyfpEntity> queryByPage(Integer pageNum, Integer pageSize, HZzsyfpEntity hZzsyfpEntity) {
        PageInfo<HZzsyfpEntity> pageInfo = null;
        if (hZzsyfpEntity.getNum().equals("1")) {
        	List<HZzsyfpEntity> hZzsyfpEntitys = baseMapper.queryByPage(hZzsyfpEntity);
        	pageInfo = new PageInfo<HZzsyfpEntity>(hZzsyfpEntitys);
		}else{
			List<HZzsyfpEntity> hZzsyfpEntitys = baseMapper.queryByPage(hZzsyfpEntity);
	        String item1 = "";
			String item2 = "";
	        Date date;
	        SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-mm");
	        if (hZzsyfpEntity.getSfzt().equals("1")) {
	        	try {
					date = (Date) formatter2.parse(hZzsyfpEntity.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 < hZzsyfpEntitys.size(); i++) {
						item1 = hZzsyfpEntitys.get(i).getItem1();
						item2 = hZzsyfpEntitys.get(i).getItem2();

						if (item1.equals("") && item2.equals("")) {
							continue;
						} else {

							String item1Vules = algorithm(item1, hZzsyfpEntity.getZtbm(), hZzsyfpEntity.getKjqj(),
									hZzsyfpEntity.getSfyj());
							String item2Vules = algorithm(item2, hZzsyfpEntity.getZtbm(), dateString,
									hZzsyfpEntity.getSfyj());
							
							hZzsyfpEntitys.get(i).setItem1(item1Vules);
							hZzsyfpEntitys.get(i).setItem2(item2Vules);

						}

					}
				} catch (ParseException e) {
					e.printStackTrace();
				}
			}else{
				for (int i = 0; i < hZzsyfpEntitys.size(); i++) {
					item1 = hZzsyfpEntitys.get(i).getItem1();
					item2 = hZzsyfpEntitys.get(i).getItem2();

					if (item1.equals("") && item2.equals("")) {
						continue;
					} else {

						String item1Vules = algorithm(item1, hZzsyfpEntity.getZtbm(), hZzsyfpEntity.getKjqj(),
								hZzsyfpEntity.getSfyj());
						String item2Vules = algorithm(item2, hZzsyfpEntity.getZtbm(), hZzsyfpEntity.getKjqj(),
								hZzsyfpEntity.getSfyj());
						hZzsyfpEntitys.get(i).setItem1(item1Vules);
						hZzsyfpEntitys.get(i).setItem2(item2Vules);

					}

				}
			}
	        
	        pageInfo = new PageInfo<HZzsyfpEntity>(hZzsyfpEntitys);
		}
        
        
        
        
        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 updateZZSYFP(HZzsyfpEntity hZzsyfpEntity) {
		baseMapper.updateZZSYFP(hZzsyfpEntity);
	}

}