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.HZcfzDao;
import io.renren.modules.app.entity.HZcfzEntity;
import io.renren.modules.app.service.HZcfzService;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

@Service("hZcfzService")
public class HZcfzServiceImpl extends ServiceImpl<HZcfzDao, HZcfzEntity> implements HZcfzService {

	/**
	 * 分页模糊查询
	 *
	 * @param pageNum
	 * @param pageSize
	 * @param hZcfzEntity
	 * @return
	 */
	@Override
	public PageInfo<HZcfzEntity> queryByPage(Integer pageNum, Integer pageSize, HZcfzEntity hZcfzEntity) {
		PageInfo<HZcfzEntity> pageInfo = null;
		String djrq = hZcfzEntity.getKjqj();
		String gdrq = "2020-12";// 切换新旧科目的临界日期
		int res = djrq.compareTo(gdrq);
		if (res <= 0) {// 用2021以前市局科目
			hZcfzEntity.setZtbm("0002");
		}else{
			hZcfzEntity.setZtbm("0003");
		}
		if (hZcfzEntity.getNum().equals("1")) {
			List<HZcfzEntity> hZcfzEntitys = baseMapper.queryByPage(hZcfzEntity);
			pageInfo = new PageInfo<HZcfzEntity>(hZcfzEntitys);
		}else{
			List<HZcfzEntity> hZcfzEntitys = baseMapper.queryByPage(hZcfzEntity);
			String item1 = "";
			String item2 = "";
			String item3 = "";
			String item4 = "";
			for (int i = 0; i < hZcfzEntitys.size(); i++) {
				item1 = hZcfzEntitys.get(i).getItem1();
				item2 = hZcfzEntitys.get(i).getItem2();
				item3 = hZcfzEntitys.get(i).getItem3();
				item4 = hZcfzEntitys.get(i).getItem4();
				if (item1.equals("") && item2.equals("") && item3.equals("") && item4.equals("")) {
					continue;
				}else{
					String item1Vules = algorithm(item1, hZcfzEntity.getZtbm(), hZcfzEntity.getKjqj(), hZcfzEntity.getSfyj());
					String item2Vules = algorithm(item2, hZcfzEntity.getZtbm(), hZcfzEntity.getKjqj(), hZcfzEntity.getSfyj());
					String item3Vules = algorithm(item3, hZcfzEntity.getZtbm(), hZcfzEntity.getKjqj(), hZcfzEntity.getSfyj());
					String item4Vules = algorithm(item4, hZcfzEntity.getZtbm(), hZcfzEntity.getKjqj(), hZcfzEntity.getSfyj());
					
					hZcfzEntitys.get(i).setItem1(item1Vules);
					hZcfzEntitys.get(i).setItem2(item2Vules);
					hZcfzEntitys.get(i).setItem3(item3Vules);
					hZcfzEntitys.get(i).setItem4(item4Vules);
				}


			}
			pageInfo = new PageInfo<HZcfzEntity>(hZcfzEntitys);
		}


		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(sfyj==null){
			sfyj="0";
		}

		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{
				 je = baseMapper.selectNC(ztbm, kjqj, kmdm);
				String je1 = baseMapper.selectQM_else1(ztbm, kjqj, kmdm);
				String tempje = baseMapper.selectQM_else2(ztbm, kjqj, kmdm);
				BigDecimal decimal1 = new BigDecimal(String.valueOf(je));
				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 updateZCFZ(HZcfzEntity hZcfzEntity) {
		baseMapper.updateZCFZ(hZcfzEntity);
	}

	//删除资产负债表公式中的一行
	@Override
	public void deleteinfo(HZcfzEntity hZcfzEntity) {
		baseMapper.deleteinfo(hZcfzEntity);

	}

}