export default class Tetromino {

    static types = {
        'I': 0,
        'O': 1,
        'T': 2,
        'S': 3,
        'Z': 4,
        'J': 5,
        'L': 6,
    };

    static shapes = {
        0: [
            [1, 1, 1, 1]
        ],
        1: [
            [1, 1],
            [1, 1]
        ],
        2: [
            [0, 1, 0],
            [1, 1, 1],
        ],
        3: [
            [0, 1, 1],
            [1, 1, 0],
        ],
        4: [
            [1, 1, 0],
            [0, 1, 1],
        ],
        5: [
            [1, 0, 0],
            [1, 1, 1],
        ],
        6: [
            [0, 0, 1],
            [1, 1, 1],
        ],
    };

    static colors: Object;

    currentType: Object;
    currentShape: Object;
    currentRotation: number;
    position: Object;
    colors: Object;

    constructor(type: Tetromino.types, colors: Object) {
        this.currentType = type;
        this.currentShape = Tetromino.shapes[type];
        this.currentRotation = 0;
        this.position = {x: 0, y: 0};
        if (this.currentType === Tetromino.types.O)
            this.position.x = 4;
        else
            this.position.x = 3;
        this.colors = colors;
        Tetromino.colors = {
            0: colors.tetrisI,
            1: colors.tetrisO,
            2: colors.tetrisT,
            3: colors.tetrisS,
            4: colors.tetrisZ,
            5: colors.tetrisJ,
            6: colors.tetrisL,
        };
    }

    getColor() {
        return Tetromino.colors[this.currentType];
    }

    getCellsCoordinates() {
        let coordinates = [];
        for (let row = 0; row < this.currentShape.length; row++) {
            for (let col = 0; col < this.currentShape[row].length; col++) {
                if (this.currentShape[row][col] === 1)
                    coordinates.push({x: this.position.x + col, y: this.position.y + row});
            }
        }
        return coordinates;
    }

    rotate(isForward) {
        this.currentRotation++;
        if (this.currentRotation > 3)
            this.currentRotation = 0;

        if (this.currentRotation === 0) {
            this.currentShape = Tetromino.shapes[this.currentType];
        } else {
            let result = [];
            for(let i = 0; i < this.currentShape[0].length; i++) {
                let row = this.currentShape.map(e => e[i]);

                if (isForward)
                    result.push(row.reverse());
                else
                    result.push(row);
            }
            this.currentShape = result;
        }

    }

    move(x: number, y: number) {
        this.position.x += x;
        this.position.y += y;
    }

}