package com.neu.his.cloud.service.dms.service.impl;


import com.neu.his.cloud.service.dms.dto.dms.DmsNonDrugModelParam;
import com.neu.his.cloud.service.dms.dto.dms.DmsNonDrugModelResult;
import com.neu.his.cloud.service.dms.mapper.DmsNonDrugModelMapper;
import com.neu.his.cloud.service.dms.model.DmsNonDrugModel;
import com.neu.his.cloud.service.dms.model.DmsNonDrugModelExample;
import com.neu.his.cloud.service.dms.service.DmsNonDrugModelService;
import com.neu.his.cloud.service.dms.util.DateUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;

/**
 * @author Zain
 * @ClassName: NonDrugModelServiceImpl
 * @description: TODO
 * @date 2019/6/9 9:40
 */

@Service
public class DmsNonDrugModelServiceImpl implements DmsNonDrugModelService {


    @Autowired
    DmsNonDrugModelMapper dmsNonDrugModelMapper;



    /**
     * 描述:创建模版
     * <p>author:赵煜
     * <p>author:赵煜  code可以重名
     */
    @Override
    public int createModel(DmsNonDrugModelParam dmsNonDrugModelParam) {
        System.err.println("createModel");

        //给模版实体赋值
        DmsNonDrugModel dmsNonDrugModel = new DmsNonDrugModel();
        BeanUtils.copyProperties(dmsNonDrugModelParam, dmsNonDrugModel);
        dmsNonDrugModel.setCreateTime(new Date());
        dmsNonDrugModel.setStatus(1);
        dmsNonDrugModel.setCode(codeGenerator(new Date()));

        //设置模版项串
        if (null != dmsNonDrugModelParam.getNonDrugIdList() && dmsNonDrugModelParam.getNonDrugIdList().size() > 0) {
            dmsNonDrugModel.setNonDrugIdList(toItemIdListStr(dmsNonDrugModelParam.getNonDrugIdList()));
        }

        dmsNonDrugModelMapper.insertSelective(dmsNonDrugModel);
        return 1;
    }

    @Override
    public int deleteModel(List<Long> ids) {
        int count = ids == null ? 0 : ids.size(); //得到要删除的数量
        if (!CollectionUtils.isEmpty(ids)) {
            for (Long id : ids) {
                //直接删除
                dmsNonDrugModelMapper.deleteByPrimaryKey(id);
            }
        }
        return count;
    }

    @Override
    public int deleteModelItem(Long modelId, List<Long> itemIds) {
        int count = itemIds == null ? 0 : itemIds.size(); //得到要删除的数量
        //取出nonDrugIdList 解析并删除所需
        DmsNonDrugModel dmsNonDrugModel = dmsNonDrugModelMapper.selectByPrimaryKey(modelId);
        HashSet<Long> itemIdSet=toItemIdSet(dmsNonDrugModel.getNonDrugIdList());
        if (null != dmsNonDrugModel && !CollectionUtils.isEmpty(itemIdSet) && !CollectionUtils.isEmpty(itemIds)) {
            for (Long id : itemIds) {
                if( itemIdSet.contains(id)) {
                    itemIdSet.remove(id);
                }
                }
        }
        dmsNonDrugModel=new DmsNonDrugModel();
        dmsNonDrugModel.setId(modelId);
        dmsNonDrugModel.setNonDrugIdList(toItemIdListStr(new ArrayList<Long>(itemIdSet)));

        dmsNonDrugModelMapper.updateByPrimaryKeySelective(dmsNonDrugModel);
        return count;
    }


    /**
     * 描述:根据modelId更新model信息
     *       删了重新创建
     * <p>author:赵煜
     * <p>author:赵煜  修改不能更新的bug  直接更新,不考虑code重复
     */
    @Override
    public int updateModel(Long modelId, DmsNonDrugModelParam dmsNonDrugModelParam) {
        //先找出原model信息
        DmsNonDrugModel oldDmsNonDrugModel=dmsNonDrugModelMapper.selectByPrimaryKey(modelId);

        //给实体赋值
        DmsNonDrugModel newDmsNonDrugModel = new DmsNonDrugModel();
        newDmsNonDrugModel.setId(modelId);
        //实际能更新的属性
        newDmsNonDrugModel.setNonDrugIdList(toItemIdListStr(dmsNonDrugModelParam.getNonDrugIdList()));;
        newDmsNonDrugModel.setCode(dmsNonDrugModelParam.getCode());//code可以重复
        newDmsNonDrugModel.setAim(dmsNonDrugModelParam.getAim());
        newDmsNonDrugModel.setName(dmsNonDrugModelParam.getName());//name可以重复

        //封装不更新的几个属性
        newDmsNonDrugModel.setId(oldDmsNonDrugModel.getId());
        newDmsNonDrugModel.setOwnId(oldDmsNonDrugModel.getOwnId());
        newDmsNonDrugModel.setScope(oldDmsNonDrugModel.getScope());
        newDmsNonDrugModel.setStatus(oldDmsNonDrugModel.getStatus());
        newDmsNonDrugModel.setCreateTime(oldDmsNonDrugModel.getCreateTime());
        newDmsNonDrugModel.setType(oldDmsNonDrugModel.getType());

        dmsNonDrugModelMapper.updateByPrimaryKey(newDmsNonDrugModel);
        return 1;
    }



    @Override
    public List<DmsNonDrugModelResult> selectModel(Integer isAdmin, DmsNonDrugModelParam queryParam, Integer pageSize, Integer pageNum) {

        DmsNonDrugModelExample example = null;
        List<DmsNonDrugModel> dmsNonDrugModelList = null;

        if(isAdmin == 0){  //非管理员   前台 查询个人、科室、全院
            example=  new DmsNonDrugModelExample();
            DmsNonDrugModelExample.Criteria criteria = example.createCriteria();
            criteria.andStatusNotEqualTo(0);
            criteria.andScopeEqualTo(queryParam.getScope()); //必须mvc保证不为空
            criteria.andOwnIdEqualTo(queryParam.getOwnId()); //必须宝成OwnId不为空
            if(!StringUtils.isEmpty(queryParam.getName())){
                criteria.andNameLike("%" + queryParam.getName() + "%");
            }
            if(null!=queryParam.getType()){
                criteria.andTypeEqualTo(queryParam.getType());
            }
            dmsNonDrugModelList=dmsNonDrugModelMapper.selectByExample(example);
        }else{//后台 查询所有--后端模糊查询
            //如果没有指明status,返回不为0的
            example=  new DmsNonDrugModelExample();
            DmsNonDrugModelExample.Criteria criteria = example.createCriteria();
            if(null!=queryParam.getType()){
                criteria.andTypeEqualTo(queryParam.getType());
            }
            if(queryParam.getStatus() == null){
                criteria.andStatusNotEqualTo(0);
            }
            if(!StringUtils.isEmpty(queryParam.getCode())){
                criteria.andCodeLike("%" + queryParam.getCode() + "%");
            }
            if(!StringUtils.isEmpty(queryParam.getName())){
                criteria.andNameLike("%" + queryParam.getName() + "%");
            }
            dmsNonDrugModelList=dmsNonDrugModelMapper.selectByExample(example);
        }


        //返回数据包装成Result
        //List<DmsNonDrugModel> dmsNonDrugModelList = dmsNonDrugModelMapper.selectByExample(example);
        List<DmsNonDrugModelResult> dmsNonDrugModelResultList = new ArrayList<>();

        for (DmsNonDrugModel dmsNonDrugModel : dmsNonDrugModelList) {
            DmsNonDrugModelResult dmsNonDrugModelResult = new DmsNonDrugModelResult();
            BeanUtils.copyProperties(dmsNonDrugModel, dmsNonDrugModelResult,"nonDrugIdList");
            if(!StringUtils.isEmpty(dmsNonDrugModel.getNonDrugIdList())) {//若model中list不为空串则取出封装
                dmsNonDrugModelResult.setNonDrugIdList(new ArrayList<Long>(toItemIdSet(dmsNonDrugModel.getNonDrugIdList())));
            }
            dmsNonDrugModelResultList.add(dmsNonDrugModelResult);
        }
        return dmsNonDrugModelResultList;
    }



    private String toItemIdListStr(List<Long> nonDrugIdList) {
        String nonDrugIdListStr = "";
        for (Long itemId : nonDrugIdList) {
            nonDrugIdListStr += (itemId+"");
            nonDrugIdListStr += ",";
        }
        return nonDrugIdListStr.substring(0, nonDrugIdListStr.length() - 1);
    }


    private HashSet<Long>  toItemIdSet(String  nonDrugIdListStr) {
        String[] idArray=nonDrugIdListStr.split(",");
        HashSet<Long> idSet=new HashSet<Long>();

        for(int i =0 ;i<idArray.length;i++){
            idSet.add(new Long(idArray[i]));
        }
        return idSet;

    }

    private String codeGenerator(Date date) {
        return DateUtil.getDateStr(date) + DateUtil.getTimeStr(date, 6);
    }

}