package com.jiayue.ipp.common.mybatis.interceptor;


//@Component
//@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
//@Slf4j
//public class DataPermissionsInterceptorPlus implements InnerInterceptor {
//
//	public boolean willDoQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
//
////		System.out.println("willDoQuery");
//		return true;
//	}
//
//	public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
////		System.out.println("beforeQuery");
//	}
//
//	public boolean willDoUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException {
////		System.out.println("willDoUpdate");
//		return true;
//	}
//
//	public void beforeUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException {
////		System.out.println("beforeUpdate");
//	}
//
//
//	public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout)  {
//
//	/*	MapperMethod.ParamMap<QueryWrapper> parameterObject = (MapperMethod.ParamMap) sh.getParameterHandler().getParameterObject();
//		QueryWrapper ew = parameterObject.get("ew");
//		String sqlSegment = ew.getExpression().getSqlSegment();*/
//
//		try {
//
//			MetaObject metaObject = MetaObject.forObject(sh, SystemMetaObject.DEFAULT_OBJECT_FACTORY, SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory());
//			MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
//
//			//注解逻辑判断  添加注解了才拦截
//			Class<?> classType = Class.forName(mappedStatement.getId().substring(0, mappedStatement.getId().lastIndexOf(".")));
//
//			boolean isDataPermission = classType.isAnnotationPresent(DataPermissions.class);
//
//			if (isDataPermission) {
//				String mName = mappedStatement.getId().substring(mappedStatement.getId().lastIndexOf(".") + 1, mappedStatement.getId().length());
//				DataPermissions permissions = classType.getAnnotation(DataPermissions.class);
//				String[] scopes = permissions.scope();
//				String columnName = permissions.value();
//				List<String> scopeFilter = Arrays.stream(scopes).filter(s -> s.equals(mName)).collect(Collectors.toList());
//
//				if (CollectionUtil.isNotEmpty(scopeFilter)) {
//					BoundSql boundSql = sh.getBoundSql();
//					String sql = boundSql.getSql();
//
//					boolean filter = isFilter(sql, columnName);
//
//					if (filter) {
//						String sqlIn = "";
//						String sqlLimit = "";
//						List<String> unitCodes = SecurityUtils.getUser().getUnitCodes();
//
//						for (String unitCode : unitCodes) {
//							sqlLimit += "'" + unitCode + "',";
//						}
//						sqlLimit = " IN (" + sqlLimit.substring(0, sqlLimit.length() - 1) + ")";
//
//						sqlIn += " AND " + columnName + sqlLimit;
//
//						sql += sqlIn;
//
//						//生成增强权限控制后的SQL语句
//						Field field = boundSql.getClass().getDeclaredField("sql");
//						field.setAccessible(true);
//						field.set(boundSql, sql);
//					}
//					System.out.println(sql);
//				}
//
//
//			}
//		} catch (Exception e) {
//			if(e instanceof ClassNotFoundException){
//				throw new RuntimeException("数据校验异常：未找到mapper！！");
//			}else{
//				throw new RuntimeException("数据校验异常！！");
//			}
//
//		}
//
//
//	}
//
//	/**
//	 * @param sql        原始SQL
//	 * @param columnName 权限字段名称
//	 * @return 是否需要配置权限
//	 */
//	private boolean isFilter(String sql, String columnName) {
//		boolean result = false;
//		String where = "WHERE";
//		int whereIndex = sql.indexOf(where);
//
//		if (whereIndex != -1) {
//			int i = sql.indexOf(columnName, whereIndex);
//			if (i != -1) {
//				result = true;
//			}
//		}
//		return result;
//	}
//
//
//	public void beforeGetBoundSql(StatementHandler sh) {
////		System.out.println("beforeGetBoundSql");
//	}
//
//	public void setProperties(Properties properties) {
////		System.out.println("setProperties");
//	}
//
//}
