import { Response } from 'express';
import { AuthenticatedRequest } from '../middlewares/auth';
import { createError, asyncHandler } from '../middlewares/errorHandler';
import { elevenLabsService } from '../services/elevenLabsService';
import logger from '../utils/logger';

/**
 * @route   GET /api/elevenlabs/signed-url/:agentId
 * @desc    Get signed URL for ElevenLabs voice conversation
 * @access  Private
 */
export const getSignedUrl = asyncHandler(async (req: AuthenticatedRequest, res: Response) => {
  const startTime = Date.now();
  
  logger.info('🌐 getSignedUrl called', {
    userId: req.user?.id,
    userRole: req.user?.role,
    agentId: req.params.agentId,
    userAgent: req.get('User-Agent'),
    origin: req.get('Origin'),
    ip: req.ip
  });

  const { agentId } = req.params;

  if (!agentId) {
    logger.warn('❌ Missing agentId parameter', { userId: req.user?.id });
    throw createError('Agent ID is required', 400);
  }

  try {
    const signedUrl = await elevenLabsService.getSignedUrl(agentId);
    
    logger.info('✅ getSignedUrl completed', {
      userId: req.user?.id,
      agentId,
      signedUrlLength: signedUrl.length,
      duration: `${Date.now() - startTime}ms`
    });

    res.json({
      success: true,
      data: { signedUrl }
    });
  } catch (error) {
    logger.error('❌ Error in getSignedUrl', {
      userId: req.user?.id,
      agentId,
      error: error instanceof Error ? error.message : 'Unknown error',
      duration: `${Date.now() - startTime}ms`
    });
    throw error;
  }
});

/**
 * @route   GET /api/elevenlabs/conversation-token/:agentId
 * @desc    Get conversation token for ElevenLabs voice conversation
 * @access  Private
 */
export const getConversationToken = asyncHandler(async (req: AuthenticatedRequest, res: Response) => {
  const startTime = Date.now();
  
  logger.info('🌐 getConversationToken called', {
    userId: req.user?.id,
    userRole: req.user?.role,
    agentId: req.params.agentId,
    userAgent: req.get('User-Agent'),
    origin: req.get('Origin'),
    ip: req.ip
  });

  const { agentId } = req.params;

  if (!agentId) {
    logger.warn('❌ Missing agentId parameter', { userId: req.user?.id });
    throw createError('Agent ID is required', 400);
  }

  try {
    const token = await elevenLabsService.getConversationToken(agentId);
    
    logger.info('✅ getConversationToken completed', {
      userId: req.user?.id,
      agentId,
      tokenLength: token.length,
      duration: `${Date.now() - startTime}ms`
    });

    res.json({
      success: true,
      data: { token }
    });
  } catch (error) {
    logger.error('❌ Error in getConversationToken', {
      userId: req.user?.id,
      agentId,
      error: error instanceof Error ? error.message : 'Unknown error',
      duration: `${Date.now() - startTime}ms`
    });
    throw error;
  }
});
