package com.jsowell.pile.service.impl;

import com.google.common.collect.Lists;
import com.jsowell.common.constant.Constants;
import com.jsowell.common.core.domain.entity.SysDept;
import com.jsowell.common.core.domain.vo.AuthorizedDeptVO;
import com.jsowell.common.util.DateUtils;
import com.jsowell.common.util.DictUtils;
import com.jsowell.common.util.SecurityUtils;
import com.jsowell.common.util.StringUtils;
import com.jsowell.pile.domain.PileMerchantInfo;
import com.jsowell.pile.mapper.PileMerchantInfoMapper;
import com.jsowell.pile.service.IPileMerchantInfoService;
import com.jsowell.pile.vo.base.MerchantInfoVO;
import com.jsowell.system.service.SysDeptService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Objects;

/**
 * 充电桩运营商信息Service业务层处理
 *
 * @author jsowell
 * @date 2022-08-27
 */
@Slf4j
@Service
public class PileMerchantInfoServiceImpl implements IPileMerchantInfoService {
	@Autowired
	private PileMerchantInfoMapper pileMerchantInfoMapper;

	@Autowired
	private SysDeptService sysDeptService;

	@Value("${weixin.login.appid}")
	private String appid;

	/**
	 * 查询充电桩运营商信息
	 *
	 * @param id 充电桩运营商信息主键
	 * @return 充电桩运营商信息
	 */
	@Override
	public PileMerchantInfo selectPileMerchantInfoById(Long id) {
		return pileMerchantInfoMapper.selectPileMerchantInfoById(id);
	}

	/**
	 * 查询充电桩运营商信息列表
	 *
	 * @param pileMerchantInfo 充电桩运营商信息
	 * @return 充电桩运营商信息
	 */
	@Override
	// @DataScope(deptAlias = "t")
	public List<PileMerchantInfo> selectPileMerchantInfoList(PileMerchantInfo pileMerchantInfo) {
		AuthorizedDeptVO authorizedMap = SecurityUtils.getAuthorizedMap();
		if (authorizedMap == null) {
			// 为空表示没有权限，返回空数组
			return Lists.newArrayList();
		}
		pileMerchantInfo.setStationDeptIds(authorizedMap.getStationDeptIds());
		pileMerchantInfo.setMerchantDeptIds(authorizedMap.getMerchantDeptIds());

		List<PileMerchantInfo> list = pileMerchantInfoMapper.selectPileMerchantInfoList(pileMerchantInfo);
		if (Objects.nonNull(list)) {
			for (PileMerchantInfo p:list) {
				String status = p.getStatus();
				String merchant_status = DictUtils.getDictLabel("merchant_status", status);
				p.setStatus(merchant_status);
			}
		}
		return list;
	}

	/**
	 * 新增充电桩运营商信息
	 *
	 * @param pileMerchantInfo 充电桩运营商信息
	 * @return 结果
	 */
	@Override
	@Transactional
	public int insertPileMerchantInfo(PileMerchantInfo pileMerchantInfo) {
		// 1. 新增sys_dept
		SysDept dept = new SysDept();
		dept.setParentId(100L);
		dept.setOrderNum(0);
		dept.setDeptName(pileMerchantInfo.getMerchantName());
		dept.setLeader(pileMerchantInfo.getManagerName());
		dept.setPhone(pileMerchantInfo.getManagerPhone());
		dept.setStatus("0");
		sysDeptService.insertDept(dept);

		// 2. 新增pile_merchant_info
		Long deptId = dept.getDeptId();
		// pileMerchantInfo.setId(deptId);
		pileMerchantInfo.setDeptId(String.valueOf(deptId));
		pileMerchantInfo.setStatus(Constants.ONE);
		String appId = StringUtils.isBlank(pileMerchantInfo.getAppId())
				? appid
				: pileMerchantInfo.getAppId();
		pileMerchantInfo.setAppId(appId);
		return pileMerchantInfoMapper.insertPileMerchantInfo(pileMerchantInfo);
	}

	/**
	 * 修改充电桩运营商信息
	 *
	 * @param pileMerchantInfo 充电桩运营商信息
	 * @return 结果
	 */
	@Override
	public int updatePileMerchantInfo(PileMerchantInfo pileMerchantInfo) {
		pileMerchantInfo.setUpdateTime(DateUtils.getNowDate());
		return pileMerchantInfoMapper.updatePileMerchantInfo(pileMerchantInfo);
	}

	/**
	 * 批量删除充电桩运营商信息
	 *
	 * @param ids 需要删除的充电桩运营商信息主键
	 * @return 结果
	 */
	@Override
	public int deletePileMerchantInfoByIds(Long[] ids) {
		return pileMerchantInfoMapper.deletePileMerchantInfoByIds(ids);
	}

	/**
	 * 删除充电桩运营商信息信息
	 *
	 * @param id 充电桩运营商信息主键
	 * @return 结果
	 */
	@Override
	public int deletePileMerchantInfoById(Long id) {
		return pileMerchantInfoMapper.deletePileMerchantInfoById(id);
	}

	@Override
	public String getMerchantIdByAppId(String appId) {
		if (StringUtils.isBlank(appId)) {
			return null;
		}
		try {
			PileMerchantInfo pileMerchantInfo = pileMerchantInfoMapper.selectPileMerchantInfoByAppId(appId);
			if (pileMerchantInfo != null) {
				return pileMerchantInfo.getId().toString();
			}
		} catch (Exception e) {
			log.error("通过appid获取运营商id error", e);
		}
		return null;
	}

	@Override
	public MerchantInfoVO getMerchantInfo(String merchantId) {
		PileMerchantInfo pileMerchantInfo = selectPileMerchantInfoById(Long.parseLong(merchantId));
		if (pileMerchantInfo == null) {
			return null;
		}
		MerchantInfoVO vo = MerchantInfoVO.builder()
				.merchantId(merchantId)
				.merchantName(pileMerchantInfo.getMerchantName())
				.merchantTel(pileMerchantInfo.getServicePhone())
				.organizationCode(pileMerchantInfo.getOrganizationCode())
				.deptId(pileMerchantInfo.getDeptId())
				.build();
		return vo;
	}

	@Override
	public List<String> queryByMerchantDeptIds(List<String> merchantDeptIds) {
		return pileMerchantInfoMapper.queryByMerchantDeptIds(merchantDeptIds);
	}
}
