import { _decorator, Component, Node, CanvasComponent, loader, SpriteFrame, systemEvent, sys, game, tween, AnimationComponent, LabelComponent, url } from "cc";
import { dataName, datakey } from "../Base/DataKey";
import { dataCtrl } from "../Ctrl/DataCtrl";
import { SystemDataCtrl } from "../Ctrl/SystemDataCtrl";
import MathUtils from "../Utils/MathUtils";
import { GameCamera } from "./GameCamera";
const { ccclass, property } = _decorator;

@ccclass("GameCanvas")
export class GameCanvas extends CanvasComponent {
    @property(AnimationComponent)
    private loading_res: AnimationComponent = null;
    @property(LabelComponent)
    private label_loadDesc: LabelComponent = null;
    private myCanvas;

    private _context;
    get context() {
        return this._context;
    }
    private static _instance: GameCanvas = null;
    static get instance(): GameCanvas {
        return this._instance;
    }
    onLoad() {
        GameCanvas._instance = this;
        this.myCanvas = document.createElement('canvas');
        this._context = this.myCanvas.getContext('2d');
    }

    start() {

    }
    //过场动画
    playLoadingRes() {
        this.loading_res.play("loadingRes");
        this.randomeDes();
    }
    //关闭过场动画
    closeLoadingRes() {
        this.loading_res.stop();
        this.loading_res.node.active = false;
    }
    //随机文字
    randomeDes() {
        if (SystemDataCtrl.getloadSceneDialog() == null) return;
        let ids:[] = SystemDataCtrl.getloadSceneDialog();
        let index = MathUtils.getRandomInt(0, ids.length - 1);
        let id = SystemDataCtrl.getloadSceneDialog()[index];
        let data = dataCtrl.getJsonData(dataName.dialog, id);
        this.label_loadDesc.string = data[datakey.dialog.text];
        this.scheduleOnce(() => {
            this.randomeDes();
        }, 3);
    }

    //获取指定图片文件的像素数据。返回Promise
    //path写到文件名就行，不需要加spriteFrame和后缀
    loadImagePixelData(path: string) {
        var self = this
        return new Promise((resolve, reject) => {
            loader.loadRes(path + "/spriteFrame", SpriteFrame, (err, res) => {
                if (err) {
                    console.error(err)
                    return reject();
                }
                var spriteFrame = <SpriteFrame>res;
                let img = new Image();
                if (loader.md5Pipe) {
                    img.src = loader.md5Pipe.transformURL(spriteFrame.texture.image.nativeUrl);
                } else {
                    img.src = spriteFrame.texture.image.nativeUrl;
                }
                //原生平台使用jsb方法
                if (sys.isNative) {
                    sys.jsb.loadImage(url, (info) => {
                        if (info) {
                            // let width = info.width;
                            // let data = info.data;
                            // // for pixel at x, y
                            // let offset = (width * y + x) * 4;
                            // let r = data[offset];
                            // let g = data[offset+1];
                            // let b = data[offset+2];
                            // let a = data[offset+3];
                            console.log("load image succ!data=", info);
                            resolve(info);
                        }
                    });
                } else {
                    img.onload = () => {
                        self.myCanvas.width = img.width;
                        self.myCanvas.height = img.height;
                        self.context.drawImage(img, 0, 0, img.width, img.height);
                        let imageData = self.context.getImageData(0, 0, img.width, img.height);
                        resolve(imageData);
                    }
                    img.onerror = () => {
                        reject("Error:load img failed!Path=" + path);
                    }
                }
            })
        });
    }

    // update (deltaTime: number) {
    //     // Your update function goes here.
    // }
}
