package com.sf.apijson.config;

import java.util.Map;

import com.sf.common.core.domain.entity.SysUser;
import com.sf.common.utils.spring.SpringUtils;
import com.sf.framework.web.service.PermissionService;

import apijson.RequestMethod;
import apijson.framework.APIJSONVerifier;
import apijson.orm.AbstractVerifier;
import apijson.orm.SQLConfig;

@SuppressWarnings("rawtypes")
public class FormVerifier extends APIJSONVerifier {

	@Override
	public boolean verifyAccess(SQLConfig config) throws Exception {
		// 启动加载
		if (visitor.getId() == null && config.getMethod() == RequestMethod.GET
				&& (config.getTable().equals("Script") || config.getTable().equals("Function")
						|| config.getTable().equals("Access") || config.getTable().equals("Request")
						|| config.getTable().equals("Document"))) {
			return true;
		}
		// "UNKNOWN": 未登录用户访问
		// "LOGIN": 登陆用户 访问
		// "OWNER": 创建人,比如我创建的订单、物流、评论等等
		// "ADMIN": 超级管理员 访问
		// "UNKNOWN","LOGIN","OWNER"交给框架处理
		
		// 判断是否启用 创建人字段UserId
		// 如果主键和创建人字段名一致，则不记录创建人
		String visitorIdKey = getVisitorIdKey(config);
		Object idKey = getIdKey(config.getDatabase(), config.getSchema(), config.getDatasource(), config.getTable());
		Object userId = visitorIdKey.equals(idKey) ? null : visitorIdKey;
		boolean createBy = true;
		if (userId == null) { // null 无效
			createBy = false;
		}
		// 从Access_map获取配置的权限标识
		boolean isOwner = false;
		// 判断是否为admin
		if (SysUser.isAdmin(Long.valueOf(visitor.getId().toString()))) {
			if (createBy && config.getMethod() == RequestMethod.POST) {
				isOwner = true;
			} else {
				return true;
			}
		} else {
			// 开启apijson 表权限
//			Map<RequestMethod, String[]> permsMap = AbstractVerifier.ACCESS_MAP.get(config.getTable());
//			String[] perms = permsMap == null ? null : permsMap.get(config.getMethod());
//			if (perms != null) {
//				for (String perm : perms) {
//					if (ROLE_MAP.containsKey(perm) == false) {
//						// 判断当前用户是否有权限
//						PermissionService permissionService = SpringUtils.getBean("ss", PermissionService.class);
//						if (permissionService.hasPermi(perm) == false) {
//							// 仅具有ROLE_ADMIN权限的用户可访问的逻辑
//							throw new IllegalArgumentException("没有权限，请联系管理员授权");
//						} else {
//							// 拥有权限
//							if (createBy && (config.getMethod() == RequestMethod.POST || config.getMethod() == RequestMethod.PUT)) {
//								isOwner = true;
//								break;
//							}
//							return true;
//						}
//					}
//				}
//			}
			// 不启用apijson 表权限,只做接口权限
			isOwner = true;
		}
		if (isOwner) {
			config.setRole(OWNER);
		}
		// 后面会校验其他已存在的角色
		return super.verifyAccess(config);
	}

	// 校验管理员
	@Override
	public void verifyAdmin() throws Exception {
		if (((FormUserVisitor) this.visitor).getRole().equals(ADMIN) == false) {
			throw new IllegalArgumentException("请勿伪造[" + ADMIN + "]角色");
		}
	}
}
