package com.sf.apijson.config;

import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;

import org.apache.commons.lang3.StringUtils;

import com.alibaba.fastjson.JSONObject;

import apijson.RequestMethod;
import apijson.StringUtil;
import apijson.framework.APIJSONSQLConfig;
import apijson.orm.AbstractSQLConfig;

public class FormSQLConfig extends APIJSONSQLConfig {
 	public FormSQLConfig() {
		super();
	}

	public FormSQLConfig(RequestMethod method, String table) {
		super(method, table);
	}

	static {
		DEFAULT_DATABASE = DATABASE_MYSQL; // TODO 默认数据库类型，改成你自己的
		DEFAULT_SCHEMA = ApijsonDataSource.getDefaultDetail().getSchema(); // TODO 默认数据库名/模式，改成你自己的，默认情况是 MySQL: sys, PostgreSQL: public, SQL Server:
											// dbo, Oracle:

		// Oracle:
		// 表名和数据库不一致的，需要配置映射关系。只使用 APIJSONORM 时才需要；
		// 如果用了 apijson-framework 且调用了 APIJSONApplication.init
		// (间接调用 DemoVerifier.init 方法读取数据库 Access 表来替代手动输入配置)，则不需要。
		// 但如果 Access 这张表的对外表名与数据库实际表名不一致，仍然需要这里注册。例如
		// TABLE_KEY_MAP.put(Access.class.getSimpleName(), "access");

		// 表名映射，隐藏真实表名，对安全要求很高的表可以这么做
		// TABLE_KEY_MAP.put("User", "apijson_user");
		// TABLE_KEY_MAP.put("Privacy", "apijson_privacy");
		// 主键名映射
		SIMPLE_CALLBACK = new SimpleCallback<String>() {

			@Override
			public AbstractSQLConfig getSQLConfig(RequestMethod method, String database, String schema,
					String datasource, String table) {
				return new FormSQLConfig(method, table);
			}

			// 取消注释来实现数据库自增 id
			@Override
			// public String newId(JSONObject request, RequestMethod method, String
			// database, String schema, String datasource, String table) {
			public String newId(RequestMethod method, String database, String schema, String datasource, String table) {
				if (table.equals("Access") || table.equals("Request") || table.equals("Function")
						|| table.equals("Document")) {
					return null;
				}
				
				// return null 则不生成 id，一般用于数据库自增 id
				return StringUtils.isNotBlank(table) && ApijsonInitUtil.getTablePkIncrement(table) != null ? null : UUID.randomUUID().toString();
			}

			@Override
			public String getUserIdKey(String database, String schema, String datasource, String table) {
				// 不使用创建人，请将id 和 UserId填写为一样
				return (StringUtils.isNotBlank(table) && ApijsonInitUtil.getTableUserId(table) != null ) ? ApijsonInitUtil.getTableUserId(table).toString() : super.getUserIdKey(database, schema, datasource, table);
			}

			@Override
			public String getIdKey(String database, String schema, String datasource, String table) {
				String id = (StringUtils.isNotBlank(table) &&  ApijsonInitUtil.getTablePk(table) != null) ? ApijsonInitUtil.getTablePk(table).toString() : super.getIdKey(database, schema, datasource, table);
				return id;
			}

			@Override
			public void onMissingKey4Combine(String name, JSONObject request, String combine, String item, String key)
					throws Exception {
				// super.onMissingKey4Combine(name, request, combine, item, key);
			}

		};
		RAW_MAP.put("`to`.`id`", "");
	}

	@Override
	public boolean isFakeDelete() {
		return true;
	}

	@Override
	public String getDBVersion() {
		return "5.7.22"; // "8.0.11"; // TODO 改成你自己的 MySQL 或 PostgreSQL 数据库版本号 // MYSQL 8 和 7 使用的 JDBC
							// 配置不一样
	}

	@Override
	public Map onFakeDelete(Map map) {
		// map.put("deletedTime", DateUtils.format(new Date(),
		// DateUtils.DATE_TIME_PATTERN));
		return super.onFakeDelete(map);
	}
}
