<template>
    <div v-if="filteredClickables" class="table">
        <master-button v-if="showMaster" style="margin-bottom: 12px;" @press="press" />
        <template v-if="filteredClickables.rows && filteredClickables.cols">
            <div v-for="row in filteredClickables.rows" class="row" :key="row">
                <div v-for="col in filteredClickables.cols" :key="col">
                    <clickable
                        v-if="filteredClickables[row * 10 + col] !== undefined"
                        class="align clickable-container"
                        :style="{ height }"
                        :id="row * 10 + col"
                        :size="height === 'inherit' ? null : height"
                    />
                </div>
            </div>
        </template>
        <row v-else>
            <clickable
                v-for="(clickable, id) in filteredClickables"
                :key="id"
                class="align clickable-container"
                :style="{ height }"
                :id="id"
                :size="height === 'inherit' ? null : height"
            />
        </row>
    </div>
</template>

<script lang="ts">
import { Clickable } from "@/typings/features/clickable";
import { defineComponent, PropType } from "vue";
import { layers } from "@/game/layers";
import { getFiltered, InjectLayerMixin } from "@/util/vue";

export default defineComponent({
    name: "clickables",
    mixins: [InjectLayerMixin],
    props: {
        achievements: {
            type: Object as PropType<Array<string>>
        },
        showMasterButton: {
            type: Boolean,
            default: null
        },
        height: {
            type: [Number, String],
            default: "inherit"
        }
    },
    computed: {
        filteredClickables(): Record<string, Clickable> {
            return getFiltered(layers[this.layer].clickables!.data, this.clickables);
        },
        showMaster(): boolean | undefined {
            if (layers[this.layer].clickables?.masterButtonClick == undefined) {
                return false;
            }
            if (this.showMasterButton != undefined) {
                return this.showMasterButton;
            }
            return layers[this.layer].clickables?.showMasterButton;
        }
    },
    methods: {
        press() {
            layers[this.layer].clickables?.masterButtonClick?.();
        }
    }
});
</script>

<style scoped>
.clickable-container {
    margin-left: 7px;
    margin-right: 7px;
}
</style>