package com.bohuikeji.delivery.backstage.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.bohuikeji.delivery.backstage.entity.TConfig;
import com.bohuikeji.delivery.backstage.entity.TCustomer;
import com.bohuikeji.delivery.backstage.entity.TCustomerTemplate;
import com.bohuikeji.delivery.backstage.entity.TMerchantConfig;
import com.bohuikeji.delivery.backstage.mapper.TMerchantConfigMapper;
import com.bohuikeji.delivery.backstage.service.ITCustomerService;
import com.bohuikeji.delivery.backstage.service.ITCustomerTemplateService;
import com.bohuikeji.delivery.backstage.service.ITMerchantConfigService;
import com.bohuikeji.frame.module.admin.base.ServiceImplBase;
import com.bohuikeji.frame.module.admin.entity.TFranchiseeInformation;
import com.bohuikeji.frame.module.admin.entity.sys.SysConfig;
import com.bohuikeji.frame.module.admin.service.ITFranchiseeInformationService;
import com.bohuikeji.frame.module.admin.utils.MapUtils;
import com.bohuikeji.frame.module.admin.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

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

@Slf4j
@Service
@RequiredArgsConstructor
public class TMerchantConfigServiceImpl extends ServiceImplBase<TMerchantConfigMapper, TMerchantConfig> implements ITMerchantConfigService {
    final ITFranchiseeInformationService franService;
    final ITCustomerService customerService;
    final ITCustomerTemplateService templateService;

    @Override
    public TMerchantConfig getConfigByKey(String key,Integer franId) {
        return getOne(new QueryWrapper<TMerchantConfig>().eq("config_key",key),false);
    }

    @Override
    public List<TMerchantConfig> getListByGroup(String groupKey,Integer franId) {
        return list(new QueryWrapper<TMerchantConfig>().eq("fran_id",franId).eq("config_group",groupKey));
    }

    @Override
    public List<TMerchantConfig> getBListByGroup(String groupKey, Integer franId) {
        return list(new QueryWrapper<TMerchantConfig>()
                .eq("config_status","使用中")
                .eq("fran_id",franId)
                .eq("config_group",groupKey).orderByDesc("config_sort"));
    }


    @Override
    public SysConfig getSysConfigByKey(String key,String location) {
        TMerchantConfig config=getOne(
                new QueryWrapper<TMerchantConfig>()
                        .eq("config_key",key)
                        .eq("fran_id",franService.checkPio(MapUtils.getAddressReGeo(location)).getFranId()),false);
        return config.toOldConfig();
    }

    @Override
    public TMerchantConfig getByIdWithCustomer(Integer configId, Integer customerId) {
        TCustomer customer=customerService.getById(customerId);
        if (customer==null){
            return getById(configId);
        }
        //未绑定直接返回计费
        if(StringUtils.isBlank(customer.getTemplateId())){
            //log.error("未绑定计费配置{}",customer);
            return getById(configId);
        }
        /*TConfig tConfig = getById(configId);
        if(tConfig != null && tConfig.getConfigGroup().equals("car_type_lashuo")){
            return getById(tConfig.getId());
        }*/
        TMerchantConfig config=new TMerchantConfig();
        TCustomerTemplate configTemplate=templateService.getById(configId);
        if(configTemplate==null){
            return config;
        }
        config.setConfigValue(configTemplate.getConfigValue());
        config.setId(configTemplate.getTemplateId());
        config.setConfigKey(configTemplate.getConfigKey());
        config.setConfigName(configTemplate.getConfigName());
        config.setConfigGroup(configTemplate.getConfigGroup());
        config.setFranId(configTemplate.getFranId());
        return config;
    }

    @Override
    public List<TMerchantConfig> getFranConfigByGroupWithCustomer(String groupKey,String location,Integer customerId) {
        TCustomer customer=customerService.getById(customerId);
        //log.info("计费模板对应的商户信息:[{}]",customer);
        if (customer==null){
            return getFranConfigs(groupKey, location);
        }
        //如果客户绑定可模板，优先使用模板计费
        if(StringUtils.isNotBlank(customer.getTemplateId())){
            TCustomerTemplate template=templateService.getById(customer.getTemplateId());
            if (template!=null){
                List<TCustomerTemplate> templates=templateService.getListByGroup(groupKey,template.getFranId(),template.getTemplateCode());
                List<TMerchantConfig> configs=new ArrayList<>();
                templates.forEach(t->{
                    TMerchantConfig config=new TMerchantConfig();
                    config.setConfigGroup(t.getConfigGroup());
                    config.setConfigKey(t.getConfigKey());
                    config.setConfigName(t.getConfigName());
                    config.setConfigValue(t.getConfigValue());
                    config.setId(t.getTemplateId());
                    configs.add(config);
                });
                return configs;
            }
        }
        //没有模板走加盟商计费
        return getFranConfigs(groupKey, location);

    }

    private List<TMerchantConfig> getFranConfigs(String groupKey, String location) {
        TFranchiseeInformation fran=franService.checkPio(MapUtils.getAddressReGeo(location));
        List<TMerchantConfig> configs=list(new QueryWrapper<TMerchantConfig>()
                .eq("config_group",groupKey)
                .eq("fran_id",fran.getFranId()).eq("show_type",1).orderByDesc("config_sort"));
        if (configs==null||configs.size()<1){
            for (int i = 0; i < 5; i++) {
                fran=franService.getSuper(fran.getFranId());
                if (fran==null){
                    log.error("【上级加盟商获取异常】参数：key={}，location={}",groupKey,location);
                    configs=list(new QueryWrapper<TMerchantConfig>().eq("config_group",groupKey).eq("fran_id",1).eq("show_type",1).orderByDesc("config_sort"));
                }
                else{
                    configs=list(new QueryWrapper<TMerchantConfig>().eq("config_group",groupKey).eq("fran_id",fran.getFranId()).eq("show_type",1).orderByDesc("config_sort"));
                }
                if (configs!=null&&configs.size()>1){
                    break;
                }
            }
        }
        return configs;
    }

    /*@Override
    public List<TConfig> getFranConfigByGroupCustomer(String groupKey,Integer franId,Integer customerId) {
        TCustomer customer=customerService.getById(customerId);
        List<TConfig> configs=list( new QueryWrapper<TConfig>()
                .eq("config_group",groupKey)
                .eq("fran_id",franId).orderByDesc("config_sort"));

        if(StringUtils.isBlank(customer.getTemplateId())){
            return configs;
        }
        TCustomerTemplate template=templateService.getById(customer.getTemplateId());
        if (template==null){
            return configs;
        }
        List<TCustomerTemplate> templates=templateService.getListByGroup(groupKey,template.getFranId(),template.getTemplateCode());
        configs.clear();
        templates.forEach(t->{
            TConfig config=new TConfig();
            config.setConfigGroup(t.getConfigGroup());
            config.setConfigKey(t.getConfigKey());
            config.setConfigName(t.getConfigName());
            config.setConfigValue(t.getConfigValue());
            config.setId(t.getTemplateId());
            configs.add(config);
        });
        return configs;

    }*/

    /**
     * 获取加盟计费规则组的默认规则
     * 【注意】如未配置默认规则，则使用顺序第一条作为默认
     * 【场景】目前开放平台使用本系统下单功能，由于各个第三方系统业务逻辑及对接程度存在差异，暂时不提供选择计费项目功能，即只提供一种当地默认计费规则
     * 【其他】对于定制计费的合作平台请使用客户模板方式绑定计费规则，未绑定按地区默认规则计费
     *
     * @param groupKey 计费配置组KEY
     * @param location 地区经纬度，通常是下单地址坐标
     * @return
     */
    @Override
    public  List<TMerchantConfig> getFranConfigByGroup(String groupKey, String location) {
        //没有模板走加盟商计费
        return getFranConfigs(groupKey, location);
    }

    @Override
    public TMerchantConfig getOpenConfigByGroup(String confiogName, String groupKey, String location) {
        TFranchiseeInformation fran=franService.checkPio(MapUtils.getAddressReGeo(location));
        TMerchantConfig config=getOne(new QueryWrapper<TMerchantConfig>().eq("config_name",confiogName).eq("config_group",groupKey).eq("fran_id",fran.getFranId()).eq("show_type",1).orderByDesc("config_sort"));
        if (config==null){
            config=getOne(new QueryWrapper<TMerchantConfig>().eq("config_name",confiogName).eq("config_group",groupKey).eq("fran_id",1).eq("show_type",1).orderByDesc("config_sort"));
        }
        return config;
    }

    /**
     * 获取大客户附加计费组配置
     *
     * @param customerId 客户ID
     * @return
     */
    @Override
    public List<TCustomerTemplate> getBigCustomerAddList(Integer customerId) {
        TCustomer customer=customerService.getById(customerId);
        //log.info("计费模板对应的商户信息:[{}]",customer);
        if (customer==null){
            return null;
        }
        //未绑定计费模板，返回null
        if(StringUtils.isBlank(customer.getTemplateId())){
            return null;
        }
        TCustomerTemplate firstTemp= templateService.getById(customer.getTemplateId());
        List<TCustomerTemplate> list=templateService.getListByGroup("order_price_add",firstTemp.getFranId(),firstTemp.getTemplateCode());
        List<TCustomerTemplate> rsList=new ArrayList<>(list.size());
        for (TCustomerTemplate template : list) {
            if (template.getConfigValue().getFloat("费用")>0){
                rsList.add(template);
            }
        }
        return rsList;
    }
}