import { Text, Graphics, Container, TextStyle, NineSlicePlane, Texture } from "pixi.js";

interface IOpts {
    text: string;
    bg: string;
    pressBg: string;
    position: null | any;
    click(): void;
}

const defaultOpts: IOpts = {
    text: "",
    bg: "",
    position: null,
    pressBg: "",
    click() { },
};

function getConfig() {
    return Object.assign({}, defaultOpts)
}

export default function Button(opts: Partial<IOpts>) {
    let curOpts: IOpts = getConfig();
    ; (Object.keys(defaultOpts) as (keyof IOpts)[]).forEach((key) => {
        if (opts[key] != undefined) {
            curOpts[key] = opts[key] as any;
        }
    });

    let textStyle = new TextStyle({
        fontFamily: "Arial",
        fontSize: 30,
        fill: 0xffffff,
        align: "center",
    });
    let textStr = new Text(curOpts.text, textStyle);
    let xPadding = 60;
    let yPadding = 40;

    let button = new Container();
    let width = textStr.width + xPadding;
    let height = textStr.height + yPadding;
    // https://www.cnblogs.com/ningmin/p/11412170.html
    // https://blog.csdn.net/weixin_52919504/article/details/131854745
    // https://blog.csdn.net/weixin_52919504/article/details/131854745
    button.pivot.set(width / 2, height / 2)

    textStr.x = xPadding / 2;
    textStr.y = yPadding / 2 - 2;

    if (!curOpts.bg) {
        const rect = new Graphics();
        rect.name = "rect";
        rect.beginFill(0xff0000);
        rect.drawRect(0, 0, width, height);
        rect.endFill();
        rect.interactive = true;
        rect.buttonMode = true;
        button.addChild(rect);
    } else {
        const plane9 = new NineSlicePlane(Texture.from(curOpts.bg), 10, 10, 10, 10);
        plane9.name = "nine-pic"
        plane9.width = width
        plane9.height = height
        plane9.interactive = true;
        plane9.buttonMode = true;
        button.addChild(plane9);
    }
    button.addChild(textStr);
    button.interactive = true;
    if(curOpts.position) {
        button.position = curOpts.position
    }
    button.on("touchstart", () => {
        if (curOpts.pressBg) {
            button.getChildByName<NineSlicePlane>("nine-pic").texture = Texture.from(curOpts.pressBg)
        } else {
            button.alpha = 0.8;
            button.scale = { x: .8, y: .8 }
        }
    });
    button.on("touchend", () => {
        // 点击成功
        console.log("touchend success");
        if (curOpts.pressBg) {
            button.getChildByName<NineSlicePlane>("nine-pic").texture = Texture.from(curOpts.bg)
        } else {
            button.alpha = 1;
            button.scale = { x: 1, y: 1 }
        }
        curOpts.click();
    });
    button.on("touchendoutside", () => {
        console.log("touchendoutside success");
        if (curOpts.pressBg) {
            button.getChildByName<NineSlicePlane>("nine-pic").texture = Texture.from(curOpts.bg)
        } else {
            button.alpha = 1;
            button.scale = { x: 1, y: 1 }
        }
    });
    return button;
}