<template>
    <button
        v-if="visibility !== Visibility.None"
        v-show="visibility === Visibility.Visible"
        :class="{ feature: true, tile: true, can: canClick, locked: !canClick }"
        :style="style"
        @click="onClick"
        @mousedown="start"
        @mouseleave="stop"
        @mouseup="stop"
        @touchstart="start"
        @touchend="stop"
        @touchcancel="stop"
        :disabled="!canClick"
    >
        <div v-if="title"><component :is="titleComponent" /></div>
        <component :is="component" style="white-space: pre-line" />
        <LinkNode :id="id" />
    </button>
</template>

<script lang="ts">
import { CoercableComponent, StyleValue, Visibility } from "@/features/feature";
import { coerceComponent, setupHoldToClick } from "@/util/vue";
import { computed, defineComponent, PropType, toRefs, unref } from "vue";
import LinkNode from "../system/LinkNode.vue";

export default defineComponent({
    props: {
        visibility: {
            type: Object as PropType<Visibility>,
            required: true
        },
        onClick: Function as PropType<VoidFunction>,
        onHold: Function as PropType<VoidFunction>,
        display: {
            type: [Object, String] as PropType<CoercableComponent>,
            required: true
        },
        title: [Object, String] as PropType<CoercableComponent>,
        style: Object as PropType<StyleValue>,
        canClick: {
            type: Boolean,
            required: true
        },
        id: {
            type: String,
            required: true
        }
    },
    setup(props) {
        const { onClick, onHold, title, display } = toRefs(props);

        const { start, stop } = setupHoldToClick(onClick, onHold);

        const titleComponent = computed(() => {
            const currTitle = unref(title);
            return currTitle && coerceComponent(currTitle);
        });
        const component = computed(() => coerceComponent(unref(display)));

        return {
            start,
            stop,
            titleComponent,
            component,
            Visibility,
            LinkNode
        };
    }
});
</script>

<style scoped>
.tile {
    min-height: 80px;
    width: 80px;
    font-size: 10px;
    background-color: var(--layer-color);
}
</style>