package com.ruoyi.ueditorConfig;

import cn.hutool.json.JSONException;
import com.ruoyi.ueditorConfig.define.ActionMap;
import com.ruoyi.ueditorConfig.define.AppInfo;
import com.ruoyi.ueditorConfig.define.BaseState;
import com.ruoyi.ueditorConfig.define.State;
import com.ruoyi.ueditorConfig.hunter.FileManager;
import com.ruoyi.ueditorConfig.hunter.ImageHunter;
import com.ruoyi.ueditorConfig.upload.Uploader;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Map;

import static com.ruoyi.ueditorConfig.ConfigManager.readFile;


public class ActionEnter {

	private HttpServletRequest request = null;

	private String rootPath = null;
	private String contextPath = null;

	private String actionType = null;

	private ConfigManager configManager = null;

	public ActionEnter ( HttpServletRequest request, String rootPath) throws IOException {
		this.request = request;
		this.rootPath = rootPath;
		this.actionType = request.getParameter( "action" );
		this.contextPath = request.getContextPath();
		this.configManager = ConfigManager.getInstance( this.rootPath, this.contextPath, request.getRequestURI() );

	}

	public String exec () throws JSONException, IOException {

		String callbackName = this.request.getParameter("callback");
		if (this.actionType.equals("config")){
			//更改获取配置文件的方式
			String osName = System.getProperty("os.name"); // 获取操作系统名称
			String path;
			if (osName.contains("Windows")) {
				path= ConfigManager.class.getResource("/static/ueditorConfig.json").getPath();
			}  else if (osName.contains("Linux")) {
				path= "/obe/bsj/ueditorConfig.json";
			} else {
				path= "/obe/bsj/ueditorConfig.json";
			}
			String configContent =  readFile( path );
			return  configContent ;
		}

		return null;
	}

	public String invoke() throws JSONException {

		if ( actionType == null || !ActionMap.mapping.containsKey( actionType ) ) {
			return new BaseState( false, AppInfo.INVALID_ACTION ).toJSONString();
		}

		if ( this.configManager == null || !this.configManager.valid() ) {
			return new BaseState( false, AppInfo.CONFIG_ERROR ).toJSONString();
		}

		State state = null;

		int actionCode = ActionMap.getType( this.actionType );

		Map<String, Object> conf = null;

		switch ( actionCode ) {

			case ActionMap.CONFIG:
				return this.configManager.getAllConfig().toString();

			case ActionMap.UPLOAD_IMAGE:
			case ActionMap.UPLOAD_SCRAWL:
			case ActionMap.UPLOAD_VIDEO:
			case ActionMap.UPLOAD_FILE:
				conf = this.configManager.getConfig( actionCode );
				state = new Uploader( request, conf ).doExec();
				break;

			case ActionMap.CATCH_IMAGE:
				conf = configManager.getConfig( actionCode );
				String[] list = this.request.getParameterValues( (String)conf.get( "fieldName" ) );
				state = new ImageHunter( conf ).capture( list );
				break;

			case ActionMap.LIST_IMAGE:
			case ActionMap.LIST_FILE:
				conf = configManager.getConfig( actionCode );
				int start = this.getStartIndex();
				state = new FileManager( conf ).listFile( start );
				break;

		}

		return state.toJSONString();

	}

	public int getStartIndex () {

		String start = this.request.getParameter( "start" );

		try {
			return Integer.parseInt( start );
		} catch ( Exception e ) {
			return 0;
		}

	}

	/**
	 * callback参数验证
	 */
	public boolean validCallbackName ( String name ) {

		if ( name.matches( "^[a-zA-Z_]+[\\w0-9_]*$" ) ) {
			return true;
		}

		return false;

	}

}
