/*
 * Copyright [2022] [https://www.xiaonuo.vip]
 *
 * Snowy采用APACHE LICENSE 2.0开源协议，您在使用过程中，需要注意以下几点：
 *
 * 1.请不要删除和修改根目录下的LICENSE文件。
 * 2.请不要删除和修改Snowy源码头部的版权声明。
 * 3.本项目代码可免费商业使用，商业使用请保留源码和相关描述文件的项目出处，作者声明等。
 * 4.分发源码时候，请注明软件出处 https://www.xiaonuo.vip
 * 5.不可二次分发开源参与同类竞品，如有想法可联系团队xiaonuobase@qq.com商议合作。
 * 6.若您的项目无法满足以上几点，需要更多功能代码，获取Snowy商业授权许可，请在官网购买授权，地址为 https://www.xiaonuo.vip
 */
package vip.xiaonuo.ten.core.filter;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.extra.spring.SpringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;
import vip.xiaonuo.common.exception.CommonException;
import vip.xiaonuo.common.util.CommonFilterExceptionUtil;
import vip.xiaonuo.common.util.CommonServletUtil;
import vip.xiaonuo.dbs.api.DbsApi;
import vip.xiaonuo.ten.core.context.TenContextHolder;
import vip.xiaonuo.ten.core.prop.TenProperties;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 动态租户解析过滤器
 *
 * @author xuyuxiang
 * @date 2022/3/11 16:22
 **/
@Slf4j
public class TenResolveFilter implements Filter {

    private static final AntPathMatcher athMatcher = new AntPathMatcher();



    /**
     * 无需登录的接口地址集合
     */
    public static final String[] NON_TEN_RESOLVE_PATH_ARR_FEED = {

            /* 静态资源 */
            "/favicon.ico",
            "/doc.html",
            "/webjars/**",
            "/swagger-resources/**",
            "/v2/api-docs",
            "/v2/api-docs-ext",
            "/configuration/ui",
            "/configuration/security",
            "/ureport/**",
            "/druid/**",
            "/images/**",

    };

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        try {
            HttpServletRequest httpServletRequest = (HttpServletRequest)request;
            String path = httpServletRequest.getServletPath();
            String reqUrl = httpServletRequest.getRequestURL().toString();
            List<String> NON_TEN_RESOLVE_PATH_ARR = CollectionUtil.newArrayList(NON_TEN_RESOLVE_PATH_ARR_FEED);
            if(CollectionUtil.isNotEmpty(NON_TEN_RESOLVE_PATH_ARR)){
                for(String NON_TEN_RESOLVE_PATH : NON_TEN_RESOLVE_PATH_ARR){
                     boolean isNonTenPath = athMatcher.match(NON_TEN_RESOLVE_PATH, path);
                     if(isNonTenPath){
                         // 继续执行
                         chain.doFilter(request,response);
                         return;
                     }
                }
            }

            TenProperties tenProperties = SpringUtil.getBean(TenProperties.class);
            DbsApi dbsApi = SpringUtil.getBean(DbsApi.class);
            // 如果开启了多租户
        //    if(tenProperties.getEnabled()) {
                // 获取到解析的租户
              //  TenStorage tenStorage = SpringUtil.getBean(TenService.class).getCurrentTen();
                // 获取租户id
               // String tenantId = tenStorage.getId();
//                if(tenantId.equals(tenProperties.getDefaultTenId())) {
//                    // 执行切换租户的数据源为master
//                    dbsApi.changeDataSource(dbsApi.getDefaultDataSourceName());
//                    // 切换租户id为默认id
//                    TenContextHolder.put(tenProperties.getDefaultTenId());
//                } else {
//                    if(TenCategoryEnum.DB.getValue().equals(tenStorage.getCategory())) {
//                        // 执行切换租户的数据源
//                        dbsApi.changeDataSource(tenStorage.getDbsName());
//                        // 切换租户id为默认id
//                        TenContextHolder.put(tenProperties.getDefaultTenId());
//                    } else {
//                        // 执行切换租户的数据源为master
//                        dbsApi.changeDataSource(dbsApi.getDefaultDataSourceName());
//                        // 切换租户id为其id
//                        TenContextHolder.put(tenantId);
//                    }
//                }
          //  } else {
                // 执行切换租户的数据源为master
                dbsApi.changeDataSource(dbsApi.getDefaultDataSourceName());
                // 切换租户id为默认id
       //         TenContextHolder.put(tenProperties.getDefaultTenId());
         //   }
            // 继续执行
            chain.doFilter(request,response);
        } catch (Exception e) {
            // 处理filter中的异常
            if(e instanceof CommonException) {
                CommonException commonException = ((CommonException) e);
                commonException.setMsg(commonException.getMsg() + "，请求地址：" + CommonServletUtil.getRequest().getRequestURL());
            }
            CommonFilterExceptionUtil.handleFilterException(request, response, e);
        } finally {
            TenContextHolder.remove();
        }
    }
}
