import { Request, Response } from 'express';
import { AuthenticatedRequest } from '../middleware/auth.middleware';
import { AIRecommendationsService } from '../services/ai-recommendations.service';
import { AISearchService } from '../services/ai-search.service';
import { AIGeneratorService } from '../services/ai-generator.service';
import { AIAnalyticsService } from '../services/ai-analytics.service';
import { AIChatService } from '../services/ai-chat.service';
import { ImageOptimizerService } from '../services/image-optimizer.service';
import { sendSuccess, sendError } from '../utils/response.utils';

// ==========================================
// 1. RECOMMENDATIONS
// ==========================================
export const getSimilarBooks = async (req: Request, res: Response) => {
  try {
    const bookId = req.params.bookId;
    const limit = req.query.limit ? parseInt(req.query.limit as string, 10) : 6;
    const recommendations = await AIRecommendationsService.getSimilarBooks(bookId, limit);
    return sendSuccess(res, 'Similar book recommendations retrieved', { recommendations });
  } catch (error: any) {
    return sendError(res, 'Failed to retrieve recommendations', error.message, 500);
  }
};

export const getPersonalizedRecommendations = async (req: AuthenticatedRequest, res: Response) => {
  try {
    const userId = req.user?.userId || (req.query.userId as string);
    const limit = req.query.limit ? parseInt(req.query.limit as string, 10) : 8;

    if (!userId) {
      const trending = await AIRecommendationsService.getTrendingAIRecommendations(limit);
      return sendSuccess(res, 'Trending AI recommendations retrieved', { recommendations: trending });
    }

    const recommendations = await AIRecommendationsService.getPersonalizedRecommendations(userId, limit);
    return sendSuccess(res, 'Personalized recommendations retrieved', { recommendations });
  } catch (error: any) {
    return sendError(res, 'Failed to retrieve recommendations', error.message, 500);
  }
};

export const getTrendingRecommendations = async (req: Request, res: Response) => {
  try {
    const limit = req.query.limit ? parseInt(req.query.limit as string, 10) : 8;
    const recommendations = await AIRecommendationsService.getTrendingAIRecommendations(limit);
    return sendSuccess(res, 'Trending AI recommendations retrieved', { recommendations });
  } catch (error: any) {
    return sendError(res, 'Failed to retrieve trending recommendations', error.message, 500);
  }
};

// ==========================================
// 2. SMART SEARCH & SUGGESTIONS
// ==========================================
export const smartSearch = async (req: Request, res: Response) => {
  try {
    const query = (req.query.q || req.body.query || '') as string;
    const page = req.query.page ? parseInt(req.query.page as string, 10) : 1;
    const limit = req.query.limit ? parseInt(req.query.limit as string, 10) : 20;

    const result = await AISearchService.smartSearch(query, page, limit);
    return sendSuccess(res, 'AI Smart Search results retrieved', result);
  } catch (error: any) {
    return sendError(res, 'Failed to perform smart search', error.message, 500);
  }
};

export const getSearchSuggestions = async (req: Request, res: Response) => {
  try {
    const query = (req.query.q || req.query.query || '') as string;
    const result = await AISearchService.getSearchSuggestions(query);
    return sendSuccess(res, 'Search suggestions retrieved', result);
  } catch (error: any) {
    return sendError(res, 'Failed to get search suggestions', error.message, 500);
  }
};

// ==========================================
// 3. ADMIN GENERATIVE AI SUITE
// ==========================================
export const generateDescription = async (req: Request, res: Response) => {
  try {
    const result = await AIGeneratorService.generateProductDescription(req.body);
    return sendSuccess(res, 'AI Product Description generated successfully', result);
  } catch (error: any) {
    return sendError(res, 'Failed to generate product description', error.message, 500);
  }
};

export const generateSeo = async (req: Request, res: Response) => {
  try {
    const result = await AIGeneratorService.generateSeoMetadata(req.body);
    return sendSuccess(res, 'AI SEO Metadata generated successfully', result);
  } catch (error: any) {
    return sendError(res, 'Failed to generate SEO metadata', error.message, 500);
  }
};

export const generateKeywords = async (req: Request, res: Response) => {
  try {
    const result = await AIGeneratorService.generateKeywordsAndTags(req.body);
    return sendSuccess(res, 'AI Keywords generated successfully', result);
  } catch (error: any) {
    return sendError(res, 'Failed to generate keywords', error.message, 500);
  }
};

export const generateFaqs = async (req: Request, res: Response) => {
  try {
    const result = await AIGeneratorService.generateFaqs(req.body);
    return sendSuccess(res, 'AI FAQs generated successfully', result);
  } catch (error: any) {
    return sendError(res, 'Failed to generate FAQs', error.message, 500);
  }
};

export const generateAutoTags = async (req: Request, res: Response) => {
  try {
    const result = await AIGeneratorService.generateAutoTags(req.body);
    return sendSuccess(res, 'AI Auto Tags generated successfully', result);
  } catch (error: any) {
    return sendError(res, 'Failed to generate tags', error.message, 500);
  }
};

// ==========================================
// 4. IMAGE OPTIMIZATION
// ==========================================
export const optimizeImage = async (req: Request, res: Response) => {
  try {
    const { imageUrl, width, quality } = req.body;
    if (!imageUrl) return sendError(res, 'imageUrl is required', null, 400);

    const result = ImageOptimizerService.optimizeImageUrl(imageUrl, { width, quality });
    return sendSuccess(res, 'Image optimized successfully', result);
  } catch (error: any) {
    return sendError(res, 'Failed to optimize image', error.message, 500);
  }
};

// ==========================================
// 5. BUSINESS ANALYTICS & DEMAND FORECAST
// ==========================================
export const getBusinessAnalytics = async (_req: Request, res: Response) => {
  try {
    const result = await AIAnalyticsService.getBusinessAnalytics();
    return sendSuccess(res, 'AI Business Analytics forecast retrieved', result);
  } catch (error: any) {
    return sendError(res, 'Failed to get analytics forecast', error.message, 500);
  }
};

// ==========================================
// 6. CUSTOMER CHAT ASSISTANT (RAG)
// ==========================================
export const chatWithAssistant = async (req: Request, res: Response) => {
  try {
    const { messages } = req.body;
    const result = await AIChatService.chat(messages || []);
    return sendSuccess(res, 'Assistant response generated', result);
  } catch (error: any) {
    return sendError(res, 'Failed to process chat message', error.message, 500);
  }
};
