import { NextResponse } from 'next/server'
import { getCurrentUser } from '@/lib/auth'
import { prisma } from '@/lib/db'
import { randomUUID } from 'crypto'

export const dynamic = 'force-dynamic'

// Generate ticket number
function generateTicketNumber(): string {
  const date = new Date()
  const year = date.getFullYear().toString().slice(-2)
  const month = (date.getMonth() + 1).toString().padStart(2, '0')
  const random = Math.floor(Math.random() * 10000).toString().padStart(4, '0')
  return `TKT-${year}${month}-${random}`
}

// GET - Fetch user's tickets
export async function GET() {
  try {
    const user = await getCurrentUser()
    
    if (!user) {
      return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
    }

    const tickets = await prisma.supportTicket.findMany({
      where: { userId: user.id },
      orderBy: { createdAt: 'desc' },
      include: {
        messages: {
          orderBy: { createdAt: 'asc' }
        }
      }
    })

    return NextResponse.json({ tickets })
  } catch (error) {
    console.error('[API] Error fetching tickets:', error)
    return NextResponse.json(
      { error: 'Failed to fetch tickets', tickets: [] },
      { status: 500 }
    )
  }
}

// POST - Create new ticket
export async function POST(request: Request) {
  try {
    const user = await getCurrentUser()
    
    if (!user) {
      return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
    }

    const body = await request.json()
    const { subject, category, priority, description, characterId } = body

    if (!subject || !category || !description) {
      return NextResponse.json(
        { error: 'Missing required fields: subject, category, description' },
        { status: 400 }
      )
    }

    // Validate category
    const validCategories = ['GENERAL', 'TECHNICAL', 'ACCOUNT', 'INGAME', 'BUG_REPORT', 'SUGGESTION', 'APPEAL', 'OTHER']
    if (!validCategories.includes(category.toUpperCase())) {
      return NextResponse.json(
        { error: 'Invalid category' },
        { status: 400 }
      )
    }

    // Validate priority
    const validPriorities = ['LOW', 'MEDIUM', 'HIGH', 'URGENT']
    const normalizedPriority = (priority || 'MEDIUM').toUpperCase()
    if (!validPriorities.includes(normalizedPriority)) {
      return NextResponse.json(
        { error: 'Invalid priority' },
        { status: 400 }
      )
    }

    const ticketId = randomUUID()
    const messageId = randomUUID()
    const ticketNumber = generateTicketNumber()

    const ticket = await prisma.supportTicket.create({
      data: {
        id: ticketId,
        ticketNumber,
        userId: user.id,
        characterId: characterId || null,
        subject,
        category: category.toUpperCase() as any,
        priority: normalizedPriority as any,
        description,
        status: 'OPEN',
        messages: {
          create: {
            id: messageId,
            userId: user.id,
            message: description,
            isStaff: false,
          }
        }
      },
      include: {
        messages: true,
      }
    })

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