<template>
    <button
        v-if="unref(visibility) !== Visibility.None"
        :class="{ feature: true, tile: true, can: unref(canClick), locked: !unref(canClick) }"
        :style="[
            {
                visibility: unref(visibility) === Visibility.Hidden ? 'hidden' : undefined
            },
            unref(style) ?? {}
        ]"
        @click="onClick"
        @mousedown="start"
        @mouseleave="stop"
        @mouseup="stop"
        @touchstart="start"
        @touchend="stop"
        @touchcancel="stop"
    >
        <div v-if="title"><component :is="titleComponent" /></div>
        <component :is="component" style="white-space: pre-line" />
        <Node :id="id" />
    </button>
</template>

<script lang="ts">
import "components/common/features.css";
import Node from "components/Node.vue";
import { CoercableComponent, StyleValue, Visibility } from "features/feature";
import {
    computeComponent,
    computeOptionalComponent,
    processedPropType,
    setupHoldToClick
} from "util/vue";
import { defineComponent, PropType, toRefs, unref } from "vue";

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

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

        const titleComponent = computeOptionalComponent(title);
        const component = computeComponent(display);

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

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