import { NextResponse } from 'next/server'
import { requireAdmin, getSession } from '@/lib/auth'
import { createAuditLog } from '@/lib/audit'
import { prisma } from '@/lib/db'
import { getGameDbConfig, getGameDbPool } from '@/lib/game-db'
import type { RowDataPacket } from 'mysql2'

// Predefined data sources
function getPredefinedDataSources(framework: string) {
  if (framework === 'QBCORE') {
    return [
      { id: 'players', name: 'players', label: 'Players', description: 'All registered characters', type: 'predefined' },
      { id: 'vehicles', name: 'player_vehicles', label: 'Vehicles', description: 'Player vehicles', type: 'predefined' },
      { id: 'inventory', name: 'player_inventory', label: 'Inventory', description: 'Player items', type: 'predefined' },
    ]
  }
  return [
    { id: 'players', name: 'users', label: 'Players', description: 'All registered characters', type: 'predefined' },
    { id: 'vehicles', name: 'owned_vehicles', label: 'Vehicles', description: 'Player vehicles', type: 'predefined' },
    { id: 'items', name: 'items', label: 'Items', description: 'Item definitions', type: 'predefined' },
  ]
}

export async function GET() {
  try {
    const adminCheck = await requireAdmin()
    if (adminCheck) return adminCheck

    // Get custom pages from database
    let pages: Array<{
      id: string
      title: string
      slug: string
      icon: string
      description: string | null
      isPublished: boolean
      visibility: string
      widgets: unknown[]
      createdAt: Date
    }> = []

    try {
      const dbPages = await prisma.customPage.findMany({
        include: {
          widgets: {
            orderBy: { sortOrder: 'asc' }
          }
        },
        orderBy: { createdAt: 'desc' }
      })
      pages = dbPages.map(p => ({
        id: p.id,
        title: p.title,
        slug: p.slug,
        icon: p.icon,
        description: p.description,
        isPublished: p.isPublished,
        visibility: p.visibility,
        widgets: p.widgets,
        createdAt: p.createdAt,
      }))
    } catch (error) {
      console.error('[API] Error fetching custom pages:', error)
    }

    // Get framework config
    let framework = 'ESX'
    let availableTables: string[] = []

    try {
      const config = await getGameDbConfig()
      framework = config?.framework || 'ESX'

      // Get available tables
      const pool = await getGameDbPool()
      if (pool) {
        const [tables] = await pool.query<RowDataPacket[]>('SHOW TABLES')
        availableTables = tables.map(t => Object.values(t)[0] as string)
      }
    } catch (error) {
      console.error('[API] Error getting game DB config:', error)
    }

    const predefinedSources = getPredefinedDataSources(framework)

    return NextResponse.json({
      pages,
      dataSources: predefinedSources,
      availableTables,
      framework,
    })
  } catch (error) {
    console.error('[API] Failed to fetch panel configuration:', error)
    return NextResponse.json({
      pages: [],
      dataSources: [],
      availableTables: [],
      framework: 'ESX',
    })
  }
}

export async function POST(request: Request) {
  try {
    const adminCheck = await requireAdmin()
    if (adminCheck) return adminCheck

    const session = await getSession()
    const data = await request.json()

    // Validate required fields
    if (!data.title || !data.slug) {
      return NextResponse.json({ error: 'Title and slug are required' }, { status: 400 })
    }

    // Create new page
    const page = await prisma.customPage.create({
      data: {
        title: data.title,
        slug: data.slug,
        icon: data.icon || 'FileText',
        description: data.description || null,
        visibility: data.visibility || 'ALL',
        isPublished: false,
        createdById: session?.userId || null,
      },
    })

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

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