import { NextRequest, NextResponse } from 'next/server';
import { generateJWT, createSessionToken } from 'cdp-wallet-onramp-kit/lib/cdp-auth';
import { 
  sessionTokenSchema, 
  validateRequest, 
  createErrorResponse,
  validateEnvironment 
} from 'cdp-wallet-onramp-kit/lib/validation';

/**
 * API route for creating onramp session tokens
 * 
 * POST /api/onramp/session
 * 
 * Request Body:
 * - For wallet users: { userAddress: string, assets?: string[] }
 * - For guest checkout: { guestCheckout: true, assets?: string[] }
 * 
 * Response:
 * - Success: { sessionToken: string, expiresIn: number }
 * - Error: { error: string, details?: Record<string, unknown> }
 * 
 * Copy this file to: app/api/onramp/session/route.ts
 */

export async function POST(request: NextRequest) {
  try {
    // Validate environment variables
    const envCheck = validateEnvironment();
    if (!envCheck.isValid) {
      console.error('Missing environment variables:', envCheck.missing);
      return NextResponse.json(
        createErrorResponse(
          'Server configuration error. Please check your CDP API credentials.',
          { missing: envCheck.missing }
        ),
        { status: 500 }
      );
    }

    // Parse and validate request body
    const body = await request.json();
    const validatedData = validateRequest(sessionTokenSchema, body);

    // Generate CDP JWT
    const jwt = await generateJWT();
    
    // Create session token with CDP API
    const requestBody = 'guestCheckout' in validatedData && validatedData.guestCheckout
      ? {
          // Guest checkout doesn't require specific addresses
          addresses: [],
          assets: validatedData.assets || ['ETH', 'USDC']
        }
      : {
          addresses: [
            {
              address: (validatedData as { userAddress: string }).userAddress,
              blockchains: ['base']
            }
          ],
          assets: validatedData.assets || ['ETH', 'USDC']
        };

    const sessionToken = await createSessionToken(jwt, requestBody);
    
    return NextResponse.json({ 
      sessionToken,
      expiresIn: 300 // 5 minutes
    });
    
  } catch (error) {
    console.error('Session token creation error:', error);
    
    // Handle validation errors
    if (error instanceof Error && error.message.startsWith('Validation failed')) {
      return NextResponse.json(
        createErrorResponse('Invalid request parameters', error.message),
        { status: 400 }
      );
    }
    
    // Handle CDP API key errors
    if (error instanceof Error && error.message.includes('CDP_API_KEY')) {
      return NextResponse.json(
        createErrorResponse('Server configuration error. Please check your CDP API credentials.'),
        { status: 500 }
      );
    }
    
    // Handle CDP API errors
    if (error instanceof Error && error.message.includes('Failed to create session token')) {
      return NextResponse.json(
        createErrorResponse('Failed to create session token', error.message),
        { status: 502 }
      );
    }
    
    // Generic error
    return NextResponse.json(
      createErrorResponse('Failed to create session token. Please try again.'),
      { status: 500 }
    );
  }
}

// Handle unsupported methods
export async function GET() {
  return NextResponse.json(
    createErrorResponse('Method not allowed. Use POST to create session tokens.'),
    { status: 405 }
  );
}

export async function PUT() {
  return NextResponse.json(
    createErrorResponse('Method not allowed. Use POST to create session tokens.'),
    { status: 405 }
  );
}

export async function DELETE() {
  return NextResponse.json(
    createErrorResponse('Method not allowed. Use POST to create session tokens.'),
    { status: 405 }
  );
}