<!--
  DurationField — durée estimée d'un job (persiste duration_h via roster.updateJob).
  Module RÉUTILISABLE extrait du volet jobDetail. Autonome : écrit directement au hub, émet `updated` (le board
  peut alors rafraîchir son override d'optimisation / ré-optimiser dans son handler ; le détail ticket ignore).
-->
<template>
  <div class="jd-dur row items-center q-gutter-sm q-my-sm">
    <q-icon name="timer" size="16px" color="grey-6" /><span class="text-caption text-grey-7">Durée estimée</span>
    <q-input dense outlined type="number" step="0.25" min="0" v-model.number="local" style="width:96px" suffix="h"
      :loading="busy" @change="save" @keyup.enter="save" />
    <span class="text-caption text-grey-5">≈ {{ fmtMin(Math.round((local || 0) * 60)) }}</span>
  </div>
</template>

<script setup>
import { ref, watch } from 'vue'
import { Notify } from 'quasar'
import * as roster from 'src/api/roster'

// Durée lisible (source unique locale — fmtMin n'est pas dans useFormatters).
const fmtMin = (m) => { m = Math.round(Number(m) || 0); const h = Math.floor(m / 60), mm = m % 60; return h ? (h + 'h' + (mm ? String(mm).padStart(2, '0') : '')) : (mm + 'min') }

const props = defineProps({
  name: { type: String, default: '' }, // docname du Dispatch Job
  durH: { type: Number, default: 1 },
})
const emit = defineEmits(['updated'])

const local = ref(props.durH)
const busy = ref(false)
watch(() => props.durH, v => { local.value = v })

async function save () {
  const h = Math.round((Number(local.value) || 0) * 100) / 100
  if (h <= 0 || !props.name) return
  busy.value = true
  try {
    await roster.updateJob(props.name, { duration_h: h })
    emit('updated', { duration_h: h }) // le board persiste son override / ré-optimise ; le ticket ignore
  } catch (e) {
    Notify.create({ type: 'negative', message: 'Durée non enregistrée : ' + (e && e.message), timeout: 3000 })
  } finally { busy.value = false }
}
</script>
