import { NextRequest, NextResponse } from 'next/server'
import { taskExecutionRepo } from '@/lib/database/repositories/task-execution.repo'
import { cronTaskRepo } from '@/lib/database/repositories/cron-task.repo'
import crypto from 'crypto'

export async function GET(req: NextRequest) {
  const { searchParams } = new URL(req.url)
  const taskId = searchParams.get('task_id')
  const workspaceId = searchParams.get('workspace_id')
  const rawLimit = parseInt(searchParams.get('limit') || '20', 10)
  const limit = Math.min(Math.max(rawLimit || 20, 1), 500)
  const offset = Math.max(parseInt(searchParams.get('offset') || '0', 10), 0)

  if (taskId) {
    const rows = taskExecutionRepo.listByTask(taskId, limit, offset)
    return NextResponse.json(rows)
  }

  const rawType = searchParams.get('type')
  const typeFilter: 'heartbeat' | 'cron' | 'webhook' | undefined =
    rawType === 'heartbeat' || rawType === 'cron' || rawType === 'webhook' ? rawType : undefined

  const rawStatus = searchParams.get('status')
  const statusFilter: 'ok' | 'alert' | 'error' | undefined =
    rawStatus === 'ok' || rawStatus === 'alert' || rawStatus === 'error' ? rawStatus : undefined

  const rows = taskExecutionRepo.listWithJoin({
    workspaceId: workspaceId ?? undefined,
    typeFilter,
    statusFilter,
    limit,
    offset,
  })
  return NextResponse.json(rows)
}

export async function POST(req: NextRequest) {
  let body: Record<string, unknown>
  try { body = await req.json() } catch { return NextResponse.json({ error: 'Invalid JSON' }, { status: 400 }) }

  const taskIdRaw = body.task_id
  if (!taskIdRaw || typeof taskIdRaw !== 'string') {
    return NextResponse.json({ error: 'task_id is required' }, { status: 400 })
  }

  const id = crypto.randomUUID()
  const taskName = typeof body.task_name === 'string' ? body.task_name : undefined
  const result = typeof body.result === 'string' ? body.result : undefined
  const sessionId = typeof body.session_id === 'string' ? body.session_id : undefined

  const rawStatus = typeof body.status === 'string' ? body.status : 'ok'
  const status: 'ok' | 'alert' | 'error' =
    rawStatus === 'ok' || rawStatus === 'alert' || rawStatus === 'error' ? rawStatus : 'ok'

  const created = taskExecutionRepo.create({
    id,
    taskId: taskIdRaw,
    taskName,
    result,
    status,
    sessionId,
  })

  // Update last_run on the task
  cronTaskRepo.updateLastRun(taskIdRaw, result ?? '')

  return NextResponse.json(created, { status: 201 })
}
