package com.mortals.xhx.module.bussinesscard.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.mortals.framework.model.PageInfo;
import com.mortals.framework.util.DataUtil;
import com.mortals.framework.util.StringUtils;
import com.mortals.xhx.base.system.user.model.UserEntity;
import com.mortals.xhx.base.system.user.service.UserService;
import com.mortals.xhx.module.company.model.CompanyEntity;
import com.mortals.xhx.module.company.service.CompanyService;
import com.mortals.xhx.module.favorites.model.FavoritesBusinesscardEntity;
import com.mortals.xhx.module.favorites.model.FavoritesBusinesscardQuery;
import com.mortals.xhx.module.favorites.service.FavoritesBusinesscardService;
import com.mortals.xhx.module.position.model.PositionEntity;
import com.mortals.xhx.module.position.service.PositionService;
import com.mortals.xhx.module.staff.model.StaffEntity;
import com.mortals.xhx.module.staff.service.StaffService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.mortals.framework.service.impl.AbstractCRUDServiceImpl;
import com.mortals.framework.exception.AppException;
import com.mortals.framework.model.Context;
import com.mortals.xhx.module.bussinesscard.dao.BussinesscardDao;
import com.mortals.xhx.module.bussinesscard.model.BussinesscardEntity;
import com.mortals.xhx.module.bussinesscard.service.BussinesscardService;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* BussinesscardService
* 名片基本信息 service实现
*
* @author zxfei
* @date 2023-10-10
*/
@Service("bussinesscardService")
@Slf4j
public class BussinesscardServiceImpl extends AbstractCRUDServiceImpl<BussinesscardDao, BussinesscardEntity, Long> implements BussinesscardService {

    @Autowired
    private CompanyService companyService;
    @Autowired
    private PositionService positionService;
    @Autowired
    private FavoritesBusinesscardService favoritesBusinesscardService;
    @Autowired
    private StaffService staffService;
    @Autowired
    private UserService userService;

    @Override
    protected void saveBefore(BussinesscardEntity entity, Context context) throws AppException {
        super.saveBefore(entity, context);
        checkBussinesscard(entity, context);
    }

    @Override
    protected void updateBefore(BussinesscardEntity entity, Context context) throws AppException {
        super.saveBefore(entity, context);
        checkBussinesscard(entity, context);
    }

    private void checkBussinesscard(BussinesscardEntity entity, Context context)throws AppException {
        if(entity.getCompanyId()!=null){
            CompanyEntity companyEntity = companyService.get(entity.getCompanyId());
            if(companyEntity!=null){
                entity.setCompanyAdress(companyEntity.getBusinessAdress());
                entity.setCompanyName(companyEntity.getCompanyName());
            }
        }
        checkSetting(entity);
        if(entity.getPositionId()!=null){
            PositionEntity positionEntity = positionService.get(entity.getPositionId());
            if(positionEntity!=null){
                entity.setPositionName(positionEntity.getPositionName());
            }
        }
        StaffEntity staffEntity = staffService.getCache(String.valueOf(entity.getStaffId()));
        if(staffEntity!=null){
            entity.setStaffName(staffEntity.getName());
            entity.setStaffStatus(staffEntity.getStaffStatus());
        }
    }

    private void checkSetting(BussinesscardEntity entity){
        if(StringUtils.isEmpty(entity.getSetting())){
            JSONObject setting = new JSONObject();
            setting.put("photoPath",true);
            setting.put("companyName",true);
            setting.put("positionName",true);
            setting.put("phoneNumber",true);
            setting.put("email",true);
            setting.put("companyAdress",true);
            setting.put("companyIntro",true);
            setting.put("companyProduct",true);
            setting.put("txtColor","#FFFFFF");
            setting.put("companyNews",true);
            entity.setSetting(setting.toJSONString());
        }else {
            JSONObject setting = JSONObject.parseObject(entity.getSetting());
            if(!setting.containsKey("photoPath")){
                setting.put("photoPath",true);
            }
            if(!setting.containsKey("companyName")){
                setting.put("companyName",true);
            }
            if(!setting.containsKey("positionName")){
                setting.put("positionName",true);
            }
            if(!setting.containsKey("phoneNumber")){
                setting.put("phoneNumber",true);
            }
            if(!setting.containsKey("email")){
                setting.put("email",true);
            }
            if(!setting.containsKey("companyAdress")){
                setting.put("companyAdress",true);
            }
            if(!setting.containsKey("companyIntro")){
                setting.put("companyIntro",true);
            }
            if(!setting.containsKey("companyProduct")){
                setting.put("companyProduct",true);
            }
            if(!setting.containsKey("txtColor")){
                setting.put("txtColor","#FFFFFF");
            }
            if(!setting.containsKey("companyNews")){
                setting.put("companyNews",true);
            }
            entity.setSetting(setting.toJSONString());
        }
    }

    @Override
    public BussinesscardEntity get(Long key, Context context) throws AppException {
        BussinesscardEntity entity = this.dao.get(key);

        if(entity!=null){
            StaffEntity staffEntity = staffService.getCache(String.valueOf(entity.getStaffId()));
            if(staffEntity!=null){
                entity.setStaffName(staffEntity.getName());
                entity.setStaffStatus(staffEntity.getStaffStatus());
            }
            if(context!=null && context.getUser()!=null) {
                FavoritesBusinesscardEntity favoritesBusinesscardEntity = favoritesBusinesscardService.selectOne(new FavoritesBusinesscardQuery().bussinesscardId(entity.getId()).userId(context.getUser().getId()));
                if(favoritesBusinesscardEntity!=null){
                    entity.setFavoriteStatus(1);
                }else {
                    entity.setFavoriteStatus(0);
                }
            }else {
                entity.setFavoriteStatus(0);
            }
            checkSetting(entity);
        }
        return entity;
    }

    @Override
    public void sendBusinessCard(Long id,Context context) {
        BussinesscardEntity entity = this.get(id);
        if(entity!=null) {
            Map condition = new HashMap();
            condition.put("id", id);
            Map data = new HashMap();
            data.put("sendBusinessCardTimesIncrement", 1);
            data.put("updateTime", new Date());
            this.dao.update(data,condition);
        }
        if(context!=null && context.getUser()!=null){
            UserEntity userEntity = userService.get(context.getUser().getId());
            if(userEntity!=null&&userEntity.getStaffId()!=null){
                StaffEntity staffEntity = staffService.get(userEntity.getStaffId());
                if(staffEntity!=null){
                    Map condition = new HashMap();
                    condition.put("id", staffEntity.getId());
                    Map data = new HashMap();
                    data.put("sendBusinessCardTimesIncrement", 1);
                    data.put("updateTime", new Date());
                    staffService.getDao().update(data,condition);
                }
            }
        }
    }

    @Override
    protected void findAfter(BussinesscardEntity params, PageInfo pageInfo, Context context, List<BussinesscardEntity> list) throws AppException {
        super.findAfter(params, pageInfo, context, list);
        if(CollectionUtils.isNotEmpty(list)){
            for (BussinesscardEntity item:list){
                checkSetting(item);
            }
        }
    }
}