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

// Helper to parse JSON fields
function parseNote(dbNote: any) {
  return {
    ...dbNote,
    checkItems: dbNote.checkItems ? JSON.parse(dbNote.checkItems) : null,
    labels: dbNote.labels ? JSON.parse(dbNote.labels) : null,
    images: dbNote.images ? JSON.parse(dbNote.images) : null,
  }
}

// GET /api/notes - Get all notes
export async function GET(request: NextRequest) {
  try {
    const searchParams = request.nextUrl.searchParams
    const includeArchived = searchParams.get('archived') === 'true'
    const search = searchParams.get('search')

    let where: any = {}
    
    if (!includeArchived) {
      where.isArchived = false
    }

    if (search) {
      where.OR = [
        { title: { contains: search, mode: 'insensitive' } },
        { content: { contains: search, mode: 'insensitive' } }
      ]
    }

    const notes = await prisma.note.findMany({
      where,
      orderBy: [
        { isPinned: 'desc' },
        { order: 'asc' },
        { updatedAt: 'desc' }
      ]
    })

    return NextResponse.json({
      success: true,
      data: notes.map(parseNote)
    })
  } catch (error) {
    return NextResponse.json(
      { success: false, error: 'Failed to fetch notes' },
      { status: 500 }
    )
  }
}

// POST /api/notes - Create a new note
export async function POST(request: NextRequest) {
  try {
    const body = await request.json()
    const { title, content, color, type, checkItems, labels, images } = body

    if (!content && type !== 'checklist') {
      return NextResponse.json(
        { success: false, error: 'Content is required' },
        { status: 400 }
      )
    }

    const note = await prisma.note.create({
      data: {
        title: title || null,
        content: content || '',
        color: color || 'default',
        type: type || 'text',
        checkItems: checkItems ? JSON.stringify(checkItems) : null,
        labels: labels ? JSON.stringify(labels) : null,
        images: images ? JSON.stringify(images) : null,
      }
    })

    return NextResponse.json({
      success: true,
      data: parseNote(note)
    }, { status: 201 })
  } catch (error) {
    return NextResponse.json(
      { success: false, error: 'Failed to create note' },
      { status: 500 }
    )
  }
}

// PUT /api/notes - Update an existing note
export async function PUT(request: NextRequest) {
  try {
    const body = await request.json()
    const { id, title, content, color, type, checkItems, labels, isPinned, isArchived, images } = body

    if (!id) {
      return NextResponse.json(
        { success: false, error: 'Note ID is required' },
        { status: 400 }
      )
    }

    const updateData: any = {}
    
    if (title !== undefined) updateData.title = title
    if (content !== undefined) updateData.content = content
    if (color !== undefined) updateData.color = color
    if (type !== undefined) updateData.type = type
    if (checkItems !== undefined) updateData.checkItems = checkItems ? JSON.stringify(checkItems) : null
    if (labels !== undefined) updateData.labels = labels ? JSON.stringify(labels) : null
    if (isPinned !== undefined) updateData.isPinned = isPinned
    if (isArchived !== undefined) updateData.isArchived = isArchived
    if (images !== undefined) updateData.images = images ? JSON.stringify(images) : null

    const note = await prisma.note.update({
      where: { id },
      data: updateData
    })

    return NextResponse.json({
      success: true,
      data: parseNote(note)
    })
  } catch (error) {
    return NextResponse.json(
      { success: false, error: 'Failed to update note' },
      { status: 500 }
    )
  }
}

// DELETE /api/notes?id=xxx - Delete a note
export async function DELETE(request: NextRequest) {
  try {
    const searchParams = request.nextUrl.searchParams
    const id = searchParams.get('id')

    if (!id) {
      return NextResponse.json(
        { success: false, error: 'Note ID is required' },
        { status: 400 }
      )
    }

    await prisma.note.delete({
      where: { id }
    })

    return NextResponse.json({
      success: true,
      message: 'Note deleted successfully'
    })
  } catch (error) {
    return NextResponse.json(
      { success: false, error: 'Failed to delete note' },
      { status: 500 }
    )
  }
}
