import { defineStore } from 'pinia'

import { useApi } from '../composables/useApi.js'

// GPU agent control surface (#114): the FC-side admin for the desktop agent —
// the bearer token it authenticates with, the job-queue depth, and the backfill
// trigger. The agent itself talks to /api/gpu/jobs/* over HTTP; nothing here
// touches Redis/Postgres directly.
export const useGpuStore = defineStore('gpu', () => {
  const api = useApi()

  // { token: <string|null>, configured: bool }
  async function token() {
    return await api.get('/api/gpu/token')
  }

  // Generate a fresh token (invalidates the old one). Returns { token }.
  async function rotateToken() {
    return await api.post('/api/gpu/token/rotate')
  }

  // { pending, leased, done, error }
  async function status() {
    return await api.get('/api/gpu/status')
  }

  // Enqueue a job per image lacking one for `task` (the agent drains it).
  async function backfill(task = 'ccip') {
    return await api.post('/api/gpu/backfill', { body: { task } })
  }

  // Reset every done/error `task` job to pending → re-run the WHOLE library
  // under the current pipeline (e.g. after adding crop detectors).
  async function reprocess(task = 'ccip') {
    return await api.post('/api/gpu/reprocess', { body: { task } })
  }

  // Requeue ONLY the errored jobs (all task types) — the scoped recovery after
  // an agent fix, without re-running the done library. Triage-confirmed
  // defects stay put (they recover via recoverImage instead).
  // Returns { requeued, pruned, defects_kept }.
  async function retryErrors() {
    return await api.post('/api/gpu/retry_errors')
  }

  // Failure-triage view (#125): errored jobs joined with integrity verdicts.
  // Returns { total, by_class, triage, items }.
  async function errors() {
    return await api.get('/api/gpu/errors')
  }

  // Run the file-probe sweep now instead of waiting out the 15-min beat.
  async function triageErrors() {
    return await api.post('/api/gpu/errors/triage')
  }

  // Recover a defective original: delete the bad copy + record, re-poll its
  // Source. Returns { status: 'refetch_queued'|'no_source'|'not_found', ... }.
  async function recoverImage(imageId) {
    return await api.post(`/api/gpu/errors/${imageId}/recover`)
  }

  return {
    token, rotateToken, status, backfill, reprocess, retryErrors,
    errors, triageErrors, recoverImage,
  }
})
