package com.hpay.hpay_mobile_api.services;

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.amazonaws.services.s3.model.PutObjectResult;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import com.amazonaws.services.s3.model.ObjectMetadata;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.client.j2se.MatrixToImageWriter;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.io.ByteArrayInputStream;

import java.nio.file.FileSystems;
import java.nio.file.Path;

@Service
public class S3Service {

    private final AmazonS3 amazonS3;

    @Value("${aws.s3.bucketName}")
    private String bucketName;

    public S3Service(AmazonS3 amazonS3) {
        this.amazonS3 = amazonS3;
    }

    // Méthode pour télécharger une image sur S3
    public String uploadImage(MultipartFile file) throws IOException {
        String fileName = file.getOriginalFilename();

        // Vérifier si le fichier existe déjà
        if (amazonS3.doesObjectExist(bucketName, fileName)) {
            throw new RuntimeException("Le fichier existe déjà dans le bucket S3.");
        }

        // Télécharger l'image dans S3
        amazonS3.putObject(new PutObjectRequest(bucketName, fileName, file.getInputStream(), null));

        return "Fichier téléchargé avec succès : " + fileName;
    }



    public String generateQRCodeAndUploadToS3(String text, String  fileName) throws IOException, WriterException {

        int width = 300;
        int height = 300;

        BufferedImage qrImage = generateQRCodeImage(text);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(qrImage, "PNG", baos);
        byte[] imageBytes = baos.toByteArray();


        // Prepare S3 metadata
        ObjectMetadata metadata = new ObjectMetadata();
        metadata.setContentLength(imageBytes.length);
        metadata.setContentType("image/png");


        if (amazonS3.doesObjectExist(bucketName, fileName)) {
            throw new RuntimeException("Le fichier existe déjà dans le bucket S3.");
        }

        ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);

        // Télécharger l'image dans S3
        amazonS3.putObject(new PutObjectRequest(bucketName, fileName, inputStream, metadata));
        String url = amazonS3.getUrl(bucketName, fileName).toString();

        return  url;

    }



    public BufferedImage generateQRCodeImage(String text) throws WriterException {

        // QR code configuration
        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.MARGIN, 1);

        // Generate QR code matrix
        BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, 200, 200, hints);

        // Create an image from the BitMatrix
        BufferedImage image = new BufferedImage(200, 200, BufferedImage.TYPE_INT_RGB);
        image.createGraphics();
        Graphics2D graphics = (Graphics2D) image.getGraphics();
        graphics.setColor(Color.WHITE);
        graphics.fillRect(0, 0, 200, 200);
        graphics.setColor(Color.BLACK);



        for (int i = 0; i < 200; i++) {
            for (int j = 0; j < 200; j++) {
                if (bitMatrix.get(i, j)) {
                    image.setRGB(i, j, Color.BLACK.getRGB());
                }
            }
        }

        return image;
    }




}