package com.bcxin.risk.communicate;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.text.StrSpliter;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.bcxin.risk.activity.*;
import com.bcxin.risk.base.domain.util.StringUtil;
import com.bcxin.risk.common.util.InstanceUtil;
import com.bcxin.risk.constant.Const;
import com.bcxin.risk.constant.DictConst;
import com.bcxin.risk.constant.GlobalConst;
import com.bcxin.risk.report.domain.Report;
import com.bcxin.risk.report.material.dao.*;
import com.bcxin.risk.report.material.domain.*;
import com.bcxin.risk.sys.SysRegionUtil;
import com.bcxin.risk.user.dao.UserDao;
import com.bcxin.risk.user.domain.User;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;

@Service
@Transactional
public class ActivityReceiveService {

    @Autowired
    private UserDao userDao;
    @Autowired
    private ActivityDao activityDao;
    @Autowired
    private ReportDao reportDao;
    @Autowired
    private SysRegionUtil sysRegionUtil;
    @Autowired
    private VenueDao venueDao;
    @Autowired
    private ActivityVenueDao activityVenueDao;
    @Autowired
    private MaterialFormMenuDao materialFormMenuDao;
    @Autowired
    private MaterialFormAttrDao materialFormAttrDao;
    @Autowired
    private MaterialFormValueDao materialFormValueDao;
    @Autowired
    private MaterialFormMenuTemplateDao materialFormMenuTemplateDao;
    @Autowired
    private MaterialFormAttrTemplateDao materialFormAttrTemplateDao;
    @Autowired
    private MaterialFormModuleDao materialFormModuleDao;


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

    /**
     *
     * @return
     */
    public Activity saveActivity(User user,Map<String,String> actParams,Map<String,String> repParams,Map<String,String> maParams,Map<String,String> modulerParams){
        // 1. 保存活动
        Activity activity=saveActivity(user,actParams,repParams);

        // 2.保存材料
        saveMaterialInfo(activity,maParams,modulerParams);
//        // 3.生成报批、报备材料
//        /* 提交初审 */
//        materialService.submitPrimary(activity,user,false);
        return activity;
    }

    /**
     * 保存活动
     * @param user
     * @param actParams
     * @param repParams
     */
    public Activity saveActivity(User user,Map<String,String> actParams,Map<String,String> repParams){
        String activityNo = actParams.get("activityNo");
        Activity activity=activityDao.findActivityByActivityNo(activityNo);
        Report report = new Report();

        if(activity==null){
            activity=new Activity();
        } else{
            report = reportDao.findReportByActivity(activity);
            if(report==null){
                report=new Report();
            }
        }

        // 1.保存活动基本信息
        activity = copyActProperties(user,activity,actParams);
        activityDao.saveOrUpdate(activity);

        // 2.保存Report
        report=copyReportProperties(report,activity,repParams);
        reportDao.saveOrUpdate(report);

        // 3.保存场馆
        List<ActivityVenue> activityVenueList=getActivityVenue(activity);
        //用于用户更新信息时更新地址先删除地址在添加新地址
        activityVenueDao.deleteActivityVenue(activity);
        //插入关联表
        activityVenueDao.insertBatch(activityVenueList,10);

        return activity;
    }

    /**
     * 复制活动信息属性
     * @param user
     * @param activity
     * @param actParams
     * @return
     */
    public Activity copyActProperties(User user,Activity activity,Map<String,String> actParams){
        activity.setCreateOn(DateUtil.parse(actParams.get("createOn")));
        activity.setActivityDate(DateUtil.parse(actParams.get("activityDate")));
        activity.setName(actParams.get("name"));
        activity.setActivityNo(actParams.get("activityNo"));
        activity.setActivityStatus(actParams.get("activityStatus"));
        activity.setPrimaryStatus(actParams.get("primaryStatus"));
        activity.setUser(user);
        activity.setOrg(user.getOrg());
        activity.setApprovalStatus(actParams.get("approvalStatus"));
        activity.setApprovalContent(actParams.get("approvalContent"));
        activity.setNumber(actParams.get("number"));
        activity.setDays(actParams.get("days"));
        //活动类型
        activity.setActivityType(actParams.get("activityType"));
        //活动地点（室内和室外） 字典
        activity.setAddressType(actParams.get("addressType"));
        activity.setOutDoorType(actParams.get("outDoorType"));
        activity.setExhibitionType(actParams.get("exhibitionType"));
        activity.setPeakNum(actParams.get("peakNum"));
        activity.setProfitableShow(actParams.get("profitableShow"));
        activity.setSponsor(actParams.get("sponsor"));
        activity.setProvince(sysRegionUtil.getRegionById(actParams.get("province_id")));
        activity.setCity(sysRegionUtil.getRegionById(actParams.get("city_id")));
        activity.setArea(sysRegionUtil.getRegionById(actParams.get("area_id")));
        activity.setUnit(sysRegionUtil.getRegionById(actParams.get("unit_id")));
        activity.setAddress(actParams.get("address"));
        activity.setStartDate(actParams.get("startDate"));
        activity.setEndDate(actParams.get("endDate"));
        activity.setPostMaterial(actParams.get("postMaterial"));
        activity.setGov(actParams.get("gov"));
        activity.setChooseAssess(actParams.get("chooseAssess"));
        activity.setNeedReport(actParams.get("needReport"));
        activity.setChannel(actParams.get("channel"));
        activity.setHistory(actParams.get("history"));
        activity.setActivitySource(actParams.get("activitySource"));
        activity.setIsBackUp(actParams.get("isBackUp"));

        // 特殊处理的
        if ( DictConst.ACTIVITYTYPE_ZLZXDHD.equals(actParams.get("activityType"))){
            activity.setExhibitionType(actParams.get("exhibitionType"));
        }else{
            activity.setExhibitionType(null);
        }
        // 室外类型
        if ( !Objects.equals(DictConst.ADDRESSTYPE_SN,actParams.get("addressType")) ) {
            activity.setOutDoorType(actParams.get("outDoorType"));
        }else{
            activity.setOutDoorType(null);
        }

        /* 盈利性演出设置，满足条件：陕西的活动，活动类型为文艺演出 **/
        if (DictConst.ACTIVITYTYPE_WYYCHD.equals(actParams.get("activityType"))
                && GlobalConst.PROVINCE_SN_CODE.equals(activity.getProvince().getOid()+"") ) {
            activity.setProfitableShow(actParams.get("profitableShow"));
        } else {
            activity.setProfitableShow(null);
        }

        return activity;
    }

    /**
     * 复制报告属性信息
     * @param report
     * @param activity
     * @param repParams
     * @return
     */
    public Report copyReportProperties(Report report,Activity activity,Map<String,String> repParams){
        report.setName(repParams.get("name"));
        report.setReportStatus(repParams.get("reportStatus"));
        report.setReportSubStatus(repParams.get("reportSubStatus"));
        report.setUser(userDao.findUserByOid(Long.parseLong(repParams.get("user_id"))));
        report.setActivity(activity);
        report.setReportUrgent(repParams.get("reportUrgent"));
        report.setExpressMode(repParams.get("expressMode"));
        report.setCancelReason(repParams.get("cancelReason"));
        report.setPostCompose(repParams.get("postCompose"));
        report.setAssignDate(DateUtil.parse(repParams.get("assignDate")));
        report.setApprovalFlag(repParams.get("approvalFlag"));
        report.setApprovalComment(repParams.get("approvalComment"));
        report.setComposeComplete(repParams.get("composeComplete"));
        report.setFullEdit(repParams.get("fullEdit"));
        report.setSignature(repParams.get("signature"));
        return report;
    }

    /**
     * 获取活动场馆信息
     * @param activity
     * @return
     */
    public List<ActivityVenue> getActivityVenue(Activity activity){
        // 设置场馆
        List<ActivityVenue> activityVenueList = Lists.newArrayList();
        List<Venue> venueList = Lists.newArrayList();
        if ( StringUtil.isNotEmpty(activity.getAddress()) ) {
            String[] addresss = StringUtils.split(activity.getAddress(),Const.COMMA);
            for (String address: addresss) {
                if (StringUtil.isNotEmpty(address)) {
                    Venue venue = venueDao.getVenueByName(address);
                    if (venue == null) {
                        venue = new Venue();
                        venue.setName(address);
                        venue.setProvince(activity.getProvince());
                        venue.setCity(activity.getCity());
                        venue.setArea(activity.getArea());
                        venue.setCreateOn(new Date());
                        venueDao.save(venue);
                    }
                    venueList.add(venue);
                    ActivityVenue activityVenue = new ActivityVenue();
                    activityVenue.setVenue(venue);
                    activityVenue.setActivity(activity);
                    activityVenueList.add(activityVenue);
                }
            }
        }
        return activityVenueList;
    }


    /**
     * 保存材料
     * @param activity
     * @param maParams
     */
    public void saveMaterialInfo(Activity activity,Map<String,String> maParams,Map<String,String> moduleParams){
        log.debug("【saveMaterialInfo()方法清除材料数据，时间={}】",new Date());
        /* 清除原来的数据 */
        materialFormModuleDao.deleteMaterialInfo(activity.getOid());

        // 保存主体信息
        List<MaterialFormModule> listModule=new ArrayList<>();
        for(String key : moduleParams.keySet()){
            MaterialFormModule module=new MaterialFormModule();
            module.setActivity(activity);
            module.setMaterialModule(key);
            module.setValue(moduleParams.get(key));
            module.setCreateOn(new Date());
            listModule.add(module);
        }
        if(listModule.size()>0){
            materialFormModuleDao.insertBatch(listModule,20);
        }
        

        // 保存材料信息
        String menuStr = maParams.get("menu");
        String attrStr = maParams.get("attr");
        String valueStr = maParams.get("value");
        log.debug("【menuStr={}】",menuStr);
        log.debug("【attrStr={}】",attrStr);
        log.debug("【valueStr={}】",valueStr);

        List<String> menuCodeList = StrSpliter.split(menuStr,Const.COMMA,true,true);
        List<String> attrCodeList = StrSpliter.split(attrStr,Const.COMMA,true,true);

        List<MaterialFormMenuTemplate> menuTemplateList = materialFormMenuTemplateDao.findByMenus(menuCodeList);
        List<MaterialFormAttrTemplate> attrTemplateList = materialFormAttrTemplateDao.findByAttrs(attrCodeList);

        // 获取菜单模板
        List<MaterialFormMenu> menuList = Lists.newArrayList();
        for( MaterialFormMenuTemplate temp : menuTemplateList){
            MaterialFormMenu menu = InstanceUtil.to(temp,MaterialFormMenu.class);
            menu.setActivity(activity);
            menu.setCreateOn(DateUtil.date());
            if(Objects.equals(temp.getRequired(),DictConst.Y)) {
                menu.setCompleted(DictConst.Y);
            }
            menuList.add(menu);
        }

        // 获取模板元素
        Map<String, MaterialFormAttr> attrMap = Maps.newHashMap();
        List<MaterialFormAttr> attrList = Lists.newArrayList();
        for( MaterialFormAttrTemplate temp : attrTemplateList){
            MaterialFormAttr attr = InstanceUtil.to(temp,MaterialFormAttr.class);
            attr.setActivity(activity);
            attr.setCreateOn(DateUtil.date());
            attrList.add(attr);
        }

        // 关联菜单
        Map<String, MaterialFormMenu> menuMap = Maps.newHashMap();
        Iterator<MaterialFormMenu> menuit = menuList.iterator();
        while (menuit.hasNext()) {
            MaterialFormMenu temp = menuit.next();
            menuMap.put(temp.getMenuCode(),temp);
        }

        Map<String, MaterialFormAttrTemplate> attrTemplateMap = Maps.newHashMap();
        Iterator<MaterialFormAttrTemplate> attrit = attrTemplateList.iterator();
        while (attrit.hasNext()) {
            MaterialFormAttrTemplate temp = attrit.next();
            attrTemplateMap.put(temp.getAttrCode(),temp);
        }
        for( MaterialFormAttr attr : attrList){
            String menuCode = attrTemplateMap.get(attr.getAttrCode()).getMaterialFormMenuTemplate().getMenuCode();
            MaterialFormMenu menu = menuMap.get(menuCode);
            attr.setMaterialFormMenu(menu);
            attrMap.put(attr.getAttrCode(),attr);
        }
        Console.log("得到的值是:{}",valueStr);
        List<Map<String,String>> valueParamMap = JSON.parseObject(valueStr,new TypeReference<List>(){});
        List<MaterialFormValue> valueList = Lists.newArrayList();
        for (Map<String,String> valueMap : valueParamMap) {
            MaterialFormValue valueObj = new MaterialFormValue();
            String attrCode = valueMap.get("attrCode");
            String value = valueMap.get("value");
            String seq = valueMap.get("seq");

            MaterialFormAttr attr = attrMap.get(attrCode);
            valueObj.setAttr(attr);
            valueObj.setValue(value);
            if ( attr == null ) {
                continue;
            }
            if ("file".equals(attr.getType()) || "pic".equals(attr.getType())) {
//                if(value.contains("@@")){
//                    value = value.replace("@@","||");
//                    valueObj.setValue(value);
//                }
            }
            valueObj.setActivity(activity);
            valueObj.setSeq(Integer.parseInt(seq));
            valueObj.setCreateOn(DateUtil.date());
            valueList.add(valueObj);
        }

        materialFormMenuDao.insertBatch(menuList,10);
        materialFormAttrDao.insertBatch(attrList,10);
        materialFormValueDao.insertBatch(valueList,10);
    }
}
