package com.starcharge.component.datastore;

import com.ihidea.core.base.CoreService;
import com.ihidea.core.support.cache.CacheSupport;
import com.ihidea.core.support.exception.ServiceException;
import com.ihidea.core.support.orm.mybatis3.util.IbatisServiceUtils;
import com.ihidea.core.util.FileUtilsEx;
import com.starcharge.base.redis.RedisClient;
import com.starcharge.component.datastore.dao.CptDataStoreMapper;
import com.starcharge.component.datastore.dao.model.CptDataStore;
import com.starcharge.component.datastore.dao.model.CptDataStoreCriteria;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service("fileStoreService")
public class DataStoreService extends CoreService {

	@Autowired
	private CptDataStoreMapper dao;

	@Autowired
	private JdbcTemplate jdbcTemplate;

	private static Map<String, CptDataStore> dataStoreMap = new HashMap<>();

	/**
	 * 添加
	 * @param record
	 * @return
	 */
	public int insertDataStore(CptDataStore record) {

		if ("2".equals(record.getType())) {
			if (!isExists(record.getPath())) {
				throw new ServiceException("文件路径不存在");
			}

			record.setPath(FileUtilsEx.filterPath(record.getPath()));

			// 备份
			if (!isExists(record.getBakPath())) {
				throw new ServiceException("备份文件路径不存在");
			}

			record.setBakPath(FileUtilsEx.filterPath(record.getBakPath()));
		}

		return dao.insert(record);
	}

	/**
	 * 文件路径是否存在
	 * @param path
	 * @return
	 */
	private boolean isExists(String path) {
		File file = new File(path);
		return file.exists();
	}

	/**
	 * 删除
	 * @param id
	 * @return
	 */
	public int deleteDataStore(String id) {

		// TODO
		// 删除前判断是否还有文件,如果还有,则无法删除

		return dao.deleteByPrimaryKey(id);
	}

	/**
	 * 更新
	 * @param record
	 * @return
	 */
	public int updateDataStore(CptDataStore record) {

		if ("2".equals(record.getType())) {
			record.setPath(FileUtilsEx.filterPath(record.getPath()));
			record.setBakPath(FileUtilsEx.filterPath(record.getBakPath()));
		}

		return dao.updateByPrimaryKey(record);
	}

	/**
	 * 查询
	 * @param record
	 * @return
	 * @throws Exception
	 */
	public List<CptDataStore> selectDataStores(CptDataStore record) throws Exception {
		CptDataStoreCriteria example = new CptDataStoreCriteria();

		CptDataStoreCriteria.Criteria criteria = example.createCriteria();

		IbatisServiceUtils.createCriteriaByEntity(criteria, record);

		example.setOrderByClause("id");

		return dao.selectByExample(example);
	}

	/**
	 * 查询
	 * @param id
	 * @return
	 */
	public CptDataStore selectDataStore(String id) {
		return dao.selectByPrimaryKey(id);
	}

	/**
	 * 通过存储名称得到存储信息
	 * @param name
	 * @return
	 */
	public CptDataStore getInfoByName(String name) {

		CptDataStore result = dataStoreMap.get("DataStoreService.getInfoByName:"+name);

		if (result == null) {
			result = jdbcTemplate.queryForObject("select id, name, type, path, type, bak_path from cpt_datastore where name = ?",
					new Object[] { name }, new BeanPropertyRowMapper<CptDataStore>(CptDataStore.class));
			dataStoreMap.put("DataStoreService.getInfoByName:"+name, result);
		}

		return result;
	}
}