import { NextResponse } from 'next/server'
import { executeWithFailover, getRpcStatus } from '../../../../lib/rpc-failover.js'

export async function GET() {
  try {
    console.log('📋 Getting Drift open orders...')
    
    // Log RPC status
    const rpcStatus = getRpcStatus()
    console.log('🌐 RPC Status:', rpcStatus)

    // Check if environment is configured
    if (!process.env.SOLANA_PRIVATE_KEY) {
      return NextResponse.json({
        success: false,
        error: 'Drift not configured - missing SOLANA_PRIVATE_KEY'
      }, { status: 400 })
    }

    // Execute orders check with RPC failover
    const result = await executeWithFailover(async (connection) => {
      // Import Drift SDK components
      const { DriftClient, initialize } = await import('@drift-labs/sdk')
      const { Keypair } = await import('@solana/web3.js')
      const { AnchorProvider, BN } = await import('@coral-xyz/anchor')

      const privateKeyArray = JSON.parse(process.env.SOLANA_PRIVATE_KEY)
      const keypair = Keypair.fromSecretKey(new Uint8Array(privateKeyArray))
      
      // Use the correct Wallet class from @coral-xyz/anchor/dist/cjs/nodewallet
      const { default: NodeWallet } = await import('@coral-xyz/anchor/dist/cjs/nodewallet.js')
      const wallet = new NodeWallet(keypair)

      // Initialize Drift SDK
      const env = 'mainnet-beta'
      const sdkConfig = initialize({ env })
      
      const driftClient = new DriftClient({
        connection,
        wallet,
        programID: sdkConfig.DRIFT_PROGRAM_ID,
        opts: {
          commitment: 'confirmed',
        },
      })

      try {
        await driftClient.subscribe()
        console.log('✅ Connected to Drift for orders check')

        // Check if user has account
        let userAccount
        try {
          userAccount = await driftClient.getUserAccount()
        } catch (accountError) {
          await driftClient.unsubscribe()
          throw new Error('No Drift user account found. Please initialize your account first.')
        }

        // Get open orders
        const orders = userAccount.orders || []
        
        // Filter for active orders (status 0 = open)
        const activeOrders = orders.filter(order => 
          order.status === 0 && !order.baseAssetAmount.isZero()
        )

        // Show ALL orders for debugging - not just active ones
        const allOrders = orders.filter(order => 
          !order.baseAssetAmount.isZero() // Only filter out empty orders
        )

        console.log(`📋 Found ${activeOrders.length} active orders, ${allOrders.length} total orders (${orders.length} order slots)`)

        // Debug: log all order statuses
        const statusCounts = orders.reduce((acc, order) => {
          acc[order.status] = (acc[order.status] || 0) + 1
          return acc
        }, {})
        console.log('📊 Order status breakdown:', statusCounts)

        const formattedOrders = activeOrders.map(order => {
          const marketIndex = order.marketIndex
          const symbol = ['SOL', 'BTC', 'ETH', 'APT', 'AVAX', 'BNB', 'MATIC', 'ARB', 'DOGE', 'OP'][marketIndex] || `UNKNOWN_${marketIndex}`
          
          let orderType = 'UNKNOWN'
          switch (order.orderType) {
            case 0: orderType = 'MARKET'; break
            case 1: orderType = 'LIMIT'; break  
            case 2: orderType = 'TRIGGER_MARKET'; break
            case 3: orderType = 'TRIGGER_LIMIT'; break
            case 4: orderType = 'ORACLE'; break
          }

          let direction = 'UNKNOWN'
          switch (order.direction) {
            case 0: direction = 'LONG'; break
            case 1: direction = 'SHORT'; break
          }

          return {
            orderId: order.orderId,
            symbol: `${symbol}-PERP`,
            orderType,
            direction,
            size: (Number(order.baseAssetAmount) / 1e9).toFixed(6),
            price: order.price ? (Number(order.price) / 1e6).toFixed(4) : null,
            triggerPrice: order.triggerPrice ? (Number(order.triggerPrice) / 1e6).toFixed(4) : null,
            reduceOnly: order.reduceOnly,
            status: order.status,
            marketIndex
          }
        })

        const ordersResult = {
          success: true,
          orders: formattedOrders,
          totalOrders: activeOrders.length,
          timestamp: Date.now(),
          rpcEndpoint: getRpcStatus().currentEndpoint,
          details: {
            wallet: keypair.publicKey.toString(),
            totalOrderSlots: orders.length,
            activeOrderSlots: activeOrders.length
          }
        }

        await driftClient.unsubscribe()
        
        console.log('📋 Orders retrieved:', {
          totalActiveOrders: activeOrders.length,
          rpcEndpoint: getRpcStatus().currentEndpoint
        })

        return ordersResult

      } catch (driftError) {
        console.error('❌ Drift orders error:', driftError)
        
        try {
          await driftClient.unsubscribe()
        } catch (cleanupError) {
          console.warn('⚠️ Cleanup error:', cleanupError.message)
        }
        
        throw driftError
      }
    }, 3) // Max 3 retries across different RPCs

    return NextResponse.json(result)

  } catch (error) {
    console.error('❌ Orders API error:', error)
    
    return NextResponse.json({
      success: false,
      error: 'Failed to get Drift orders',
      details: error.message,
      rpcStatus: getRpcStatus()
    }, { status: 500 })
  }
}

export async function POST() {
  return NextResponse.json({
    message: 'Use GET method to retrieve Drift orders'
  }, { status: 405 })
}
