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

export async function GET() {
  try {
    const session = await getSession()
    if (!session) {
      return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
    }

    const isAdmin = session.role === 'ADMIN' || session.role === 'SUPERADMIN'

    // Initialize default stats
    let serverStats = {
      totalPlayers: 0,
      totalVehicles: 0,
      totalProperties: 0,
      totalMoney: 0,
      totalBank: 0,
    }

    let jobStats: { name: string; label: string; count: number }[] = []
    let economyStats = {
      totalCash: 0,
      totalBank: 0,
      totalWealth: 0,
      averageWealth: 0,
    }

    // Try to get game database stats
    try {
      const config = await getGameDbConfig()
      if (config) {
        const pool = await getGameDbPool()
        if (pool) {
          if (config.framework === 'QBCORE') {
            // QBCore queries
            const [playerRows] = await pool.query<RowDataPacket[]>(`
              SELECT 
                COUNT(*) as totalPlayers,
                COALESCE(SUM(JSON_EXTRACT(money, '$.cash')), 0) as totalMoney,
                COALESCE(SUM(JSON_EXTRACT(money, '$.bank')), 0) as totalBank
              FROM players
            `)
            serverStats.totalPlayers = playerRows[0]?.totalPlayers || 0
            serverStats.totalMoney = Number(playerRows[0]?.totalMoney || 0)
            serverStats.totalBank = Number(playerRows[0]?.totalBank || 0)

            // Job stats
            const [jobRows] = await pool.query<RowDataPacket[]>(`
              SELECT 
                JSON_UNQUOTE(JSON_EXTRACT(job, '$.name')) as name,
                JSON_UNQUOTE(JSON_EXTRACT(job, '$.label')) as label,
                COUNT(*) as count
              FROM players
              WHERE job IS NOT NULL
              GROUP BY JSON_EXTRACT(job, '$.name')
              ORDER BY count DESC
              LIMIT 10
            `)
            jobStats = (jobRows || []).map(row => ({
              name: row.name || 'Unknown',
              label: row.label || row.name || 'Unknown',
              count: row.count || 0,
            }))

            // Vehicles
            try {
              const [vRows] = await pool.query<RowDataPacket[]>(`SELECT COUNT(*) as count FROM player_vehicles`)
              serverStats.totalVehicles = vRows[0]?.count || 0
            } catch { /* table might not exist */ }

          } else {
            // ESX queries
            const [playerRows] = await pool.query<RowDataPacket[]>(`
              SELECT 
                COUNT(*) as totalPlayers,
                COALESCE(SUM(JSON_EXTRACT(accounts, '$.money')), 0) + COALESCE(SUM(JSON_EXTRACT(accounts, '$.cash')), 0) as totalMoney,
                COALESCE(SUM(JSON_EXTRACT(accounts, '$.bank')), 0) as totalBank
              FROM users
            `)
            serverStats.totalPlayers = playerRows[0]?.totalPlayers || 0
            serverStats.totalMoney = Number(playerRows[0]?.totalMoney || 0)
            serverStats.totalBank = Number(playerRows[0]?.totalBank || 0)

            // Job stats
            const [jobRows] = await pool.query<RowDataPacket[]>(`
              SELECT 
                job as name,
                job as label,
                COUNT(*) as count
              FROM users
              WHERE job IS NOT NULL
              GROUP BY job
              ORDER BY count DESC
              LIMIT 10
            `)
            jobStats = (jobRows || []).map(row => ({
              name: row.name || 'Unknown',
              label: row.label || row.name || 'Unknown',
              count: row.count || 0,
            }))

            // Vehicles
            try {
              const [vRows] = await pool.query<RowDataPacket[]>(`SELECT COUNT(*) as count FROM owned_vehicles`)
              serverStats.totalVehicles = vRows[0]?.count || 0
            } catch { /* table might not exist */ }
          }

          economyStats = {
            totalCash: serverStats.totalMoney,
            totalBank: serverStats.totalBank,
            totalWealth: serverStats.totalMoney + serverStats.totalBank,
            averageWealth: serverStats.totalPlayers > 0 
              ? Math.round((serverStats.totalMoney + serverStats.totalBank) / serverStats.totalPlayers) 
              : 0,
          }
        }
      }
    } catch (dbError) {
      console.error('[API] Game DB error (non-fatal):', dbError)
      // Continue with default stats
    }

    // Get recent audit events (from UCP database)
    let recentActivity: Array<{
      id: string
      action: string
      category: string
      details: unknown
      user: string
      createdAt: Date
    }> = []
    
    try {
      const logs = await prisma.auditEvent.findMany({
        take: 10,
        orderBy: { createdAt: 'desc' },
        include: {
          user: {
            select: { username: true }
          }
        }
      })
      recentActivity = logs.map(log => ({
        id: log.id,
        action: log.action,
        category: log.category,
        details: log.details,
        user: log.user?.username || 'System',
        createdAt: log.createdAt
      }))
    } catch (auditError) {
      console.error('[API] Audit log error (non-fatal):', auditError)
    }

    // Get UCP user count
    let totalUcpUsers = 0
    try {
      totalUcpUsers = await prisma.user.count()
    } catch { /* ignore */ }

    // Get recent players from game database
    let recentPlayers: Array<{
      id: string
      name: string
      identifier: string
      money: number
      bank: number
      job: string
      lastSeen: string | null
    }> = []

    try {
      const config = await getGameDbConfig()
      if (config) {
        const pool = await getGameDbPool()
        if (pool) {
          if (config.framework === 'QBCORE') {
            const [rows] = await pool.query<RowDataPacket[]>(`
              SELECT 
                citizenid,
                charinfo,
                money,
                job,
                last_updated
              FROM players
              ORDER BY last_updated DESC
              LIMIT 5
            `)
            recentPlayers = (rows || []).map(row => {
              const charinfo = typeof row.charinfo === 'string' ? JSON.parse(row.charinfo) : row.charinfo || {}
              const money = typeof row.money === 'string' ? JSON.parse(row.money) : row.money || {}
              const job = typeof row.job === 'string' ? JSON.parse(row.job) : row.job || {}
              return {
                id: row.citizenid,
                name: `${charinfo.firstname || ''} ${charinfo.lastname || ''}`.trim() || 'Unknown',
                identifier: row.citizenid,
                money: money.cash || 0,
                bank: money.bank || 0,
                job: job.label || job.name || 'Unemployed',
                lastSeen: row.last_updated ? new Date(row.last_updated).toISOString() : null,
              }
            })
          } else {
            const [rows] = await pool.query<RowDataPacket[]>(`
              SELECT 
                identifier,
                firstname,
                lastname,
                accounts,
                job
              FROM users
              ORDER BY identifier DESC
              LIMIT 5
            `)
            recentPlayers = (rows || []).map(row => {
              const accounts = typeof row.accounts === 'string' ? JSON.parse(row.accounts) : row.accounts || {}
              return {
                id: row.identifier,
                name: `${row.firstname || ''} ${row.lastname || ''}`.trim() || 'Unknown',
                identifier: row.identifier,
                money: accounts.money || accounts.cash || 0,
                bank: accounts.bank || 0,
                job: row.job || 'Unemployed',
                lastSeen: null,
              }
            })
          }
        }
      }
    } catch (recentError) {
      console.error('[API] Recent players error (non-fatal):', recentError)
    }

    return NextResponse.json({
      server: serverStats,
      economy: economyStats,
      jobs: jobStats,
      vehicles: {
        total: serverStats.totalVehicles,
        stored: Math.round(serverStats.totalVehicles * 0.7),
        out: Math.round(serverStats.totalVehicles * 0.3),
      },
      totalUcpUsers,
      recentActivity,
      recentPlayers,
      isAdmin,
    })
  } catch (error) {
    console.error('[API] Failed to fetch dashboard stats:', error)
    return NextResponse.json({ 
      error: 'Failed to load dashboard',
      server: { totalPlayers: 0, totalVehicles: 0, totalProperties: 0, totalMoney: 0, totalBank: 0 },
      economy: { totalCash: 0, totalBank: 0, totalWealth: 0, averageWealth: 0 },
      jobs: [],
      vehicles: { total: 0, stored: 0, out: 0 },
      totalUcpUsers: 0,
      recentActivity: [],
      recentPlayers: [],
      isAdmin: false,
    }, { status: 200 }) // Return 200 with empty data instead of 500
  }
}
