import { NextRequest, NextResponse } from 'next/server'
import crypto from 'crypto'
import path from 'path'
import fs from 'fs'
import { workspaceMemberRepo } from '@/lib/database/repositories/workspace-member.repo'
import { initializeWorkspaceDir } from '@/lib/workspace-fs'
import { isAuthError, requireUser, requireWorkspaceReadAccess } from '@/lib/auth/session'
export async function GET() {
  try {
    const user = await requireUser()

    const rows = workspaceMemberRepo.listAccessibleByUser(user.id)

    // Add name derived from path + check if folder still exists on disk
    const result = rows.map(row => ({
      ...row,
      name: path.basename(row.path),
      exists: fs.existsSync(row.path),
    }))

    return NextResponse.json(result)
  } catch (err) {
    if (isAuthError(err)) return err
    throw err
  }
}

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

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

  const projectPath = body.path
  // Check if already registered
  const existing = workspaceMemberRepo.findByPath(projectPath)
  if (existing) {
    try {
      await requireWorkspaceReadAccess(existing.id)
    } catch (err) {
      if (isAuthError(err)) return NextResponse.json({ error: 'Path is already registered' }, { status: 409 })
      throw err
    }
    workspaceMemberRepo.touch(existing.id)
    const updated = workspaceMemberRepo.findById(existing.id)
    return NextResponse.json({ ...updated, name: path.basename(projectPath) })
  }

  const id = crypto.randomUUID()
  workspaceMemberRepo.create({
    id,
    path: projectPath,
    ownerUserId: user.id,
  })

  // Initialize .claude/ directory with default files
  initializeWorkspaceDir(projectPath, true)

  const created = workspaceMemberRepo.findById(id)
  return NextResponse.json({ ...created, name: path.basename(projectPath) }, { status: 201 })
}
