package org.springblade.business.service.impl;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.apache.poi.hssf.usermodel.HSSFDataFormatter;
import org.apache.poi.ss.usermodel.*;
import org.springblade.business.entity.DatumPoint;
import org.springblade.business.mapper.DatumPointMapper;
import org.springblade.business.utils.ExcelUtil;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.StringUtil;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.*;

/**
 * @author yangyj
 * @Date 2022/6/7 15:49
 * @description TODO
 */
@Service
public class DatumPointService extends BaseServiceImpl<DatumPointMapper, DatumPoint> {




    public R importData(MultipartFile file, Long contractId, Long projectId, Integer dataType) throws Exception {
        List<String> level=new ArrayList<>();
        level.add("一级");
        level.add("二级");
        level.add("三级");
        level.add("四级");
        try {
            Workbook wb = WorkbookFactory.create(file.getInputStream());
            Sheet sheet = wb.getSheetAt(0);
            List<DatumPoint> importList = new ArrayList<>();
            Row row1=sheet.getRow(0);
            if(dataType==0){
                String dengji= ExcelUtil.getValue(row1.getCell(2)).toString();
                String beizhu=ExcelUtil.getValue(row1.getCell(3)).toString();
                if( !"等级".equals(dengji)||!"备注".equals(beizhu)){
                    return  R.fail("导入的数据格式有错，请对准导入模板确认！");
                }
            }
            if(dataType==1){
                String dengji=ExcelUtil.getValue(row1.getCell(4)).toString();
                String beizhu=ExcelUtil.getValue(row1.getCell(5)).toString();
                if( !"等级".equals(dengji)||!"备注".equals(beizhu)){
                    return  R.fail("导入的数据格式有错，请对准导入模板确认！");
                }
            }

            for (int i = 1; ; i++) {
                Row row = sheet.getRow(i);
                if(row == null) {
                    break;
                }
                if(dataType==0) {
                    DatumPoint obj = new DatumPoint();
                    for (int j = 0; j < 4; j++) {
                        String value = (String) ExcelUtil.getValue(row.getCell(j));
                        if (StringUtil.isEmpty(value)) {
                            value = "";
                        }
                        String msg="";
                        //判断测站点名称是否为空
                        String name=(String)ExcelUtil.getValue(row.getCell(0));
                        if(StringUtil.isEmpty(name)){
                            msg="第"+i+"行，测站点名称为空，请输入！";
                            return  R.fail(msg);
                        }
                        //判断，同一合同段下，测站点名称是否重复
                        if(this.count(Wrappers.<DatumPoint>lambdaQuery().eq(DatumPoint::getName,name).eq(DatumPoint::getContractId,contractId).eq(DatumPoint::getType,dataType))>0){
                            msg="第"+i+"行，测站点:"+name+"已存在，请修改";
                            return  R.fail(msg);
                        }
                        switch (j) {
                            case 0:
                                obj.setName(value);
                                break;
                            case 1:
                                obj.setH(Double.parseDouble(value));
                                break;
                            case 2:
                                //判断等级是否为：一级、二级、三级、四级
                                if(StringUtil.isNotBlank((String) ExcelUtil.getValue(row.getCell(j)))) {
                                    if(!level.contains(value)){
                                        msg="第"+i+"行，等级应该为：一级、二级、三级 或 四级，请修改！";
                                        return  R.fail(msg);
                                    }
                                    obj.setLevel(value);
                                }
                                break;
                            case 3:
                                obj.setRemark(value);
                                break;
                            default:
                                break;
                        }

                    }
                    obj.setContractId(contractId);
                    obj.setProjectId(projectId);
                    obj.setCreateTime(new Date());
                    obj.setType(dataType);
                    importList.add(obj);
                }
                if(dataType==1){
                    DatumPoint obj = new DatumPoint();
                    for (int j = 0; j < 6; j++) {
                        String value = (String) ExcelUtil.getValue(row.getCell(j));
                        if (StringUtil.isEmpty(value)) {
                            value = "";
                        }
                        String msg="";
                        //判断测站点名称是否为空
                        String name=(String)ExcelUtil.getValue(row.getCell(0));
                        if(StringUtil.isEmpty(name)){
                            msg="第"+i+"行，测站点名称为空，请输入！";
                            return  R.fail(msg);
                        }
                        //判断，同一合同段下，测站点名称是否重复
                        if(this.count(Wrappers.<DatumPoint>lambdaQuery().eq(DatumPoint::getName,name).eq(DatumPoint::getContractId,contractId).eq(DatumPoint::getType,dataType))>0){
                            msg="第"+i+"行，测站点:"+name+"已存在，请修改";
                            return  R.fail(msg);
                        }
                        switch (j) {
                            case 0:
                                obj.setName(value);
                                break;
                            case 1:
                                obj.setX(Double.parseDouble(value));
                                break;
                            case 2:
                                obj.setY(Double.parseDouble(value));
                                break;
                            case 3:
                                obj.setH(Double.parseDouble(value));
                                break;
                            case 4:
                                //判断等级是否为：一级、二级、三级、四级
                                if(StringUtil.isNotBlank((String) ExcelUtil.getValue(row.getCell(j)))) {
                                    if(!level.contains(value)){
                                        msg="第"+i+"行，等级应该为：一级、二级、三级 或 四级，请修改！";
                                        return  R.fail(msg);
                                    }
                                    obj.setLevel(value);
                                }
                                break;
                            case 5:
                                obj.setRemark(value);
                                break;
                            default:
                                break;
                        }

                    }
                    obj.setContractId(contractId);
                    obj.setProjectId(projectId);
                    obj.setCreateTime(new Date());
                    obj.setType(dataType);
                    importList.add(obj);
                }
            }
            //批量保存
            this.saveBatch(importList);
            return   R.success("导入成功");
        } catch (Exception e){
            e.printStackTrace();
        }
        return  R.fail("执行异常");
    }

    //导出数据
    public List<DatumPoint>  exportExcel( String contractId , Integer type, String search){
        if(StringUtil.isBlank(search)){
            search="";
        }
        String finalSearch = search;
        return   this.list(Wrappers.<DatumPoint>lambdaQuery().eq(DatumPoint::getType,type).eq(DatumPoint::getContractId,contractId).and(e->e.like(DatumPoint::getName, finalSearch).or().like(DatumPoint::getRemark, finalSearch)));
    }

}
