import multer from 'multer';
import path from 'path';
import fs from 'fs';
import { Request } from 'express';
import logger from '../utils/logger';

// Ensure uploads directory exists
const uploadsDir = path.join(__dirname, '../../uploads');
const botImagesDir = path.join(uploadsDir, 'bot-images');

if (!fs.existsSync(uploadsDir)) {
  fs.mkdirSync(uploadsDir, { recursive: true });
}

if (!fs.existsSync(botImagesDir)) {
  fs.mkdirSync(botImagesDir, { recursive: true });
}

// SIMPLE multer configuration - no complex storage or file filter
export const uploadBotImage = multer({
  dest: botImagesDir, // Use simple destination
  limits: {
    fileSize: 5 * 1024 * 1024, // 5MB limit
    files: 1 // Only one file per request
  }
}).single('image');

// Add debugging middleware
export const debugUpload = (req: Request, res: any, next: any) => {
  console.log('🔍 Upload middleware debug', {
    method: req.method,
    contentType: req.get('Content-Type'),
    hasFile: !!req.file,
    fileField: req.file?.fieldname,
    fileName: req.file?.originalname,
    fileSize: req.file?.size,
    fileMimetype: req.file?.mimetype,
    bodyKeys: Object.keys(req.body || {}),
    formDataFields: req.body ? Object.keys(req.body) : [],
    userId: (req as any).user?.id
  });
  next();
};

// Middleware to handle upload errors - SIMPLIFIED
export const handleUploadError = (err: any, req: Request, res: any, next: any) => {
  if (err instanceof multer.MulterError) {
    logger.error('❌ Multer error during file upload', {
      error: err.message,
      code: err.code,
      userId: (req as any).user?.id
    });
    
    if (err.code === 'LIMIT_FILE_SIZE') {
      return res.status(400).json({
        success: false,
        message: 'File size too large. Maximum size is 5MB.'
      });
    }
    
    if (err.code === 'LIMIT_FILE_COUNT') {
      return res.status(400).json({
        success: false,
        message: 'Too many files. Only one image is allowed.'
      });
    }
    
    return res.status(400).json({
      success: false,
      message: 'File upload error: ' + err.message
    });
  }
  
  if (err) {
    logger.error('❌ File upload error', {
      error: err.message || 'Unknown error',
      errorType: err.constructor.name,
      userId: (req as any).user?.id
    });
    
    return res.status(400).json({
      success: false,
      message: err.message || 'File upload error'
    });
  }
  
  next();
};

// Helper function to get file path for database storage
export const getImagePath = (filename: string): string => {
  return `/api/bots/image/${filename}`;
};

// Helper function to get full file path
export const getFullImagePath = (filename: string): string => {
  return path.join(botImagesDir, filename);
};

// Helper function to delete image file
export const deleteImageFile = (filename: string): boolean => {
  try {
    const fullPath = getFullImagePath(filename);
    if (fs.existsSync(fullPath)) {
      fs.unlinkSync(fullPath);
      logger.info('🗑️ Image file deleted', { filename });
      return true;
    }
    return false;
  } catch (error) {
    logger.error('❌ Error deleting image file', { filename, error });
    return false;
  }
}; 