package com.unis.base.server.service.impl;


import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;

import javax.annotation.Resource;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import com.github.pagehelper.PageHelper;
import com.unis.base.common.vo.CompanyVO;
import com.unis.base.server.dao.TyHlyDao;
import com.unis.base.server.dao.TyHlyzDao;
import com.unis.base.server.entity.TyHly;
import com.unis.base.server.entity.TyHlyDr;
import com.unis.base.server.entity.TyHlyz;
import com.unis.base.server.example.TyHlyExample;
import com.unis.base.server.example.TyHlyExample.Criteria;
import com.unis.base.server.example.TyHlyzExample;
import com.unis.base.server.service.CompanyService;
import com.unis.base.server.service.TyHlyService;
import com.unis.common.utils.ResponseWrapper;


@Service
public class TyHlyServiceServiceImpl implements TyHlyService {
	
	@Resource
	private TyHlyDao hlyDao;
	
	@Resource
	private TyHlyzDao hlyzDao;
	
	@Autowired
	private CompanyService companyService;
	



	@Override
	public List<TyHly> queryList(Integer pageNum, Integer pageSize, TyHly hly) {
		// TODO Auto-generated method stub
		TyHlyExample hlyExample = new TyHlyExample();
		Criteria createCriteria = hlyExample.createCriteria();
		if(hly != null){
			if(hly.getQymc() != null && hly.getQymc() != ""){
				createCriteria.andQymcLike("%"+hly.getQymc()+"%");
			}
			if(hly.getZzbm() != null && hly.getZzbm() != ""){
				createCriteria.andZzbmEqualTo(hly.getZzbm());
			}
		}
		
		hlyExample.setOrderByClause("qymc asc");
		PageHelper.startPage(pageNum, pageSize);
        List<TyHly> list = hlyDao.selectByExample(hlyExample);
        for (TyHly tyHly : list) {
        	TyHlyzExample hlyzExample = new TyHlyzExample();
    		com.unis.base.server.example.TyHlyzExample.Criteria createz = hlyzExample.createCriteria();
    		createz.andZidEqualTo(tyHly.getId());
    		hlyzExample.setOrderByClause("pp asc,cpmc asc");
        	List<TyHlyz> zList = hlyzDao.selectByExample(hlyzExample);
        	tyHly.setzList(zList);
		}
          
		return list;
	}
	


	@Override
	public int save(TyHly hly, List<TyHlyz> hlyzList) {
		// TODO Auto-generated method stub
		int a = hlyDao.insertSelective(hly);
		int b = 0;
		if(a>0){
			for (TyHlyz tyHlyz : hlyzList) {
				String uuid = UUID.randomUUID().toString().replaceAll("-", "");
				tyHlyz.setId(uuid);
				tyHlyz.setZid(hly.getId());
				b = hlyzDao.insertSelective(tyHlyz);
			}
		}
		return b;
	}



	@Override
	public int update(TyHly hly, List<TyHlyz> hlyzList) {
		// TODO Auto-generated method stub
		TyHlyExample hlyExample = new TyHlyExample();
		Criteria createCriteria = hlyExample.createCriteria();
		createCriteria.andIdEqualTo(hly.getId());
		int a = hlyDao.updateByExampleSelective(hly, hlyExample);
		if(a>0){
			//删除 新增
			TyHlyzExample hlyzExample = new TyHlyzExample();
			com.unis.base.server.example.TyHlyzExample.Criteria createz = hlyzExample.createCriteria();
			createz.andZidEqualTo(hly.getId());
			hlyzDao.deleteByExample(hlyzExample);
			
			for (TyHlyz tyHlyz : hlyzList) {
				String uuid = UUID.randomUUID().toString().replaceAll("-", "");
				tyHlyz.setId(uuid);
				tyHlyz.setZid(hly.getId());
				a = hlyzDao.insertSelective(tyHlyz);
			}
		}
		return a;
	}



	@Override
	public int remove(String id,String qyxydm) {
		// TODO Auto-generated method stub
		TyHlyExample hlyExample = new TyHlyExample();
		Criteria createCriteria = hlyExample.createCriteria();
		createCriteria.andIdEqualTo(id);
		int a = hlyDao.deleteByExample(hlyExample);
		if(a>0){
			TyHlyzExample hlyzExample = new TyHlyzExample();
			com.unis.base.server.example.TyHlyzExample.Criteria createz = hlyzExample.createCriteria();
			createz.andZidEqualTo(id);
			hlyzDao.deleteByExample(hlyzExample);
			
			//删除企业库数据
			companyService.delete(qyxydm);
			
			
		}
		return a;
	}



	@Override
	public Map<String, Object> getById(String id) {
		// TODO Auto-generated method stub
		Map<String, Object> modelMap = new HashMap<String, Object>();
		if(id != null && id != ""){
			TyHlyExample hlyExample = new TyHlyExample();
			Criteria createCriteria = hlyExample.createCriteria();
			createCriteria.andIdEqualTo(id);
			List<TyHly>  hlyList = hlyDao.selectByExample(hlyExample);
			if(hlyList.size()>0){
				TyHlyzExample hlyzExample = new TyHlyzExample();
				com.unis.base.server.example.TyHlyzExample.Criteria createz = hlyzExample.createCriteria();
				createz.andZidEqualTo(id);
				List<TyHlyz>  hlyzList = hlyzDao.selectByExample(hlyzExample);
				hlyList.get(0).setzList(hlyzList);
				modelMap.put("hly", hlyList.get(0));
			}else{
				modelMap.put("hly", new TyHly());
			}
			
		}
		return modelMap;
	}

	@Override
	public int updateObjz(TyHly hly, TyHlyz tyHlyz) {
		// TODO Auto-generated method stub
		TyHlyExample hlyExample = new TyHlyExample();
		Criteria createCriteria = hlyExample.createCriteria();
		createCriteria.andIdEqualTo(hly.getId());
		int a = hlyDao.updateByExampleSelective(hly, hlyExample);
		if(a>0){
			//查询子表存在  不存在新增
			TyHlyzExample hlyzExample = new TyHlyzExample();
			com.unis.base.server.example.TyHlyzExample.Criteria createz = hlyzExample.createCriteria();
			createz.andZidEqualTo(hly.getId());
			createz.andPpEqualTo(tyHlyz.getPp());
			createz.andCpmcEqualTo(tyHlyz.getCpmc());
			List<TyHlyz>  hlyzList = hlyzDao.selectByExample(hlyzExample);
			if(hlyzList.size()>0){
				//存在 不操作
			}else{
				//新增
				String uuid = UUID.randomUUID().toString().replaceAll("-", "");
				tyHlyz.setId(uuid);
				tyHlyz.setZid(hly.getId());
				a = hlyzDao.insertSelective(tyHlyz);
			}
		}
		return a;
	}
	

	@Override
	public List<TyHlyDr> exportByEntityResult(String qymc) {
		// TODO Auto-generated method stub
		
		return  hlyDao.exportByEntityResult(qymc);
		
	}


	@Override
	public List<String[]> importByFile(MultipartFile file)throws IOException{
		// TODO Auto-generated method stub
		 //获得Workbook工作薄对象
        Workbook workbook = getWorkBook(file);
        //创建返回对象，把每行中的值作为一个数组，所有行作为一个集合返回
        List<String[]> list = new ArrayList<String[]>();
        if (workbook != null) {
            for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {
                //获得当前sheet工作表
                Sheet sheet = workbook.getSheetAt(sheetNum);
                if (sheet == null) {
                    continue;
                }
                //获得当前sheet的开始行
                int firstRowNum = sheet.getFirstRowNum();
                //获得当前sheet的结束行
                int lastRowNum = sheet.getLastRowNum();
                //循环除了第一行的所有行
                for (int rowNum = firstRowNum + 2; rowNum <= lastRowNum; rowNum++) {
                    //获得当前行
                    Row row = sheet.getRow(rowNum);
                    if (row == null) {
                        continue;
                    }
                    //获得当前行的开始列
                    int firstCellNum = row.getFirstCellNum();
                    //获得当前行的列数
                    int lastCellNum = row.getPhysicalNumberOfCells();
                    String[] cells = new String[row.getPhysicalNumberOfCells()];
                    //循环当前行
                    for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) {
                        Cell cell = row.getCell(cellNum);
                        cells[cellNum] = getCellValue(cell);
                        if(cells[cellNum] == null || cells[cellNum] == ""){
                        	//String a = list.get(0)[1];
                        	cells[cellNum] = list.get(list.size()-1)[cellNum];
                        }
                    }
                    System.out.println(Arrays.toString(cells));
                    list.add(cells);
                }
            }
            workbook.close();
        }
		
		//System.out.println(list);
		return list;
	}

	
	public static Workbook getWorkBook(MultipartFile file) {
        //获得文件名
        String fileName = file.getOriginalFilename();
        //创建Workbook工作薄对象，表示整个excel
        Workbook workbook = null;
        try {
            //获取excel文件的io流
            InputStream is = file.getInputStream();
            //根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
            if (fileName.endsWith("xls")) {
                //2003
                workbook = new HSSFWorkbook(is);
            } else if (fileName.endsWith("xlsx")) {
                //2007
                workbook = new XSSFWorkbook(is);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return workbook;
    }
	
	public static String getCellValue(Cell cell) {
        String cellValue = "";
        if (cell == null) {
            return cellValue;
        }
        //把数字当成String来读，避免出现1读成1.0的情况
        if (cell.getCellType() == CellType.NUMERIC) {
            cell.setCellType(CellType.STRING);
        }
        //判断数据的类型
        switch (cell.getCellType()) {
            case NUMERIC: //数字
                cellValue = String.valueOf(cell.getNumericCellValue());
                break;
            case STRING: //字符串
                cellValue = String.valueOf(cell.getStringCellValue());
                break;
            case BOOLEAN: //Boolean
                cellValue = String.valueOf(cell.getBooleanCellValue());
                break;
            case FORMULA: //公式
                cellValue = String.valueOf(cell.getCellFormula());
                break;
            case BLANK: //空值
                cellValue = "";
                break;
            case ERROR: //故障
                cellValue = "非法字符";
                break;
            default:
                cellValue = "未知类型";
                break;
        }
        return cellValue;
    }



	@Override
	public ResponseWrapper importByEntityResult(MultipartFile file,String zzbm) throws IOException {
		// TODO Auto-generated method stub
		List<String[]> list = importByFile(file);
		if(list.size()>0){
			int insertNum= 0;
			int updateNum= 0;
			int skipNum= 0;
			int failNum= 0;
			int size= list.size();
			for (String[] strings : list) {
				if(strings[0] != null && strings[0] != "" && strings[2] != null && strings[2] != ""){ 
					//企业名称	类型	企业 信用代码 品牌	产品名称	 联系人	联系方式
					
					/**
					 * 查询是否存在此条数据
					 */
					TyHlyExample hlyExample = new TyHlyExample();
					Criteria createCriteria = hlyExample.createCriteria();
					createCriteria.andQyxydmEqualTo(strings[2]);
					createCriteria.andQymcEqualTo(strings[0]);
					List<TyHly> dataBaseList = hlyDao.selectByExample(hlyExample);
					
					TyHly tyHly = new TyHly();
					List<TyHlyz> zList = new ArrayList<TyHlyz>();
					TyHlyz tyHlyz = new TyHlyz();
					
					
	                CompanyVO companyVO = companyService.getCompanyBytyshxydm(strings[2]);  
	    			if(companyVO != null){
	    				//修改
	    				companyVO.setQymc(strings[0]);
	    				companyVO.setTyshxydm(strings[2]);
		    			int a = companyService.updateByEntitySelective(companyVO);
	    			}else{
	    				CompanyVO companyVO1 = new CompanyVO();
	    				companyVO1.setQymc(strings[0]);
	    				companyVO1.setTyshxydm(strings[2]);
	    				int a = companyService.insert(companyVO1);
	    			}
	                
					
					/**
					 * 不存在   新增 
					 * 存在     修改
					 */
					if(dataBaseList.size() == 0){
						//新增
						String uuid = UUID.randomUUID().toString().replaceAll("-", "");
						tyHly.setQymc(strings[0]);
						tyHly.setQylx(strings[1]);
						tyHly.setQyxydm(strings[2]);
						tyHly.setLxr(strings[5]);
						tyHly.setLxfs(strings[6]);
						tyHly.setZzbm(zzbm);
						tyHly.setId(uuid);
						tyHly.setCjsj(new Date());
	            		
						tyHlyz.setPp(strings[3]);
						tyHlyz.setCpmc(strings[4]);
						zList.add(tyHlyz);
						int res= this.save(tyHly,zList);
						if(res>0){
							insertNum+= 1;
						} else{
							failNum+= 1;
						}
					} else if(dataBaseList.size() > 0){
						//修改
						tyHly.setId(dataBaseList.get(0).getId());
						tyHly.setQymc(strings[0]);
						tyHly.setQylx(strings[1]);
						tyHly.setLxr(strings[5]);
						tyHly.setLxfs(strings[6]);
						tyHly.setZzbm(zzbm);
						
						tyHlyz.setPp(strings[3]);
						tyHlyz.setCpmc(strings[4]);
						int res= this.updateObjz(tyHly,tyHlyz);
						if(res>0){
							updateNum+= 1;
						} else{
							failNum+= 1;
						}
					} else{
						skipNum+= 1;
					}
					
				}
			}						
			return ResponseWrapper.success("共"+size+",跳过"+skipNum+",失败"+failNum+",成功新增"+insertNum+",成功更新"+updateNum);
		}else{
			return ResponseWrapper.fail("未读取到有效数据或存在无法解析的属性");
		}
		
	}
	
}
