import { _decorator, Component, Node } from 'cc';
import { widget_base } from './widget_base';
import { att_click_data, other_widget_finish_listen_item, widget_item_data } from '../../../data/data';
import { config } from '../../config';
import { ClientEvent } from '../../clientEvent';
import { gameManager } from '../gameManager';
const { ccclass, property } = _decorator;

@ccclass('widget_click')
export class widget_click extends widget_base {
    @property(Node) img_zhaobutong:Node = null;
    private mClickData:att_click_data = null;
    private mClickNum:number = 0;
    private mClickTime:number =1; //1秒内完成点击
    private mHoldTime:number = 0; //按下的事件
    protected init(): void {
        if(this.mData.att.click_data!=null){
            this.mClickData = this.mData.att.click_data
        }
    }
    protected start(): void {
        if(this.mIsActive){
            this.registeredEvent()
        }
    }
    protected registeredEvent(): void {
        this.mHoldTime = 0;
        this.mClickNum = 0;
        switch (this.mClickData.click_type) {
            case config.clcik_type.Press_and_hold:
                this.node.on(Node.EventType.TOUCH_START,()=>{
                    if(!this.mIsActive) return
                    this.mHoldTime = 0;
                    this.checkTime()
                    this.schedule(this.checkTime,1)
                })
                this.node.on(Node.EventType.TOUCH_END,()=>{
                    if(!this.mIsActive) return
                    if(!this.getIsFinish()){
                        this.mHoldTime = 0;
                        this.unschedule(this.checkTime)
                    }
                })
            break;
            case config.clcik_type.Multiple_clicks:
                this.node.on(Node.EventType.TOUCH_START,()=>{
                    if(!this.mIsActive) return
                    this.scheduleOnce(this.reSetClickNum,this.mClickTime);
                    this.mClickNum++;
                    if(this.mClickNum===this.mClickData.multiple_check_num){
                        this.mClickNum = 0;
                        this.unschedule(this.reSetClickNum)
                        this.exeFinish()
                    }
                })
            break;
            case config.clcik_type.click:
                this.node.off(Node.EventType.TOUCH_END)
                this.node.on(Node.EventType.TOUCH_END,()=>{
                    if(!this.mIsActive) return
                    this.exeFinish()
                })
            break;
            case config.clcik_type.click_not_auto_finish:
                this.node.off(Node.EventType.TOUCH_END)
                this.node.on(Node.EventType.TOUCH_END,()=>{
                    if(!this.mIsActive) return
                    ClientEvent.dispatchEvent(config.EventRun.WIDGET_FINISH,this.mData.att.id)
                })
            break;
        }
    }

    public exeFinish(){
        this.checkAddOtherWidgetFinishListenOperation()
    }

    private checkTime(){
        this.mHoldTime+=1;
        if(this.getIsFinish()){
            this.unschedule(this.checkTime)
            return
        }
        if(this.mClickData.hold_time<=this.mHoldTime){
            this.exeFinish()
            this.unschedule(this.checkTime)
            return
        }
    }

    private reSetClickNum(){
        this.mClickNum = 0;
    }
    public showZhaoButongFinishStatus(): void {
        gameManager.Singleton.sys_click_correct_detail_music()
        this.img_zhaobutong.active = true;
    }
    public hideZhaoButongFinishStatus(): void {
        if(this.img_zhaobutong != null) {
            this.img_zhaobutong.active = false;
        }
    }

    // 检查添加其他控件
    private checkAddOtherWidgetFinishListenOperation() {
        let onFinishEvent_cb = (()=>{
            this.checkOtherListenWidgetFinish(false)
            this.onFinishEvent()
        })

        if(this.checkOtherWidgetFinishListenListData()==false) {
            onFinishEvent_cb()
            return
        }

        // 是-直接执行自身
        if(this.mClickData.is_direct_execute_myself) { 
            // console.log('直接-执行自身')
            onFinishEvent_cb()
        } 
        // 否-直接执行自身
        else { 
            // 是-选择其一执行自身
            let finish_list = this.checkOtherListenWidgetFinish(true)
            // console.log('完成的控件列表=',finish_list)
            if(this.mClickData.is_select_anyone_execute_myself) {
                let is_execute_myself = false
                for (let index = 0; index < finish_list.length; index++) {
                    const element = finish_list[index];
                    if(element.is_execute_myself) {
                        is_execute_myself = true
                        break
                    }
                }
                if(is_execute_myself) {
                    // console.log('满足其中一个条件-执行自身')
                    onFinishEvent_cb()
                }
            } 
            // 否-选择其一执行自身
            else {
                // 控件全部完成
                if(finish_list.length==this.mClickData.other_widget_finish_listen_list.length) {
                    // console.log('控件全部完成-执行自身')
                    onFinishEvent_cb()
                    return
                }

                // 同时满足
                let execute_count = 0
                let have_count = 0
                for (let i = 0; i < this.mClickData.other_widget_finish_listen_list.length; i++) {
                    const i_element = this.mClickData.other_widget_finish_listen_list[i]
                    if(i_element.is_execute_myself) {
                        execute_count+=1
                        for (let j = 0; j < finish_list.length; j++) {
                            const j_element = finish_list[j];
                            if(i_element.widget_id==j_element.widget_id) {
                                have_count+=1
                            }
                        }
                    }
                }

                if(execute_count>0) {
                    if(execute_count==have_count) {
                        // console.log('同时满足条件-执行自身')
                        onFinishEvent_cb()
                        return
                    }
                }
            }

        }

        // 未完成控件,执行监控事件
        this.checkOtherListenWidgetFinish(false)
    }

    private checkOtherWidgetFinishListenListData():boolean {
        if(this.mClickData.other_widget_finish_listen_list==undefined){
            return false
        }
        if(this.mClickData.other_widget_finish_listen_list.length<=0){
            return false
        }
        return true
    }

    private checkOtherListenWidgetFinish(is_finish_status:boolean):other_widget_finish_listen_item[]{
        if(this.checkOtherWidgetFinishListenListData()==false) {
            return []
        }
        let list = gameManager.Singleton.checkWidgetList(this.mClickData.other_widget_finish_listen_list,is_finish_status)
        if(is_finish_status==false&&list.length>0) {
            // for (let index = 0; index < list.length; index++) {
            //     const event = list[index];
            //     gameManager.Singleton.exeEvent(event.event_id)
            // }
            // console.log('list=',list)
            // 未完成:其中有2,只执行2; 没有2,所有1执行; 没有2&&没有1,所有0执行;
            let hight_list:other_widget_finish_listen_item[] = []
            let middle_list:other_widget_finish_listen_item[] = []
            let normal_list:other_widget_finish_listen_item[] = []
            for (let index = 0; index < list.length; index++) {
                const event = list[index];
                if(event.grade>=2) {
                    hight_list.push(event)
                    break
                } else if(event.grade==1) {
                    middle_list.push(event)
                } else {
                    normal_list.push(event)
                }
            }

            let exeEvent_cb = ((item_list:other_widget_finish_listen_item[])=>{
                for (let index = 0; index < item_list.length; index++) {
                    const event = item_list[index];
                    gameManager.Singleton.exeEvent(event.event_id)
                }
            })

            if(hight_list.length>0) {
                middle_list = []
                normal_list = []
                exeEvent_cb(hight_list)
            } else {
                if(middle_list.length>0) {
                    normal_list = []
                    exeEvent_cb(middle_list)
                } else {
                    exeEvent_cb(normal_list)
                }
            }

        }
        return list;
    }
    
}


