import { Injectable, NestMiddleware } from '@nestjs/common';
import { Request, Response, NextFunction } from 'express';

@Injectable()
export class LanguageMiddleware implements NestMiddleware {
  use(req: Request, res: Response, next: NextFunction) {
    // Get language from Accept-Language header
    let lang = req.headers['accept-language'] as string;

    // Extract the primary language from the header (e.g., "en-US,en;q=0.9" -> "en")
    if (lang) {
      // Handle various Accept-Language formats like "en-US", "en;q=0.9", etc.
      const primaryLang = lang.split(',')[0].split(';')[0].substring(0, 2);
      lang = primaryLang;
    }

    // Validate language - if invalid, default to 'en'
    if (!this.isValidLanguage(lang)) {
      lang = 'en';
    }

    // Priority order:
    // 1. Header language
    // 2. User.language (if authenticated)
    // 3. Default = en
    
    // If user is authenticated, check for user's language preference
    if (req.user_data && req.user_data.language && this.isValidLanguage(req.user_data.language)) {
      req.lang = req.user_data.language;
    } else {
      req.lang = lang;
    }

    next();
  }

  private isValidLanguage(lang: string): boolean {
    return ['en', 'hi'].includes(lang);
  }
}
