// api/generate-song-async.ts
//
// Async API endpoint for iPhone Shortcuts:
// 1. Accepts a text prompt via POST JSON
// 2. Starts song generation (returns immediately with clip IDs)
// 3. Returns clip IDs for the shortcut to poll
//
// Then use /api/check-song-status to poll for completion

import { V2GenerateRequest, V2GenerateResponse } from '../src/schemas/requests';

export const config = { runtime: 'edge' };

const SUNO_HOST = (process.env.SUNO_BASE_URL ?? '').replace(/\/+$/, '');
const SUNO_KEY = process.env.SUNO_API_KEY;

if (!SUNO_HOST || !SUNO_KEY) {
  throw new Error('SUNO_BASE_URL or SUNO_API_KEY is not set');
}

// Helper to call Suno API directly (server-side)
async function callSunoAPI(endpoint: string, method: string = 'GET', body?: any) {
  const url = `${SUNO_HOST}${endpoint}`;
  const headers: HeadersInit = {
    'Authorization': `Bearer ${SUNO_KEY}`,
    'Content-Type': 'application/json',
  };

  const response = await fetch(url, {
    method,
    headers,
    body: body ? JSON.stringify(body) : undefined,
  });

  if (!response.ok) {
    const errorText = await response.text();
    throw new Error(`Suno API error ${response.status}: ${errorText}`);
  }

  return await response.json();
}

// Generate song using Suno API (server-side version)
async function generateSongServer(prompt: string) {
  const generateRequest = V2GenerateRequest.parse({
    prompt: prompt,
  });

  const response = await callSunoAPI('/api/generate/v2-web', 'POST', generateRequest);
  return response as V2GenerateResponse;
}

export default async function handler(req: Request): Promise<Response> {
  try {
    // Only accept POST requests
    if (req.method !== 'POST') {
      return new Response(
        JSON.stringify({ 
          error: 'Method Not Allowed', 
          message: 'This endpoint only accepts POST requests' 
        }),
        { 
          status: 405,
          headers: { 'Content-Type': 'application/json' }
        }
      );
    }

    // Parse JSON body
    const body = await req.json();
    const prompt = body.prompt || body.text || body.message;

    if (!prompt || typeof prompt !== 'string') {
      return new Response(
        JSON.stringify({ 
          error: 'Bad Request', 
          message: 'Missing or invalid "prompt" field in request body' 
        }),
        { 
          status: 400,
          headers: { 'Content-Type': 'application/json' }
        }
      );
    }

    console.log(`🎵 Starting song generation with prompt: ${prompt}`);

    // Generate song - this returns immediately with clip IDs
    const generateResponse = await generateSongServer(prompt);
    
    if (!generateResponse.clips || generateResponse.clips.length === 0) {
      throw new Error('No clips returned from Suno API');
    }

    const clipIds = generateResponse.clips.map((clip) => clip.id);
    console.log('📋 Generated clips:', clipIds);

    // Return immediately with clip IDs for polling
    return new Response(
      JSON.stringify({
        success: true,
        clipIds: clipIds,
        message: 'Song generation started. Use /api/check-song-status to poll for completion.',
      }),
      {
        status: 200,
        headers: { 'Content-Type': 'application/json' },
      }
    );

  } catch (error) {
    console.error('❌ Error generating song:', error);
    
    const errorMessage = error instanceof Error ? error.message : 'Unknown error';
    
    return new Response(
      JSON.stringify({
        success: false,
        error: errorMessage,
      }),
      {
        status: 500,
        headers: { 'Content-Type': 'application/json' },
      }
    );
  }
}

