package com.hpay.hpay_mobile_api.services;
import com.amazonaws.services.s3.model.PutObjectRequest;
import com.hpay.hpay_mobile_api.DTO.ErrorResponse;
import com.hpay.hpay_mobile_api.DTO.KycSaveRequest;
import com.hpay.hpay_mobile_api.DTO.SuccessResponse;
import com.hpay.hpay_mobile_api.Enum.KycStatus;
import com.hpay.hpay_mobile_api.entities.Client;
import com.hpay.hpay_mobile_api.entities.LoginClient;
import com.hpay.hpay_mobile_api.entities.Pays;
import com.hpay.hpay_mobile_api.entities.Ville;
import com.hpay.hpay_mobile_api.repositories.*;
import com.hpay.hpay_mobile_api.utils.SendEmail;
import jakarta.mail.MessagingException;
import jakarta.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import com.amazonaws.services.s3.AmazonS3;
import java.util.Date;
import com.hpay.hpay_mobile_api.Enum.KycStatus;

import static com.hpay.hpay_mobile_api.utils.SendEmail.sendNewKycNotification;


@Service
public class KycService {

    @Autowired
    private LoginClientRepository loginClientRepository;

    @Autowired
    private ClientRepository clientRepository;

    @Value("${aws.s3.bucketName}")
    private String bucketName;

    @Value("${client.photo.upload-dir}")
    private String uploadDir; // The directory to store photos

    @Value("${client.photo.base-url}")
    private String photoBaseUrl; // The directory to store photos

    private final AmazonS3 amazonS3;

    @Autowired
    private VilleRepository villeRepository;

    @Autowired
    private PayRepository payRepository;

    @Autowired
    private PhotoService photoService;



    public KycService (AmazonS3 amazonS3) {
        this.amazonS3 = amazonS3;
    }



    @Transactional
    public Object saveKycInfo(KycSaveRequest request) throws IOException, ParseException {


       LoginClient loginClient = loginClientRepository.findById(Long.valueOf(request.getId())).orElse(null);

       if (loginClient == null) {
            return new ErrorResponse("Client not found", 404);
       }

       // verifier le numéro de l'id
        if (clientRepository.existsByNumPiece(request.getNumero_id())) {
            return new ErrorResponse("used number", 404);
        }


        //fetch the Pays object
        Pays pays = payRepository.findById(request.getPays_id()).orElse(null);
        if (pays == null) {
            return new ErrorResponse("Pays not found", 409);
        }


        //fetch the Ville object
        Ville ville = villeRepository.findById(request.getVille_id()).orElse(null);
        if (ville == null) {
            return new ErrorResponse("Pays not found", 409);
        }


        // Convert the date string into a Date object
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date parsedDate =  dateFormat.parse(request.getDate_naiss());
        Date parsedDateExp =  dateFormat.parse(request.getDate_exp());

        Client client = loginClient.getClient();
        client.setNom(request.getNom());
        client.setPrenoms(request.getPrenom());
        client.setDateNaissance(parsedDate);
        client.setAdresse(request.getAddress());
        client.setNationalite(request.getNationalite());
        client.setSexe(request.getGenre());
        client.setPays(pays);
        client.setVille(ville);
        client.setNationalite(request.getNationalite());
        client.setLieuNaissane(request.getLieu_naiss());
        client.setTelephone(request.getTelephone1());
        client.setTelephone2(request.getTelephone2());
        client.setExpirePiece(parsedDateExp);
        client.setNumPiece(request.getNumero_id());
        client.setIdTypePiece(request.getId_type());
        client.setPieceCni(request.getId_type());
        client.setNumPieceCni(request.getNumero_id());
        client.setValider("0");



        // Upload recto to AWS S3
        /*String rectoUniqueName = UUID.randomUUID().toString() + "-" + request.getRecto().getOriginalFilename();
        amazonS3.putObject(new PutObjectRequest(bucketName, rectoUniqueName , request.getRecto().getInputStream(), null));
        String rectoUrl = amazonS3.getUrl(bucketName, rectoUniqueName).toString();*/

        String rectoUrl =  photoService.uploadPhoto(request.getRecto());
        client.setPhotoPieceRecto(rectoUrl);


        //Upload verso to AWS S3

        if(request.getVerso() != null){

            /* String versoUniqueName = UUID.randomUUID().toString() + "-" + request.getVerso().getOriginalFilename();
            amazonS3.putObject(new PutObjectRequest(bucketName, versoUniqueName , request.getVerso().getInputStream(), null));
            versoUrl= amazonS3.getUrl(bucketName, versoUniqueName).toString();*/
            String versoUrl =  photoService.uploadPhoto(request.getVerso());
            client.setPhotoPieceVerso(versoUrl);
        }




        loginClient.setClient(client);
        loginClient.setKycStatus(String.valueOf(KycStatus.EN_ATTENTE));
        loginClient = loginClientRepository.save(loginClient);

        try {
            sendNewKycNotification(client.getPrenoms() +" "+ client.getNom(), String.valueOf(client.getId()), loginClient.getLogin());
        }catch (MessagingException e) {
            e.printStackTrace();
        }

        HashMap<String, Object> map = new HashMap<>();
        map.put("data",loginClient);
        return new SuccessResponse("kyc save succesffully", 200, map );

    }



    @Transactional
    public Object UpdateKycStatus(Long idClient, String status) {

        LoginClient loginClient = loginClientRepository.findById(idClient).orElse(null);

        if (loginClient == null) {
            return new ErrorResponse("Client not found", 404);
        }

        if(!status.equals("VALIDE") && !status.equals("NON_SOUMIS") && !status.equals("NON_VALIDE") && !status.equals("EN_ATTENTE")){
            return new ErrorResponse("Status not found", 404);
        }

        loginClient.setKycStatus(status);
        loginClient= loginClientRepository.save(loginClient);

        HashMap<String, Object> map = new HashMap<>();
        map.put("data",loginClient);
        return new SuccessResponse("kyc save succesffully", 200, map );

    }








}



