import { NextRequest, NextResponse } from 'next/server'
import prisma from '@/lib/prisma'
import { auth } from '@/auth'

const COLORS = ['red', 'orange', 'yellow', 'green', 'teal', 'blue', 'purple', 'pink', 'gray'];

// GET /api/labels - Get all labels (supports optional notebookId filter)
export async function GET(request: NextRequest) {
  const session = await auth();
  if (!session?.user?.id) {
    return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
  }

  try {
    const searchParams = request.nextUrl.searchParams
    const notebookId = searchParams.get('notebookId')

    // Build where clause
    const where: any = {}

    if (notebookId === 'null' || notebookId === '') {
      // Get labels without a notebook (backward compatibility)
      where.notebookId = null
    } else if (notebookId) {
      // Get labels for a specific notebook
      where.notebookId = notebookId
    } else {
      // Get all labels for the user (both old and new system)
      where.OR = [
        { notebookId: { not: null } },
        { userId: session.user.id }
      ]
    }

    const labels = await prisma.label.findMany({
      where,
      include: {
        notebook: {
          select: { id: true, name: true }
        }
      },
      orderBy: { name: 'asc' }
    })

    return NextResponse.json({
      success: true,
      data: labels
    })
  } catch (error) {
    console.error('Error fetching labels:', error)
    return NextResponse.json(
      { success: false, error: 'Failed to fetch labels' },
      { status: 500 }
    )
  }
}

// POST /api/labels - Create a new label
export async function POST(request: NextRequest) {
  const session = await auth();
  if (!session?.user?.id) {
    return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
  }

  try {
    const body = await request.json()
    const { name, color, notebookId } = body

    if (!name || typeof name !== 'string') {
      return NextResponse.json(
        { success: false, error: 'Label name is required' },
        { status: 400 }
      )
    }

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

    // Verify notebook ownership
    const notebook = await prisma.notebook.findUnique({
      where: { id: notebookId },
      select: { userId: true }
    })

    if (!notebook || notebook.userId !== session.user.id) {
      return NextResponse.json(
        { success: false, error: 'Notebook not found or unauthorized' },
        { status: 403 }
      )
    }

    // Check if label already exists in this notebook
    const existing = await prisma.label.findFirst({
      where: {
        name: name.trim(),
        notebookId: notebookId
      }
    })

    if (existing) {
      return NextResponse.json(
        { success: false, error: 'Label already exists in this notebook' },
        { status: 409 }
      )
    }

    const label = await prisma.label.create({
      data: {
        name: name.trim(),
        color: color || COLORS[Math.floor(Math.random() * COLORS.length)],
        notebookId: notebookId,
        userId: session.user.id // Keep for backward compatibility
      }
    })

    return NextResponse.json({
      success: true,
      data: label
    }, { status: 201 })
  } catch (error) {
    console.error('Error creating label:', error)
    return NextResponse.json(
      { success: false, error: 'Failed to create label' },
      { status: 500 }
    )
  }
}
