import { asyncDelay, onHomeworkFinish } from "../script/util";
import { MyCocosSceneComponent } from "../script/MyCocosSceneComponent";
import shop from "./model/shop";
import pg from "./pg";
import Api from "./net/api";
import user from "./model/user";
import Item from "./model/item";
import kitchen from "./model/kitchen";
import { ITEM_TYPE } from "./config/config";

const { ccclass, property } = cc._decorator;

@ccclass
export default class SceneComponent extends MyCocosSceneComponent {
    @property(cc.SpriteFrame)
    icon_1: cc.SpriteFrame = null;
    @property(cc.SpriteFrame)
    icon_2: cc.SpriteFrame = null;
    @property(cc.SpriteFrame)
    icon_3: cc.SpriteFrame = null;
    @property(cc.SpriteFrame)
    icon_4: cc.SpriteFrame = null;
    @property(cc.SpriteFrame)
    icon_5: cc.SpriteFrame = null;
    @property(cc.SpriteFrame)
    icon_6: cc.SpriteFrame = null;
    @property(cc.SpriteFrame)
    icon_7: cc.SpriteFrame = null;
    @property(cc.SpriteFrame)
    icon_8: cc.SpriteFrame = null;


    addPreloadImage() {
        // TODO 根据自己的配置预加载图片资源
        this._imageResList.push({ url: this.data.pic_url });
        this._imageResList.push({ url: this.data.pic_url_2 });
    }

    addPreloadAudio() {
        // TODO 根据自己的配置预加载音频资源
        this._audioResList.push({ url: this.data.audio_url });
    }

    addPreloadAnima() {

    }

    onLoadEnd() {
        this.initGame();
        // TODO 加载完成后的逻辑写在这里, 下面的代码仅供参考
        Api.askUser().then(() => {
            this.initData();
            this.initView();
            this.initEvent();
            this.initTipSys();
        })
    }
    initGame() {
        //基础效果 需要隐藏的内容处理。  首屏展示
    }
    _cantouch = null;

    initData() {
        // 所有全局变量 默认都是null
        this._cantouch = true;
    }

    private home: cc.Node;
    private kitchen: cc.Node;
    private shop: cc.Node;
    initView() {
        this.home = pg.view.find(this, "home");
        this.kitchen = pg.view.find(this, "kitchen");
        this.shop = pg.view.find(this, "shop");
        this.elephant = pg.view.find(this.home, "elephant");

        this.elephentState(0);
    }

    initEvent() {
        pg.view.touchOn(pg.view.find(this.home, "btn_kitchen"), this.onTouchKitchen, this);
        pg.view.touchOn(pg.view.find(this, "kitchen/btn_close"), this.onTouchKitchenClose, this);
        pg.view.touchOn(pg.view.find(this.home, "btn_shop"), this.onTouchShop, this);
        pg.view.touchOn(pg.view.find(this, "shop/btn_close"), this.onTouchShopClose, this);
        pg.view.touchOn(pg.view.find(this.elephant, "walk"), this.onTouchElephent, this);
        pg.view.touchOn(pg.view.find(this.elephant, "panel_info/btn_close"), this.onTouchPanel, this);
    }

    //----------------------------商店部分--------------------------------------
    //商店按钮
    private shopType = 0;
    onTouchShop() {
        this.shop.active = true;

        this.updateShopCoin();

        let btns = pg.view.find(this.shop, "btns");
        let btn_food_wait = pg.view.find(btns, "btn_food_wait");
        let btn_house_wait = pg.view.find(btns, "btn_house_wait");
        let btn_clothes_wait = pg.view.find(btns, "btn_clothes_wait");
        pg.view.touchOn(btn_food_wait, this.onTouchShopFood, this);
        pg.view.touchOn(btn_house_wait, this.onTouchShopHouse, this);
        pg.view.touchOn(btn_clothes_wait, this.onTouchShopClothes, this);

        this.shopType = ITEM_TYPE.FOOD;
        this.updateShopList();
        this.updateShopBtns();

    }
    onTouchShopClose() {
        this.shop.active = false;
    }
    onTouchShopFood() {
        this.shopType = ITEM_TYPE.FOOD;
        this.updateShopList();
        this.updateShopBtns();
    }
    onTouchShopHouse() {
        this.openTipEmpty(() => {
            this.closeTipEmpty();
        })
        // this.shopType = ITEM_TYPE.HOUSE;
        // this.updateShopList();
        // this.updateShopBtns();
    }
    onTouchShopClothes() {
        this.openTipEmpty(() => {
            this.closeTipEmpty();
        })
        // this.shopType = ITEM_TYPE.CLOTHES;
        // this.updateShopList();
        // this.updateShopBtns();
    }
    updateShopCoin() {
        let coin = pg.view.find(this.shop, "coin/num");
        pg.view.setString(coin, user.coin);
    }
    updateShopList() {
        let scroll = pg.view.find(this.shop, "scrollview");
        let svt = scroll.getComponent("svt");
        let list = kitchen.getListByType(this.shopType);
        svt.list = list;
        svt.updateItem = this.updateShopItems;
        svt.target = this;
        svt.addNum = 4;
        svt.flush();
    }
    updateShopBtns() {
        let btns = pg.view.find(this.shop, "btns");
        let btn_food_wait = pg.view.find(btns, "btn_food_wait");
        let btn_food_active = pg.view.find(btns, "btn_food_active");
        let btn_house_wait = pg.view.find(btns, "btn_house_wait");
        let btn_house_active = pg.view.find(btns, "btn_house_active");
        let btn_clothes_wait = pg.view.find(btns, "btn_clothes_wait");
        let btn_clothes_active = pg.view.find(btns, "btn_clothes_active");
        btn_food_wait.active = this.shopType != ITEM_TYPE.FOOD;
        btn_food_active.active = this.shopType == ITEM_TYPE.FOOD;
        btn_house_wait.active = this.shopType != ITEM_TYPE.HOUSE;
        btn_house_active.active = this.shopType == ITEM_TYPE.HOUSE;
        btn_clothes_wait.active = this.shopType != ITEM_TYPE.CLOTHES;
        btn_clothes_active.active = this.shopType == ITEM_TYPE.CLOTHES;
    }
    updateShopItems(item, datas) {
        item.children.forEach(it => it.active = false);
        for (let i = 0; i < datas.length; i++) {
            let it = item.children[i];
            let dt = datas[i];
            this.updateShopItem(it, dt);
        }
    }
    updateShopItem(item, data: Item) {
        item.active = true;
        let growth = pg.view.find(item, "growth");
        let txt = pg.view.find(item, "txt");
        let name = pg.view.find(item, "name");
        let icon = pg.view.find(item, "icon");
        let discount = pg.view.find(item, "discount");
        let btn_buy = pg.view.find(item, "btn_buy");


        pg.view.setString(txt, `可增加        个成长值`)
        pg.view.setString(growth, data.growthValue)
        pg.view.setString(name, data.name)
        icon.getComponent(cc.Sprite).spriteFrame = this[data.icon];

        let dis = Math.round((1 - data.discount) * 100);
        if (dis > 0) {
            pg.view.setString(discount, `${dis}%`)
            pg.view.visible(pg.view.find(item, "bg_sale"), true);
            pg.view.visible(pg.view.find(item, "discount"), true);
        } else {
            pg.view.visible(pg.view.find(item, "bg_sale"), false);
            pg.view.visible(pg.view.find(item, "discount"), false);
        }

        pg.view.setString(pg.view.find(btn_buy, "num"), data.cost)
        pg.view.touchOn(btn_buy, this.onTouchShopItem, this);
        item.data = data;
    }
    onTouchShopItem(e) {
        let item = e.target.parent;
        let data: Item = item.data;
        if (data.type == 1) {
            //弹出购买弹窗

            if (user.coin >= data.cost * data.discount) {
                this.openTipNormal(data, () => {
                    this.buy(data);
                    this.closeTipNormal();
                }, () => {
                    this.closeTipNormal();
                })
            } else {
                this.openTipFail(data, () => {
                    this.closeTipFail();
                }, () => {
                    this.closeTipFail();
                })
            }
        } else if (data.type == 2) {
            //物品已购买
            if (data.num >= 0) return;
        } else if (data.type == 3) {
            //物品已购买
            if (data.num >= 0) return;
        }
    }
    buy(data) {
        Api.askBuyItem(data).then(() => {
            this.updateShopCoin();
            this.openTipBuy(data, () => {
                this.closeTipBuy();
            })
        })
    }
    //----------------------------冰箱部分--------------------------------------
    onTouchKitchen() {
        this.kitchen.active = true;
        let coin = pg.view.find(this.kitchen, "coin/num");
        pg.view.setString(coin, user.coin);

        let scroll = pg.view.find(this.kitchen, "scrollview");
        let svt = scroll.getComponent("svt");
        svt.list = kitchen.list;
        svt.updateItem = this.updateChickenItems;
        svt.target = this;
        svt.addNum = 4;
        svt.flush();
    }
    onTouchKitchenClose() {
        this.kitchen.active = false;
    }
    updateChickenItems(item, datas) {
        item.children.forEach(it => it.active = false);
        for (let i = 0; i < datas.length; i++) {
            let it = item.children[i];
            let dt = datas[i];
            this.updateChickenItem(it, dt);
        }
    }
    updateChickenItem(item, data: Item) {
        item.active = true;
        let growth = pg.view.find(item, "growth");
        let name = pg.view.find(item, "name");
        let icon = pg.view.find(item, "icon");
        let num = pg.view.find(item, "num");
        pg.view.setString(growth, `成长值+${data.growthValue}`)
        pg.view.setString(name, data.name)
        pg.view.setString(num, data.num)
        icon.getComponent(cc.Sprite).spriteFrame = this[data.icon];
        pg.view.touchOn(item, this.onTouchChickenItem, this);
        item.data = data;
    }
    onTouchChickenItem(e) {
        let item = e.target;
        let data: Item = item.data;
        //吃东西。  关闭界面，并展示吃东西的画面，如果不足的情况提示不足。
        if (data.num <= 0) return;
        if (data.type == 1) {
            this.eating(data);
        } else if (data.type == 2) {
            //物品使用
        }
    }
    eating(data) {
        Api.askUseItem(data).then(() => {
            this.elephentState(3);
            this.onTouchKitchenClose();
        })
        //可以检测是否升级等---升级说明之类的
    }


    //----------------------------主界面部分--------------------------------------
    //打开提示面板
    onTouchElephent() {
        this.elephentState(user.mood == 0 ? 1 : 2);

        let panel_info = pg.view.find(this.elephant, "panel_info");
        panel_info.active = true;
        //刷新内容
        let label_name = pg.view.find(panel_info, "label_name");
        pg.view.setString(label_name, user.name);
        let label_level = pg.view.find(panel_info, "label_level");
        pg.view.setString(label_level, `LV.${user.level}`);

        let icon_happy = pg.view.find(panel_info, "icon_happy");
        let icon_hungry = pg.view.find(panel_info, "icon_hungry");
        icon_happy.active = user.mood == 0;
        icon_hungry.active = user.mood == 1;

        let percent = user.growth / user.growthLevel;
        let progress = pg.view.find(panel_info, "progress");
        progress.getComponent(cc.ProgressBar).progress = percent;
    }
    //关闭提示面板
    onTouchPanel() {
        let panel_info = pg.view.find(this.elephant, "panel_info");
        panel_info.active = false;
        this.elephentState(0);
    }
    //小象的动作管理。
    private elephant: cc.Node;
    private _timer: number;
    elephentState(state) {
        switch (state) {
            case 0:
                this.elephantWalk();
                break;
            case 1:
                this.elephantHappy();
                break;
            case 2:
                this.elephantHungry();
                break;
            case 3:
                this.elephantEating();
                break;
        }
    }
    elephantWalk() {
        let walkAni = pg.view.find(this.elephant, "walk");
        let eatAni = pg.view.find(this.elephant, "eat");
        walkAni.active = true;
        eatAni.active = false;
        let db = pg.view.playDBAnimation(walkAni, "walking", 0);
        this.removeHungryAudio(db);
        cc.Tween.stopAllByTarget(this.elephant);
        walkAni.scaleX = 1;
        let moveX = 400;
        let moveY = 0;
        let winSize = cc.winSize;
        if (winSize.width / winSize.height < 16 / 9) {
            moveY = -(16 / 9 - winSize.width / winSize.height) * 750 / 2;
        }
        if (!this.elephant.active) {
            this.elephant.active = true;
            this.elephant.x = 0;
            this.elephant.y = moveY + Math.random() * 100;
        }
        cc.tween(this.elephant)
            .to(4, { x: moveX, y: moveY + Math.random() * 100 })
            .call(() => {
                walkAni.scaleX = -1;
            })
            .to(4, { x: 0, y: moveY + Math.random() * 100 })
            .to(4, { x: -moveX, y: moveY + Math.random() * 100 })
            .call(() => {
                walkAni.scaleX = 1;
            })
            .to(4, { x: 0, y: moveY + Math.random() * 100 })
            .call(() => {
                this.elephentState(0);
            })
            .start();
    }
    elephantHappy() {
        let walkAni = pg.view.find(this.elephant, "walk");
        let eatAni = pg.view.find(this.elephant, "eat");
        walkAni.active = true;
        eatAni.active = false;
        let db = pg.view.playDBAnimation(walkAni, "happy", 0);
        this.removeHungryAudio(db);
        cc.Tween.stopAllByTarget(this.elephant);
        walkAni.scaleX = 1;
    }
    elephantHungry() {
        let walkAni = pg.view.find(this.elephant, "walk");
        let eatAni = pg.view.find(this.elephant, "eat");
        walkAni.active = true;
        eatAni.active = false;
        this.playLocalAudio("hungry");
        let db: dragonBones.ArmatureDisplay = pg.view.playDBAnimation(walkAni, "hungry", 0);
        this.removeHungryAudio(db);
        this.addHungryAudio(db);
        cc.Tween.stopAllByTarget(this.elephant);
        walkAni.scaleX = 1;
    }
    elephantEating() {
        let walkAni = pg.view.find(this.elephant, "walk");
        let eatAni = pg.view.find(this.elephant, "eat");
        walkAni.active = false;
        eatAni.active = true;
        pg.view.playDBAnimation(eatAni, "eating", 0);
        cc.Tween.stopAllByTarget(this.elephant);
        this.playLocalAudio("eating");
        setTimeout(() => {
            this.elephentState(0);
        }, 3500);
    }

    addHungryAudio(db: dragonBones.ArmatureDisplay) {
        db.addEventListener(dragonBones.EventObject.LOOP_COMPLETE, this.playHungryAudio, this)
    }
    removeHungryAudio(db: dragonBones.ArmatureDisplay) {
        db.removeEventListener(dragonBones.EventObject.LOOP_COMPLETE, this.playHungryAudio, this)
    }
    playHungryAudio() {
        this.playLocalAudio("hungry");
    }



    //-----------------------------提示面板部分-----------------------------------------
    private tip_normal: cc.Node;
    private tip_buy: cc.Node;
    private tip_fail: cc.Node;
    private tip_empty: cc.Node;
    private tipSuccess: Function;
    private tipCancel: Function;
    private tipBuySuccess: Function;
    private tipFailSuccess: Function;
    private tipFailCancel: Function;
    private tipEmptySuccess: Function;
    initTipSys() {
        this.tip_normal = pg.view.find(this, "tip_normal");
        this.tip_buy = pg.view.find(this, "tip_buy");
        this.tip_fail = pg.view.find(this, "tip_fail");
        this.tip_empty = pg.view.find(this, "tip_empty");
        pg.view.touchOn(pg.view.find(this.tip_normal, "btn_sure"), () => { this.tipSuccess && this.tipSuccess() }, this);
        pg.view.touchOn(pg.view.find(this.tip_normal, "btn_cancel"), () => { this.tipCancel && this.tipCancel() }, this);
        pg.view.touchOn(pg.view.find(this.tip_buy, "btn_cancel"), () => { this.tipBuySuccess && this.tipBuySuccess() }, this);
        pg.view.touchOn(pg.view.find(this.tip_fail, "btn_sure"), () => { this.tipFailSuccess && this.tipFailSuccess() }, this);
        pg.view.touchOn(pg.view.find(this.tip_fail, "btn_cancel"), () => { this.tipFailCancel && this.tipFailCancel() }, this);
        pg.view.touchOn(pg.view.find(this.tip_empty, "btn_cancel"), () => { this.tipEmptySuccess && this.tipEmptySuccess() }, this);
    }
    openTipNormal(data: Item, success, cancel) {
        this.tip_normal.active = true;
        this.tipSuccess = success;
        this.tipCancel = cancel;
        if (data) {
            pg.view.setString(pg.view.find(this.tip_normal, "desc"), `确定花${data.cost * data.discount}金币购买${data.name}吗？`);
            let icon = pg.view.find(this.tip_normal, "icon");
            icon.getComponent(cc.Sprite).spriteFrame = this[data.icon];
        }
    }
    closeTipNormal() {
        this.tip_normal.active = false;
        this.tipSuccess = null;
        this.tipCancel = null;
    }
    openTipFail(data: Item, success, cancel) {
        this.tip_fail.active = true;
        this.tipFailSuccess = success;
        this.tipFailCancel = cancel;
    }
    closeTipFail() {
        this.tip_fail.active = false;
        this.tipFailSuccess = null;
        this.tipFailCancel = null;
    }

    openTipBuy(data: Item, success) {
        this.tip_buy.active = true;
        this.tipBuySuccess = success;
        if (data) {
            let icon = pg.view.find(this.tip_normal, "icon");
            icon.getComponent(cc.Sprite).spriteFrame = this[data.icon];
        }
    }
    closeTipBuy() {
        this.tip_buy.active = false;
        this.tipBuySuccess = null;
    }

    openTipEmpty(success) {
        this.tip_empty.active = true;
        this.tipEmptySuccess = success;
    }
    closeTipEmpty() {
        this.tip_empty.active = false;
    }





    initBg() {
        const bgNode = cc.find('Canvas/bg');
        bgNode.scale = this._mapScaleMax;
    }
    playLocalAudio(audioName) {
        const audio = cc.find(`Canvas/res/audio/${audioName}`).getComponent(cc.AudioSource);
        return new Promise((resolve, reject) => {
            const id = cc.audioEngine.playEffect(audio.clip, false);
            cc.audioEngine.setFinishCallback(id, () => {
                resolve(id);
            });
        })
    }
}



//未完成功能。
//1.商城购买流程。  不足提示框
//2.商城切换流程。  空提示框
//3.物品使用http请求。

//未确定功能
// 1.所有的家具使用
// 2.所有的衣服使用

