package com.sf;

import java.util.Map;
import java.util.regex.Pattern;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.sf.apijson.config.ApijsonInitUtil;
import com.sf.apijson.config.FormFunctionParser;
import com.sf.apijson.config.FormParser;
import com.sf.apijson.config.FormSQLConfig;
import com.sf.apijson.config.FormSQLExecutor;
import com.sf.apijson.config.FormVerifier;

import apijson.Log;
import apijson.StringUtil;
import apijson.framework.APIJSONApplication;
import apijson.framework.APIJSONCreator;
import apijson.framework.APIJSONParser;
import apijson.orm.AbstractFunctionParser;
import apijson.orm.AbstractParser;
import apijson.orm.AbstractVerifier;
import apijson.orm.FunctionParser;
import apijson.orm.Parser;
import apijson.orm.SQLConfig;
import apijson.orm.SQLExecutor;
import apijson.orm.Verifier;

/**
 * 启动程序
 * 
 * @author ztzh
 */
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class AdminApplication {
	// 全局 ApplicationContext 实例，方便 getBean 拿到 Spring/SpringBoot 注入的类实例
	private static ApplicationContext APPLICATION_CONTEXT;

	public static ApplicationContext getApplicationContext() {
		return APPLICATION_CONTEXT;
	}

	public static void main(String[] args) throws Exception {
		// System.setProperty("spring.devtools.restart.enabled", "false");
		APPLICATION_CONTEXT = SpringApplication.run(AdminApplication.class, args);
		AbstractParser.MAX_OBJECT_COUNT = 20;
		AbstractParser.MAX_UPDATE_COUNT = 30;
		//AbstractParser.PUBLIC_RETURN_COLUMN_TOCAMELCASE = true;
		Log.DEBUG = true;
		APIJSONParser.IS_PRINT_BIG_LOG = false;
		AbstractFunctionParser.ENABLE_SCRIPT_FUNCTION = true;
		AbstractVerifier.IS_UPDATE_MUST_HAVE_ID_CONDITION = false;
		AbstractParser.DEFAULT_QUERY_PAGE = false;
		ApijsonInitUtil.IS_INIT_SHUTDOWNWHENSERVERERROR = true; // 正式环境配置为false
		ApijsonInitUtil.init(); // 4.4.0 以上需要这句来保证以上 static 代码块中给 DEFAULT_APIJSON_CREATOR 赋值会生效
	}
	
	// 支持 APIAuto 中 JavaScript 代码跨域请求
	@Bean
	public WebMvcConfigurer configurer() {
		return new WebMvcConfigurer() {
			@Override
			public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
				// 设定各个接口默认返回 application/json，以便 Postman 展示
				configurer.defaultContentType(MediaType.APPLICATION_JSON);
			}

			@Override
			public void addCorsMappings(CorsRegistry registry) {
				registry.addMapping("/**").allowedOriginPatterns("*").allowedMethods("*").allowCredentials(true)
						.maxAge(3600);
			}
		};
	}

	static {
		// APIJSON 配置 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

		Map<String, Pattern> COMPILE_MAP = AbstractVerifier.COMPILE_MAP;
		COMPILE_MAP.put("PHONE", StringUtil.PATTERN_PHONE);
		COMPILE_MAP.put("EMAIL", StringUtil.PATTERN_EMAIL);
		COMPILE_MAP.put("ID_CARD", StringUtil.PATTERN_ID_CARD);
		// 使用本项目的自定义处理类
		APIJSONApplication.DEFAULT_APIJSON_CREATOR = new APIJSONCreator<String>() {
			@Override
			public Parser<String> createParser() {
				return new FormParser();
			}

			@Override
			public SQLConfig createSQLConfig() {
				return new FormSQLConfig();
			}

			@Override
			public FunctionParser createFunctionParser() {
				return new FormFunctionParser();
			}

			@Override
			public SQLExecutor createSQLExecutor() {
				return new FormSQLExecutor();
			}

			@SuppressWarnings({ "rawtypes", "unchecked" })
			@Override
			public Verifier createVerifier() {
				return new FormVerifier();
			}
		};

		// 把以下需要用到的数据库驱动取消注释即可，如果这里没有可以自己新增
		// try { //加载驱动程序
		// Log.d(TAG, "尝试加载 SQLServer 驱动 <<<<<<<<<<<<<<<<<<<<< ");
		// Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
		// Log.d(TAG, "成功加载 SQLServer 驱动！>>>>>>>>>>>>>>>>>>>>> ");
		// }
		// catch (ClassNotFoundException e) {
		// e.printStackTrace();
		// Log.e(TAG, "加载 SQLServer 驱动失败，请检查 pom.xml 中 net.sourceforge.jtds 版本是否存在以及可用
		// ！！！");
		// }
		//
		// try { //加载驱动程序
		// Log.d(TAG, "尝试加载 Oracle 驱动 <<<<<<<<<<<<<<<<<<<<< ");
		// Class.forName("oracle.jdbc.driver.OracleDriver");
		// Log.d(TAG, "成功加载 Oracle 驱动！>>>>>>>>>>>>>>>>>>>>> ");
		// }
		// catch (ClassNotFoundException e) {
		// e.printStackTrace();
		// Log.e(TAG, "加载 Oracle 驱动失败，请检查 pom.xml 中 com.oracle.jdbc 版本是否存在以及可用 ！！！");
		// }
	}
}
