import { actionAddins } from ".";
import {  IAction,IActionResult, IActionNode, IActionProperty, IField, IContext } from "../types/ActionTypes";

/**
 * アクションの属性定義
 */
    interface FullWidthProps{
        field:IField
    }
/**
 * 全角チェックアクション
 */
export class FullWidthAction implements IAction{
    name: string;
    actionProps: IActionProperty[];
    props:FullWidthProps;
    constructor(){
        this.name="全角チェック"; /* pgadminのnameと同様  */
        this.actionProps=[];
        this.props={
            field:{code:''}
        }
        //アクションを登録する
        this.register();
    }
    /**
     * アクションの実行を呼び出す
     * @param actionNode
     * @param event
     * @returns
     */
    async process(actionNode:IActionNode,event:any,context:IContext):Promise<IActionResult> {
        let result={
            canNext:true,
            result:false
        };
        try{
            //属性設定を取得する
            this.actionProps=actionNode.actionProps;
            if (!('field' in actionNode.ActionValue) ) {
                return result
            }
            this.props = actionNode.ActionValue as FullWidthProps;
            //条件式の計算結果を取得
            const record = event.record;
            if(!(this.props.field.code in record)){
                throw new Error(`フィールド「${this.props.field.code}」が見つかりません。`);
            }
            const value = record[this.props.field.code]?.value;
            //条件分岐
            //未入力時は何も処理をせず終了
            if(value===undefined || value===''){
                record[this.props.field.code].error=null;
            }
            //半角が含まれていた場合resultがfalse
            if(!this.containsFullWidthChars(value) && !(value === undefined || value ==='')){
                //エラー時に出力される文字設定
                record[this.props.field.code].error="半角が含まれています";
                //次の処理を中止する値設定
                result.canNext=false;
            }
            else{
                record[this.props.field.code].error=null;
            }
            //resultプロパティ指定
            result= {
            canNext:true,
            result:true
            }
            return result;

        //例外処理
        }catch(error){
            // event.error=error;
            // console.error(error);
            context.errors.handleError(error,actionNode);
            result.canNext=false;
            return result;
        }
    }
    // 全て全角の文字列の場合はtrue、そうでない場合はfalse
    containsFullWidthChars(text: string): boolean {

        // 半角英数字カナ記号を除外
        //全角かどうか
        const checkRegex="^[^\x01-\x7E\uFF61-\uFF9F]+$";

        //正規表現オブジェクト生成
        const fullWidthRegex = new RegExp(checkRegex);

        //正規表現チェック
        return fullWidthRegex.test(text);
    }

    //戻り値を持たないためvoid型
    register(): void {
        actionAddins[this.name]=this;
    }
}
new FullWidthAction();