import { useFlowEditorStore } from 'src/stores/flowEditor';
import { IActionFlow } from './ActionTypes';
export interface IKintoneEventNode {
  label: string;
  header: string;
  eventId: string;
  parentId: string;
}

export interface IKintoneEvent extends IKintoneEventNode {
  hasFlow: boolean;
  flowData?: IActionFlow;
}

export interface IKintoneEventGroup extends IKintoneEventNode {
  events: IKintoneEventNode[];
}

export class kintoneEvent implements IKintoneEvent {
  eventId: string;
  parentId: string;
  get hasFlow(): boolean {
    return this.flowData !== undefined && this.flowData.actionNodes.length > 1;
  }
  flowData?: IActionFlow | undefined;
  label: string;
  header :string;
  constructor(label: string, eventId: string, parentId: string,header?:string) {
    this.eventId = eventId;
    this.label = label;
    this.parentId = parentId;
    this.header=header?header:'EVENT';
  }
}

export class kintoneEventGroup implements IKintoneEventGroup {
  eventId: string;
  parentId: string;
  label: string;
  events: IKintoneEventNode[];
  get header(): string {
    return 'EVENTGROUP';
  }
  constructor(
    eventId: string,
    label: string,
    events: IKintoneEventNode[],
    parentId: string
  ) {
    this.eventId = eventId;
    this.label = label;
    this.events = events;
    this.parentId = parentId;
  }
}

export class kintoneEventForChange implements IKintoneEventGroup {
  eventId: string;
  parentId: string;
  label: string;
  events: IKintoneEventNode[];
  get header(): string {
    return 'CHANGE';
  }
  constructor(
    eventId: string,
    label: string,
    events: IKintoneEventNode[],
    parentId: string
  ) {
    this.eventId = eventId;
    this.label = label;
    this.events = events;
    this.parentId = parentId;
  }
}

export class KintoneEventManager {
  public screens: IKintoneEventGroup[];

  constructor() {
    this.screens = this.getKintoneEvents();
  }

  public bindFlows(flows: IActionFlow[]) {
    this.screens = this.getKintoneEvents();
    for (const flow of flows) {
      const eventId = flow.getRoot()?.name;
      if (eventId !== undefined) {
        const eventNode = this.findEventById(eventId);
        if (eventNode !== null && eventNode.header === 'EVENT') {
          const event = eventNode as kintoneEvent;
          event.flowData = flow;
        } else {
          //EventGroupのIDを取得
          const lastIndex = eventId.lastIndexOf('.');
          const groupId = eventId.substring(0, lastIndex);
          const eventNode = this.findEventById(groupId);
          if (eventNode && (eventNode.header === 'EVENTGROUP' || eventNode.header === 'CHANGE')) {
            const groupEvent = eventNode as kintoneEventGroup;
            const label=flow.getRoot()?.subTitle || '';
            const newEvent = new kintoneEvent(label,eventId,groupId,'DELETABLE');
            newEvent.flowData=flow;
            groupEvent.events.push(newEvent);
          }
        }
      }
    }
  }

  public findEventById(eventId: string): IKintoneEventNode | null {
    const screen = this.findScreen(eventId);
    if (screen) {
      return screen;
    }
    for (const screen of this.screens) {
      for (const event of screen.events) {
        if (event.eventId === eventId) {
          return event;
        }
        if (event.header === 'EVENTGROUP' || event.header === 'CHANGE') {
          const eventGroup = event as IKintoneEventGroup;
          const targetEvent = eventGroup.events.find((ev) => {
            return ev.eventId === eventId;
          });
          if (targetEvent) {
            return targetEvent;
          }
        }
      }
    }
    return null;
  }

  public findAllFlows():IActionFlow[]{
    const flows:IActionFlow[]=[];
    for (const screen of this.screens) {
      for (const event of screen.events) {
        if (event.header === 'EVENT') {
          const eventNode = event as IKintoneEvent;
          if(eventNode.flowData!==undefined){
            flows.push(eventNode.flowData);
          }
        }else if (event.header === 'EVENTGROUP' || event.header === 'CHANGE') {
          const eventGroup = event as IKintoneEventGroup;
          eventGroup.events.forEach((ev) => {
            if (ev.header === 'EVENT' || ev.header === 'DELETABLE') {
              const eventNode = ev as IKintoneEvent;
              if(eventNode.flowData!==undefined){
                flows.push(eventNode.flowData);
              }
            }
          });
        }
      }
    }
    return flows;
  }

  public findScreen(eventId: string): IKintoneEventGroup | undefined {
    return this.screens.find((screen) => screen.eventId == eventId);
  }

  public deleteEvent(
    event: kintoneEvent,
    store: ReturnType<typeof useFlowEditorStore>
  ) {
    if (event.header !== 'DELETABLE') {
      return;
    }

    const parent = store.findEventById(event.parentId);
    if (parent?.header !== 'CHANGE' && parent?.header !== 'EVENTGROUP') {
      return;
    }
    const realParent = parent as kintoneEventForChange;

    const index = realParent.events.findIndex(
      (e) => e.eventId === event.eventId
    );

    if (index !== -1) {
      realParent.events.splice(index, 1);
    }
  }

  public getKintoneEvents(): IKintoneEventGroup[] {
    return [
      new kintoneEventGroup(
        'app.record.create',
        'レコード追加画面',
        [
          new kintoneEvent(
            'レコード追加画面を表示した後',
            'app.record.create.show',
            'app.record.create'
          ),
          new kintoneEvent(
            '保存をクリックしたとき',
            'app.record.create.submit',
            'app.record.create'
          ),
          new kintoneEvent(
            '保存が成功したとき',
            'app.record.create.submit.success',
            'app.record.create'
          ),
          new kintoneEventForChange(
            'app.record.create.change',
            'フィールドの値を変更したとき',
            [],
            'app.record.create'
          ),
          new kintoneEventGroup(
            'app.record.create.show.customButtonClick',
            'ボタンをクリックしたとき',
            [],
            'app.record.create'
          ),
        ],
        ''
      ),
      new kintoneEventGroup(
        'app.record.detail',
        'レコード詳細画面',
        [
          new kintoneEvent(
            'レコード詳細画面を表示した後',
            'app.record.detail.show',
            'app.record.detail'
          ),
          new kintoneEvent(
            'レコードを削除するとき',
            'app.record.detail.delete.submit',
            'app.record.detail'
          ),
          new kintoneEvent(
            'プロセス管理のアクションを実行したとき',
            'app.record.detail.process.proceed',
            'app.record.detail'
          ),
          new kintoneEventGroup(
            'app.record.detail.show.customButtonClick',
            'ボタンをクリックしたとき',
            [],
            'app.record.detail'
          ),
        ],
        ''
      ),
      new kintoneEventGroup(
        'app.record.edit',
        'レコード編集画面',
        [
          new kintoneEvent(
            'レコード編集画面を表示した後',
            'app.record.edit.show',
            'app.record.edit'
          ),
          new kintoneEvent(
            '保存をクリックしたとき',
            'app.record.edit.submit',
            'app.record.edit'
          ),
          new kintoneEvent(
            '保存が成功したとき',
            'app.record.edit.submit.success',
            'app.record.edit'
          ),
          new kintoneEventForChange(
            'app.record.edit.change',
            'フィールドの値を変更したとき',
            [],
            'app.record.edit'
          ),
          new kintoneEventGroup(
            'app.record.edit.show.customButtonClick',
            'ボタンをクリックしたとき',
            [],
            'app.record.edit'
          ),
        ],
        ''
      ),
      new kintoneEventGroup(
        'app.record.index',
        'レコード一覧画面',
        [
          new kintoneEvent(
            '一覧画面を表示した後',
            'app.record.index.show',
            'app.record.index'
          ),
          new kintoneEvent(
            'インライン編集を開始したとき',
            'app.record.index.edit.show',
            'app.record.index'
          ),
          new kintoneEvent(
            'インライン編集の保存をクリックしたとき',
            'app.record.index.edit.submit',
            'app.record.index'
          ),
          new kintoneEvent(
            'インライン編集の保存が成功したとき',
            'app.record.index.edit.submit.success',
            'app.record.index'
          ),
          // new kintoneEventForChange(
          //   'app.record.index.edit.change',
          //   'インライン編集のフィールド値を変更したとき',
          //   [],
          //   'app.record.index'
          // ),
          new kintoneEventGroup(
            'app.record.index.show.customButtonClick',
            'ボタンをクリックしたとき',
            [],
            'app.record.index'
          ),
        ],
        ''
      ),
    ];
  }
}

// export const kintoneEvents:KintoneEventManager = new KintoneEventManager([
//     new kintoneEventGroup("app.record.create","レコード追加画面",[
//       new kintoneEvent('レコード追加画面を表示した後','app.record.create.show',"app.record.create"),
//       new kintoneEvent('保存をクリックしたとき','app.record.create.submit',"app.record.create"),
//       new kintoneEvent('保存が成功したとき','app.record.create.submit.success',"app.record.create"),
//       new kintoneEventForChange('app.record.create.change','フィールドの値を変更したとき',[],"app.record.create"),
//       new kintoneEventGroup('app.record.create.customButtonClick','ボタンをクリックした時',[],"app.record.create")
//     ],""),
//     new kintoneEventGroup("app.record.detail","レコード詳細画面",[
//       new kintoneEvent('レコード詳細画面を表示した後','app.record.detail.show',"app.record.detail"),
//       new kintoneEvent('レコードを削除するとき','app.record.detail.delete.submit',"app.record.detail"),
//       new kintoneEvent('プロセス管理のアクションを実行したとき','app.record.detail.process.proceed',"app.record.detail"),
//       new kintoneEventGroup('app.record.detail.customButtonClick','ボタンをクリックした時',[],"app.record.detail"),
//     ],""),
//     new kintoneEventGroup("app.record.edit","レコード編集画面",[
//       new kintoneEvent('レコード編集画面を表示した後','app.record.edit.show',"app.record.edit"),
//       new kintoneEvent('保存をクリックしたとき','app.record.edit.submit',"app.record.edit"),
//       new kintoneEvent('保存が成功したとき','app.record.edit.submit.success',"app.record.edit"),
//       new kintoneEventForChange('app.record.edit.change','フィールドの値を変更したとき',[],"app.record.edit"),
//       new kintoneEventGroup('app.record.edit.customButtonClick','ボタンをクリックした時',[],"app.record.edit"),
//     ],""),
//     new kintoneEventGroup("app.record.index","レコード一覧画面",[
//       new kintoneEvent('一覧画面を表示した後', 'app.record.index.show',"app.record.index"),
//       new kintoneEvent('インライン編集を開始したとき','app.record.index.edit.show',"app.record.index"),
//       new kintoneEvent('インライン編集の【保存】をクリックしたとき','app.record.index.edit.submit',"app.record.index"),
//       new kintoneEvent('インライン編集の保存が成功したとき', 'app.record.index.edit.submit.success',"app.record.index"),
//       new kintoneEventForChange('app.record.index.edit.change','インライン編集のフィールド値を変更したとき' ,[],"app.record.index"),
//       new kintoneEventGroup('app.record.detail.customButtonClick','ボタンをクリックした時',[],"app.record.index"),
//     ],"")
// ]);
