package com.bootdo.data.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.bootdo.data.dao.DataApplyDao;
import com.bootdo.data.dao.DataRelationDao;
import com.bootdo.data.domain.DataApplyDO;
import com.bootdo.data.domain.DataInfoDO;
import com.bootdo.data.domain.DataRelationDO;
import com.bootdo.data.service.DataApplyService;
import com.bootdo.data.service.DataInfoService;

@Service
public class DataApplyServiceImpl implements DataApplyService {

    private static Logger log = LoggerFactory.getLogger(DataApplyServiceImpl.class);

    @Autowired
    private DataApplyDao dataApplyDao;

    @Autowired
    private DataRelationDao dataRelationDao;

    @Autowired
    private DataInfoService dataInfoService;

    @Override
    public DataApplyDO get(Long id) {
        return dataApplyDao.get(id);
    }

    @Override
    public List<DataApplyDO> list(Map<String, Object> map) {
        return dataApplyDao.list(map);
    }

    @Override
    public int count(Map<String, Object> map) {
        return dataApplyDao.count(map);
    }

    @Override
    public int save(DataApplyDO dataApply) {
        // 存储备案表
        int count = dataApplyDao.save(dataApply);
        // 选择的数据ID 数组
        List<Long> dataIds = dataApply.getDataIds();
        // 备案ID
        Long applyId = dataApply.getId();
        // 存储备案数据关系表 list
        List<DataRelationDO> drLsit = new ArrayList<>();
        // 数据表 list
        List<DataInfoDO> diLsit = new ArrayList<>();
        // 遍历
        for (Long dataId : dataIds) {
            // 存储备案 数据关系表
            DataRelationDO dataRelationDO = new DataRelationDO();
            dataRelationDO.setDataId(dataId);
            dataRelationDO.setApplyId(applyId);
            drLsit.add(dataRelationDO);
            // 数据表
            DataInfoDO dataInfoDO = new DataInfoDO();
            dataInfoDO.setId(dataId);
            dataInfoDO.setDataStatus("2");// 审核中
            diLsit.add(dataInfoDO);
        }
        // 存储备案 数据关系表 处理
        dataRelationDao.removeByApplyId(applyId);
        if (drLsit.size() > 0) {
            dataRelationDao.batchSave(drLsit);
        }
        // 数据表状态变更 审核中 处理
        if (diLsit.size() > 0) {
            for (DataInfoDO dataInfoDO : diLsit) {
                dataInfoService.update(dataInfoDO);
            }
        }
        return count;
    }

    @Override
    public int update(DataApplyDO dataApply) {
        int count = dataApplyDao.update(dataApply);
        // 最新选择的数据ID 数组
        List<Long> dataIds = dataApply.getDataIds();
        // 变更前的数据ID 数组 变更前
        List<Long> dataIdInfos = dataApply.getDataIdInfos();
        // 备案ID 唯一
        Long applyId = dataApply.getId();
        log.info("applyId:" + applyId);

        // 存储备案数据关系表 list
        List<DataRelationDO> drLsit = new ArrayList<>();
        // 变更前的数据ID list
        List<DataInfoDO> oldDiLsit = new ArrayList<>();

        // 新选择的数据ID list
        List<DataInfoDO> newDiLsit = new ArrayList<>();

        // 变更前的数据ID遍历
        for (Long dataId : dataIdInfos) {
            // 数据表
            DataInfoDO dataInfoDO = new DataInfoDO();
            dataInfoDO.setId(dataId);
            dataInfoDO.setDataStatus("0");// 正常数据
            oldDiLsit.add(dataInfoDO);
        }

        // 最新数据 遍历
        for (Long dataId : dataIds) {
            // 存储备案 数据关系表
            DataRelationDO dataRelationDO = new DataRelationDO();
            dataRelationDO.setDataId(dataId);
            dataRelationDO.setApplyId(applyId);
            drLsit.add(dataRelationDO);
            // 数据表
            DataInfoDO dataInfoDO = new DataInfoDO();
            dataInfoDO.setId(dataId);
            dataInfoDO.setDataStatus("2");// 审核中数据
            newDiLsit.add(dataInfoDO);
        }
        // 存储备案 数据关系表 处理
        dataRelationDao.removeByApplyId(applyId);
        if (drLsit.size() > 0) {
            dataRelationDao.batchSave(drLsit);
        }
        // 变更前的数据ID遍历 恢复正常状态 处理
        if (oldDiLsit.size() > 0) {
            log.info("变更前的数据ID个数:" + oldDiLsit.size());
            for (DataInfoDO dataInfoDO : oldDiLsit) {
                dataInfoService.update(dataInfoDO);
            }
        }

        // 新选择的数据ID 审核中状态 处理
        if (newDiLsit.size() > 0) {
            log.info("新选择的数据ID个数:" + newDiLsit.size());
            for (DataInfoDO dataInfoDO : newDiLsit) {
                dataInfoService.update(dataInfoDO);
            }
        }
        return count;
    }

    @Override
    public int remove(Long id) {
        return dataApplyDao.remove(id);
    }

    @Override
    public int batchRemove(Long[] ids) {
        return dataApplyDao.batchRemove(ids);
    }

}
