import { Request, Response } from "express";
import S3Service from "../../config/S3Service";
import { sendSuccessResponse, sendErrorResponse } from "../../utills/response";
import { validateFile } from "../../utills/fileValidation";


export const uploadFileToS3 = async (req: Request, res: Response) => {
  try {
    if (!req.file) {
      return sendErrorResponse(res, 400, "No file uploaded");
    }

    const file = req.file;
    const folder = req.body.folder ?? "uploads";

    if (!file.buffer || !file.originalname || !file.mimetype) {
      return sendErrorResponse(res, 400, "Invalid file data");
    }

    const validation = await validateFile(file.buffer);
    if (!validation.valid) {
      return sendErrorResponse(res, 400, validation.message ?? "Invalid file");
    }

    const s3Service = S3Service.getInstance();
    const { url, key } = await s3Service.uploadFile(
      file.buffer,
      file.originalname,
      validation.detectedType ?? file.mimetype, // Use detected type from magic numbers
      folder
    );
    const responseData = {
      url,
      key,
      originalName: file.originalname,
      size: file.size,
      mimetype: validation.detectedType ?? file.mimetype,
      detectedType: validation.detectedType,
    };

    return sendSuccessResponse(res, 200, "File uploaded successfully", responseData);
  } catch (error: any) {
    console.error("Error uploading file to S3:", error);
    return sendErrorResponse(res, 500, "Failed to upload file", error.message);
  }
};


export const uploadMultipleFilesToS3 = async (req: Request, res: Response) => {
  try {

    if (!req.files || !Array.isArray(req.files) || req.files.length === 0) {
      return sendErrorResponse(res, 400, "No files uploaded");
    }

    const files = req.files as Express.Multer.File[];
    const folder = req.body.folder ?? "uploads";

    const s3Service = S3Service.getInstance();

 
    const uploadPromises = files.map(async (file, index) => {
      const validation = await validateFile(file.buffer);
      if (!validation.valid) {
        throw new Error(`File ${index + 1} (${file.originalname}): ${validation.message}`);
      }

      const { url, key } = await s3Service.uploadFile(
        file.buffer,
        file.originalname,
        validation.detectedType ?? file.mimetype, // Use detected type from magic numbers
        folder
      );

      return {
        url,
        key,
        originalName: file.originalname,
        size: file.size,
        mimetype: validation.detectedType ?? file.mimetype,
        detectedType: validation.detectedType,
      };
    });

    const uploadedFiles = await Promise.all(uploadPromises);

    return sendSuccessResponse(res, 200, "Files uploaded successfully", uploadedFiles);
  } catch (error: any) {
    console.error("Error uploading files to S3:", error);
    return sendErrorResponse(res, 500, "Failed to upload files", error.message);
  }
};


export const deleteFileFromS3 = async (req: Request, res: Response) => {
  try {
    const { key } = req.body;

    if (!key) {
      return sendErrorResponse(res, 400, "File key is required");
    }
    const s3Service = S3Service.getInstance();

    await s3Service.deleteFile(key);

    return sendSuccessResponse(res, 200, "File deleted successfully", { key });
  } catch (error: any) {
    console.error("Error deleting file from S3:", error);
    return sendErrorResponse(res, 500, "Failed to delete file", error.message);
  }
};
