// ── Local store helpers ──────────────────────────────────────────────────────
// Entity-level read/write helpers for each offline-capable table.
// Queue operations live in lib/offline/queue.ts.
// All functions are browser-only (getDB() throws on server).

import { getDB } from './db'
import type { LocalAssessmentResponse, LocalAssignment } from './db'

// ── Cache metadata ────────────────────────────────────────────────────────────

export async function markCacheFetched(key: string, ttlMs: number): Promise<void> {
  await getDB().cacheMetadata.put({ key, lastFetchedAt: new Date().toISOString(), ttlMs })
}

export async function isCacheStale(key: string): Promise<boolean> {
  const meta = await getDB().cacheMetadata.get(key)
  if (!meta) return true
  return Date.now() - new Date(meta.lastFetchedAt).getTime() > meta.ttlMs
}

export async function getLastFetchedAt(key: string): Promise<string | null> {
  const meta = await getDB().cacheMetadata.get(key)
  return meta?.lastFetchedAt ?? null
}

// ── Assessment responses ──────────────────────────────────────────────────────

export async function cacheAssessmentResponses(
  assessmentId: string,
  rows: LocalAssessmentResponse[],
): Promise<void> {
  const db = getDB()
  await db.transaction('rw', db.assessmentResponses, db.cacheMetadata, async () => {
    await db.assessmentResponses.where('assessment_id').equals(assessmentId).delete()
    await db.assessmentResponses.bulkPut(rows)
    await markCacheFetched(`assessment_responses:${assessmentId}`, 30 * 60 * 1000)
  })
}

export async function getLocalAssessmentResponses(
  assessmentId: string,
): Promise<LocalAssessmentResponse[]> {
  return getDB().assessmentResponses.where('assessment_id').equals(assessmentId).toArray()
}

export async function putLocalAssessmentResponse(row: LocalAssessmentResponse): Promise<void> {
  await getDB().assessmentResponses.put(row)
}

// ── Assignments ───────────────────────────────────────────────────────────────

export async function cacheAssignments(
  rows: LocalAssignment[],
  cacheKey: string,
): Promise<void> {
  const db = getDB()
  await db.transaction('rw', db.assignments, db.cacheMetadata, async () => {
    await db.assignments.bulkPut(rows)
    await markCacheFetched(cacheKey, 15 * 60 * 1000)
  })
}

export async function getLocalAssignments(
  consultantId?: string,
): Promise<LocalAssignment[]> {
  if (consultantId) {
    return getDB().assignments.where('consultant_id').equals(consultantId).toArray()
  }
  return getDB().assignments.toArray()
}
