/**
 * Token Estimation Routes
 * 
 * Endpoint for WordPress plugin to estimate tokens before translation
 */

import { Router, Request, Response } from 'express';
import { z } from 'zod';
import { authenticateApiKey } from '../middleware/auth';
import { apiRateLimiter } from '../middleware/rateLimiter';
import { validate } from '../middleware/validator';
import { tokenEstimator } from '../services/TokenEstimator';
import { logger } from '../utils/logger';
import { LanguageCodeSchema } from '../types';

const router = Router();

// Validation schema
const estimateSchema = z.object({
  content: z.string().min(1).max(50000),
  source_lang: LanguageCodeSchema,
  target_langs: z.array(LanguageCodeSchema).min(1).max(20),
});

/**
 * POST /v1/estimate
 * 
 * Estimate tokens for batch translation
 * 
 * @requires API Key authentication
 * @requires Rate limiting
 */
router.post(
  '/',
  authenticateApiKey,
  apiRateLimiter,
  validate(estimateSchema),
  async (req: Request, res: Response) => {
    try {
      const { content, source_lang, target_langs } = req.body;
      const userId = req.user!.userId;
      
      logger.info('Token estimation request', {
        userId,
        source_lang,
        target_langs,
        contentLength: content.length,
      });
      
      // Get batch estimate
      const result = await tokenEstimator.estimateBatch(
        content,
        source_lang,
        target_langs
      );
      
      return res.status(200).json({
        success: true,
        data: result,
        timestamp: new Date().toISOString(),
      });
    } catch (error) {
      logger.error('Token estimation error', {
        error,
        userId: req.user?.userId,
      });
      
      const errorMessage = error instanceof Error ? error.message : 'Unknown error';
      
      return res.status(500).json({
        success: false,
        error: {
          code: 'ESTIMATION_FAILED',
          message: errorMessage,
        },
        timestamp: new Date().toISOString(),
      });
    }
  }
);

export default router;
