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

/**
 * API route for generating complete onramp URLs with session tokens
 * 
 * POST /api/onramp/url
 * 
 * Request Body:
 * {
 *   addresses: Array<{ address: string, blockchains: string[] }>,
 *   assets?: string[],
 *   defaultAsset?: string,
 *   defaultNetwork?: string,
 *   presetFiatAmount?: number,
 *   presetCryptoAmount?: number,
 *   redirectUrl?: string,
 *   partnerUserId?: string
 * }
 * 
 * Response:
 * - Success: { url: string, expiresIn: number }
 * - Error: { error: string, details?: Record<string, unknown> }
 * 
 * Copy this file to: app/api/onramp/url/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(onrampUrlSchema, body);

    // Generate complete onramp URL with session token
    const onrampUrl = await generateOnrampUrl({
      addresses: validatedData.addresses,
      assets: validatedData.assets,
      defaultAsset: validatedData.defaultAsset,
      defaultNetwork: validatedData.defaultNetwork,
      presetFiatAmount: validatedData.presetFiatAmount,
      presetCryptoAmount: validatedData.presetCryptoAmount,
      redirectUrl: validatedData.redirectUrl,
      partnerUserId: validatedData.partnerUserId
    });
    
    return NextResponse.json({ 
      url: onrampUrl,
      expiresIn: 300 // URL is valid for 5 minutes (session token lifetime)
    });
    
  } catch (error) {
    console.error('Onramp URL generation 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')) {
      return NextResponse.json(
        createErrorResponse('Failed to generate onramp URL', error.message),
        { status: 502 }
      );
    }
    
    // Generic error
    return NextResponse.json(
      createErrorResponse('Failed to generate onramp URL. Please try again.'),
      { status: 500 }
    );
  }
}

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

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

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