import { NextRequest, NextResponse } from 'next/server'
import { checkInstallationStatus, runInstallation, type InstallationConfig } from '@/lib/installation'

// Check if database was configured via Linux installer
function isDatabaseConfiguredViaLinux(): boolean {
  return process.env.DATABASE_CONFIGURED === 'true'
}

// Get database config from environment (set by Linux installer)
function getDbConfigFromEnv() {
  const dbUrl = process.env.DATABASE_URL || ''
  // Parse DATABASE_URL: mysql://user:password@host:port/database
  const match = dbUrl.match(/mysql:\/\/([^:]+):([^@]*)@([^:]+):(\d+)\/(.+)/)
  
  if (match) {
    return {
      dbUser: match[1],
      dbPassword: match[2],
      dbHost: match[3],
      dbPort: parseInt(match[4]),
      dbName: match[5],
    }
  }
  
  return null
}

function getGameDbConfigFromEnv() {
  const gameDbUrl = process.env.GAME_DATABASE_URL || ''
  const match = gameDbUrl.match(/mysql:\/\/([^:]+):([^@]*)@([^:]+):(\d+)\/(.+)/)
  
  if (match) {
    return {
      gameDbUser: match[1],
      gameDbPassword: match[2],
      gameDbHost: match[3],
      gameDbPort: parseInt(match[4]),
      gameDbName: match[5],
    }
  }
  
  return null
}

export async function POST(request: NextRequest) {
  try {
    // Check if already installed
    const status = await checkInstallationStatus()
    if (status.isInstalled) {
      return NextResponse.json(
        { success: false, error: 'System is already installed' },
        { status: 400 }
      )
    }

    const body = await request.json()
    
    // Check if database was configured via Linux installer
    const dbConfiguredViaLinux = isDatabaseConfiguredViaLinux()
    
    // Get database config from environment if configured via Linux
    const envDbConfig = dbConfiguredViaLinux ? getDbConfigFromEnv() : null
    const envGameDbConfig = dbConfiguredViaLinux ? getGameDbConfigFromEnv() : null

    // Validate required fields - skip database fields if configured via Linux
    const requiredFields = dbConfiguredViaLinux
      ? ['discordClientId', 'discordClientSecret', 'adminDiscordId', 'jwtSecret']
      : [
          'dbHost', 'dbName', 'dbUser',
          'gameDbHost', 'gameDbName', 'gameDbUser',
          'discordClientId', 'discordClientSecret',
          'adminDiscordId', 'jwtSecret'
        ]

    for (const field of requiredFields) {
      if (!body[field]) {
        return NextResponse.json(
          { success: false, error: `Missing required field: ${field}` },
          { status: 400 }
        )
      }
    }

    // Validate Discord ID format
    if (!/^\d{17,19}$/.test(body.adminDiscordId)) {
      return NextResponse.json(
        { success: false, error: 'Invalid Discord ID format' },
        { status: 400 }
      )
    }

    // Prepare configuration - use env values if configured via Linux
    const config: InstallationConfig = {
      // General
      timezone: body.timezone || 'UTC',
      defaultLanguage: body.defaultLanguage || 'en',
      
      // Branding
      panelName: body.panelName || 'SKG UCP',
      logoUrl: body.logoUrl,
      backgroundUrl: body.backgroundUrl,
      primaryColor: body.primaryColor || '#3B82F6',
      secondaryColor: body.secondaryColor || '#1E40AF',
      themeStyle: body.themeStyle || 'dark',
      
      // UCP Database - use env values if available, otherwise use form values
      dbHost: envDbConfig?.dbHost || body.dbHost,
      dbPort: envDbConfig?.dbPort || body.dbPort || 3306,
      dbName: envDbConfig?.dbName || body.dbName,
      dbUser: envDbConfig?.dbUser || body.dbUser,
      dbPassword: envDbConfig?.dbPassword || body.dbPassword || '',
      
      // FiveM Game Database - use env values if available, otherwise use form values
      gameDbHost: envGameDbConfig?.gameDbHost || body.gameDbHost,
      gameDbPort: envGameDbConfig?.gameDbPort || body.gameDbPort || 3306,
      gameDbName: envGameDbConfig?.gameDbName || body.gameDbName,
      gameDbUser: envGameDbConfig?.gameDbUser || body.gameDbUser,
      gameDbPassword: envGameDbConfig?.gameDbPassword || body.gameDbPassword || '',
      gameDbFramework: process.env.GAME_FRAMEWORK || body.gameDbFramework || 'esx',
      
      // Discord OAuth
      discordClientId: body.discordClientId,
      discordClientSecret: body.discordClientSecret,
      discordCallbackUrl: body.discordCallbackUrl || '',
      
      // Discord Webhook
      discordWebhookUrl: body.discordWebhookUrl,
      
      // Domain
      useDirectIp: body.useDirectIp ?? true,
      mainDomain: body.mainDomain,
      subdomain: body.subdomain,
      
      // Admin
      adminDiscordId: body.adminDiscordId,
      
      // Security
      jwtSecret: body.jwtSecret,
      sessionDuration: body.sessionDuration || 7,
    }

    // Run installation
    const result = await runInstallation(config)

    if (!result.success) {
      return NextResponse.json(
        { success: false, error: result.error },
        { status: 500 }
      )
    }

    return NextResponse.json({ success: true })
  } catch (error) {
    console.error('[Installer] Installation error:', error)
    return NextResponse.json(
      { success: false, error: error instanceof Error ? error.message : 'Installation failed' },
      { status: 500 }
    )
  }
}

export async function GET() {
  try {
    const status = await checkInstallationStatus()
    return NextResponse.json(status)
  } catch {
    return NextResponse.json({ isInstalled: false, version: '1.0.0' })
  }
}
