<template>
  <MaintenanceTile
    icon="mdi-tune"
    title="Suggestion thresholds"
    blurb="Confidence cutoffs that gate auto-suggested tags + video sampling."
  >
    <div v-if="store.settings">
      <v-row v-for="f in fields" :key="f.key">
        <v-col cols="12">
          <v-slider
            v-model="local[f.key]" :label="f.label"
            :min="f.floorMin ? local.tagger_store_floor : 0" max="1" step="0.05"
            thumb-label hide-details
            color="accent" @end="save"
          />
        </v-col>
      </v-row>

      <v-divider class="my-4" />

      <v-row>
        <v-col cols="12">
          <v-slider
            v-model="local.tagger_store_floor" label="Tagger store floor"
            min="0" max="1" step="0.05" thumb-label hide-details
            color="accent" @end="save"
          />
          <div class="text-caption fc-muted mt-1">
            Tagger predictions below this confidence aren't stored — raising it
            keeps the image library lean. Suggestions can't be shown below the
            floor; lower-confidence tags you actually want still surface through
            the learned centroid path.
          </div>
        </v-col>
      </v-row>

      <v-divider class="my-4" />

      <div class="text-subtitle-2 mb-1">Video tagging</div>
      <div class="text-caption fc-muted mb-3">
        Videos are tagged by sampling frames at a fixed cadence. A tag is kept
        only if it shows up in enough frames (≈ that many × the interval in
        seconds of screen time), which filters one-frame noise without losing
        tags that only appear in part of a longer video.
      </div>
      <v-row>
        <v-col cols="12" sm="4">
          <v-text-field
            v-model.number="local.video_frame_interval_seconds"
            label="Frame interval (s)" type="number" min="0.5" step="0.5"
            density="comfortable" hide-details @change="save"
          />
        </v-col>
        <v-col cols="12" sm="4">
          <v-text-field
            v-model.number="local.video_max_frames"
            label="Max frames" type="number" min="1" step="1"
            density="comfortable" hide-details @change="save"
          />
        </v-col>
        <v-col cols="12" sm="4">
          <v-text-field
            v-model.number="local.video_min_tag_frames"
            label="Min frames per tag" type="number" min="1" step="1"
            density="comfortable" hide-details @change="save"
          />
        </v-col>
      </v-row>
    </div>
    <div v-else><v-skeleton-loader type="paragraph" /></div>
  </MaintenanceTile>
</template>

<script setup>
import { toast } from '../../utils/toast.js'
import { reactive, watch } from 'vue'
import { useMLStore } from '../../stores/ml.js'
import MaintenanceTile from '../common/MaintenanceTile.vue'

const store = useMLStore()
// 'artist' (FC-2d-vii-c) and 'copyright' (2026-06-01) retired as
// suggestion categories; their threshold rows are gone.
// floorMin: the per-category suggestion thresholds can't drop below the
// tagger store floor (nothing below the floor is stored to surface).
const fields = [
  { key: 'suggestion_threshold_character', label: 'Character', floorMin: true },
  { key: 'suggestion_threshold_general', label: 'General', floorMin: true },
  { key: 'centroid_similarity_threshold', label: 'Centroid similarity' }
]
const local = reactive({})
watch(() => store.settings, (s) => { if (s) Object.assign(local, s) }, { immediate: true })

async function save() {
  // Mirror the server invariant: keep the category thresholds at or above the
  // store floor so a raised floor doesn't leave a threshold stranded below it.
  const floor = local.tagger_store_floor
  local.suggestion_threshold_character = Math.max(local.suggestion_threshold_character, floor)
  local.suggestion_threshold_general = Math.max(local.suggestion_threshold_general, floor)
  // Mirror the server invariant: a tag can't require more frames than are sampled.
  local.video_min_tag_frames = Math.min(local.video_min_tag_frames, local.video_max_frames)
  const patch = {}
  for (const f of fields) patch[f.key] = local[f.key]
  patch.tagger_store_floor = local.tagger_store_floor
  patch.video_frame_interval_seconds = local.video_frame_interval_seconds
  patch.video_max_frames = local.video_max_frames
  patch.video_min_tag_frames = local.video_min_tag_frames
  try { await store.patchSettings(patch) }
  catch (e) { toast({ text: e.message, type: 'error' }) }
}
</script>
