<template>
    <div :class="['flex flex-col', wrapperClass]">
        <label
            v-if="label"
            :for="id"
            class="font-bold uppercase text-xl text-primary-700"
            :class="labelClass"
        >
            {{ label }}
        </label>
        <input
            :id="id"
            type="text"
            :value="modelValue ?? ''"
            :placeholder="placeholder"
            :maxlength="maxlength"
            :disabled="disabled"
            v-bind="attrs"
            class="w-full min-w-0 border-b border-primary-700 bg-transparent"
            :class="[
                sizeClass,
                isEmpty ? 'text-neutral-400' : 'text-primary-700',
                disabled ? 'cursor-not-allowed' : 'cursor-text',
                inputClass
            ]"
            @input="onInput"
        >
    </div>
</template>

<script setup lang="ts">
import { computed, useAttrs } from 'vue'

defineOptions({ inheritAttrs: false })

const props = withDefaults(
    defineProps<{
        id?: string
        label?: string
        modelValue: string | null | undefined
        placeholder?: string
        maxlength?: number | string
        disabled?: boolean
        size?: 'default' | 'compact'
        wrapperClass?: string
        labelClass?: string
        inputClass?: string
    }>(),
    {
        placeholder: '',
        maxlength: undefined,
        disabled: false,
        size: 'default',
        wrapperClass: '',
        labelClass: '',
        inputClass: ''
    }
)

const emit = defineEmits<{
    (event: 'update:modelValue', value: string): void
}>()

const attrs = useAttrs()
const isEmpty = computed(() => !props.modelValue)
const sizeClass = computed(() =>
    props.size === 'compact'
        ? 'text-sm h-8 font-normal normal-case tracking-normal'
        : 'text-xl py-[6px]'
)

const onInput = (event: Event) => {
    const target = event.target as HTMLInputElement
    emit('update:modelValue', target.value)
}
</script>
