import { NextResponse } from 'next/server'
import { requireAdmin, getSession } from '@/lib/auth'
import { createAuditLog } from '@/lib/audit'
import {
  getCustomPage,
  updateCustomPage,
  deleteCustomPage,
  addWidget,
  reorderWidgets,
} from '@/lib/services/panel-builder-service'

export async function GET(
  request: Request,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const adminCheck = await requireAdmin()
    if (adminCheck) return adminCheck

    const { id } = await params
    const page = await getCustomPage(id)

    if (!page) {
      return NextResponse.json({ error: 'Page not found' }, { status: 404 })
    }

    return NextResponse.json(page)
  } catch (error) {
    console.error('[API] Failed to fetch page:', error)
    return NextResponse.json({ error: 'Internal server error' }, { status: 500 })
  }
}

export async function PUT(
  request: Request,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const adminCheck = await requireAdmin()
    if (adminCheck) return adminCheck

    const session = await getSession()
    const { id } = await params
    const data = await request.json()

    // Update page
    const page = await updateCustomPage(id, {
      title: data.title,
      slug: data.slug,
      icon: data.icon,
      description: data.description,
      isPublished: data.isPublished,
      visibility: data.visibility,
      allowedRoles: data.allowedRoles,
      layout: data.layout,
      sortOrder: data.sortOrder,
    })

    // Handle widgets if provided
    if (data.widgets && Array.isArray(data.widgets)) {
      // Reorder existing widgets
      const widgetIds = data.widgets
        .filter((w: { id?: string }) => w.id)
        .map((w: { id: string }) => w.id)
      
      if (widgetIds.length > 0) {
        await reorderWidgets(id, widgetIds)
      }

      // Add new widgets
      for (const widget of data.widgets) {
        if (!widget.id) {
          await addWidget(id, {
            type: widget.type,
            title: widget.title,
            config: widget.config,
            dataSource: widget.dataSource,
            position: widget.position,
            size: widget.size,
          })
        }
      }
    }

    // Audit log
    await createAuditLog({
      userId: session?.userId,
      action: 'PAGE_UPDATED',
      category: 'PANEL_BUILDER',
      details: { pageId: page.id, title: page.title },
      ipAddress: request.headers.get('x-forwarded-for') || undefined,
    })

    // Fetch updated page with widgets
    const updatedPage = await getCustomPage(id)

    return NextResponse.json(updatedPage)
  } catch (error) {
    console.error('[API] Failed to update page:', error)
    return NextResponse.json({ error: 'Internal server error' }, { status: 500 })
  }
}

export async function DELETE(
  request: Request,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const adminCheck = await requireAdmin()
    if (adminCheck) return adminCheck

    const session = await getSession()
    const { id } = await params

    const page = await getCustomPage(id)
    if (!page) {
      return NextResponse.json({ error: 'Page not found' }, { status: 404 })
    }

    await deleteCustomPage(id)

    // Audit log
    await createAuditLog({
      userId: session?.userId,
      action: 'PAGE_DELETED',
      category: 'PANEL_BUILDER',
      details: { pageId: id, title: page.title },
      ipAddress: request.headers.get('x-forwarded-for') || undefined,
    })

    return NextResponse.json({ success: true })
  } catch (error) {
    console.error('[API] Failed to delete page:', error)
    return NextResponse.json({ error: 'Internal server error' }, { status: 500 })
  }
}
