package com.app.ServicesImpl;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpRequest.BodyPublishers;
import java.net.http.HttpResponse;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

import javax.persistence.EntityNotFoundException;
import javax.swing.text.DateFormatter;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.app.Dto.SouscriptionDto;
import com.app.Entity.Souscription;
import com.app.Entity.User;
import com.app.Repository.SouscriptionRepository;
import com.app.Repository.UserRepository;
import com.app.Services.SouscriptionService;
import com.app.Validations.ObjectsValidator;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

import lombok.RequiredArgsConstructor;

@Service
@RequiredArgsConstructor
public class SouscriptionServicesImpl implements SouscriptionService{
	private final SouscriptionRepository sousRepository;
	private final UserRepository userRepository;

	@Value("${hubspot.token}")
	private String token;

	@Value("${getaccept.tokenGetAccept}")
	private String tokenGetAccept;

	@Autowired
	private SouscriptionRepository souscriptionRepository;

	@Autowired
	private UserRepository usersRepository;

	private final ObjectsValidator<SouscriptionDto> objectsValidator;

	@Override
	public SouscriptionDto save(SouscriptionDto dto, String mail) {
		objectsValidator.validate(dto);
		// controle  validation
		// Optional<Department> optionaldepartement =departementRepository.findById(id)  ;
		Souscription sous = SouscriptionDto.toEntity(dto);
		Souscription savedSous= sousRepository.save(sous);
		updateHubspot(savedSous,mail);
		return SouscriptionDto.fromEntity(savedSous);
	}

	@Override
	public SouscriptionDto update(SouscriptionDto dto , String mail) {
		Long id= dto.getId();
		Souscription existingSouscription = sousRepository.findById(id).orElseThrow(()->new EntityNotFoundException(id+" not found"));
		existingSouscription.setLastStep(dto.getLastStep());
		existingSouscription.setData(dto.getData());
		Souscription savedSous= sousRepository.save(existingSouscription);
		updateHubspot(savedSous,mail);
		return SouscriptionDto.fromEntity(savedSous);
	}

	
	@Override
	public String signature(SouscriptionDto dto, String mail, String offre) {
		Long id= dto.getId();
		Souscription existingSouscription = sousRepository.findById(id).orElseThrow(()->new EntityNotFoundException(id+" not found"));
		existingSouscription.setLastStep(dto.getLastStep());
		existingSouscription.setData(dto.getData());
		Souscription savedSous= sousRepository.save(existingSouscription);
		updateHubspot(savedSous,mail);
 
        
		HttpResponse<String> r = eSing(savedSous,mail,offre);
		return r.body();
	}

	private String fetchTransaction(Long idsous) {
		String data = "{\n"
				+ "  \"filterGroups\": [\n"
				+ "    {\n"
				+ "      \"filters\": [\n"
				+ "        {\n"
				+ "          \"value\": \""+idsous+"\",\n"
				+ "          \"propertyName\": \"parcours_id\",\n"
				+ "          \"operator\": \"EQ\"\n"
				+ "        }\n"
				+ "		]\n"
				+ "    }\n"
				+ "  ],\n"
				+ "  \"sorts\": [\n"
				+ "    \"ASC\"\n"
				+ "  ],\n"
				+ "  \"properties\": [\n"
				+ "		\"dealname\",\n"
				+ "    	\"dealstage\",\n"
				+ "		\"amount\"\n"
				+ "  ],\n"
				+ "  \"limit\": 100,\n"
				+ "  \"after\": 0\n"
				+ "}";
		String urlsearch = "https://api.hubapi.com/crm/v3/objects/deals/search";
		HttpClient clientsearch = HttpClient.newHttpClient();
		HttpRequest requestsearch = HttpRequest.newBuilder()
				.uri(URI.create(urlsearch))
				.POST(BodyPublishers.ofString(data))
				.setHeader("authorization", "Bearer "+token)
				.setHeader("content-type", "application/json")
				.build();
		HttpResponse<String> responsesearch = null;
		try {
			responsesearch = clientsearch.send(requestsearch, HttpResponse.BodyHandlers.ofString());
			System.out.println(responsesearch.statusCode());

	        System.out.println("responsesearch"); 
			System.out.println(responsesearch.body()); //
			//200 {"total":0,"results":[]}
	        System.out.println("responsesearch"); 
			if (responsesearch.statusCode() == 200)
			{
				JsonObject jsonObject = JsonParser.parseString(responsesearch.body()).getAsJsonObject();
				int id = jsonObject.get("total").getAsInt();
				if (id>0) {
					JsonArray resultsArray = jsonObject.getAsJsonArray("results");

		            JsonObject value = resultsArray.get(0).getAsJsonObject();
		            return value.get("id").getAsString();
				}
			}
		} catch (IOException | InterruptedException e) {
		}
		return "";
	}
	
	private String createTransaction(String m, Long idsous, String nomTran, String montant) {
        String url = "https://api.hubapi.com/contacts/v1/contact/email/"+m+"/profile";
        HttpClient client = HttpClient.newHttpClient();
		HttpRequest request = HttpRequest.newBuilder()
			    .uri(URI.create(url))
			    .GET()
			    .setHeader("authorization", "Bearer "+token)
			    .setHeader("content-type", "application/json")
			    .build();
		HttpResponse<String> response = null;
		try {
			response = client.send(request, HttpResponse.BodyHandlers.ofString());
	    	System.out.println(response.body());
			JsonObject cont = new Gson().fromJson(response.body(), JsonObject.class);
		    JsonObject contactdata = new Gson().fromJson(cont.get("properties"), JsonObject.class);
		    String idcontact = cont.get("vid").getAsString();
		    
		    // create transaction  
			String data = "{\n"
					+ "  \"associations\": [\n"
					+ "    {\n"
					+ "      \"types\": [\n"
					+ "        {\n"
					+ "          \"associationCategory\": \"HUBSPOT_DEFINED\",\n"
					+ "          \"associationTypeId\": 3\n"
					+ "        }\n"
					+ "      ],\n"
					+ "      \"to\": {\n"
					+ "        \"id\":"+idcontact+"\n"
					+ "      }\n"
					+ "    }\n"
					+ "  ],\n"
					+ "  \"properties\": {\n"
					+ "    \"dealname\": \""+nomTran+"- Mutuelle \",\n"
					+ "    \"pipeline\": \"2780563\",\n"
					+ "    \"dealstage\": \"57058740\",\n"
					+ "    \"parcours_id\": \""+idsous+"\",\n"
					+ "    \"amount\": \""+montant+"\"\n"
					+ "  }\n"
					+ "}";
			
			String urlupdate = "https://api.hubapi.com/crm/v3/objects/deals";
			HttpClient clientupdate = HttpClient.newHttpClient();
			HttpRequest requestupdate = HttpRequest.newBuilder()
				    .uri(URI.create(urlupdate))
				    .POST(BodyPublishers.ofString(data))
				    .setHeader("authorization", "Bearer "+token)
				    .setHeader("content-type", "application/json")
				    .build();
			HttpResponse<String> responseupdate = null;
			try {
				responseupdate = clientupdate.send(requestupdate, HttpResponse.BodyHandlers.ofString());
				 System.out.println(responseupdate.statusCode());
				 System.out.println(responseupdate.body());
				if (responseupdate.statusCode() == 201)
				{
					JsonObject jsonObject = JsonParser.parseString(responseupdate.body()).getAsJsonObject();
					String id = jsonObject.get("id").getAsString();
					return id;
				}

			} catch (IOException | InterruptedException e) {
			}
			return "";
			// end creation tr
		} catch (IOException | InterruptedException e) {
		}
		return "";		
	}
	
	protected List<Map<String, String>> customFields = new ArrayList<>();

    private void addCustomFields(String data, String prefix) {
        List<Map<String, String>> c = new ArrayList<>();
        for (int i = 0; i < data.length(); i++) {
            char v = data.charAt(i);
            Map<String, String> field = new HashMap<>();
            field.put("name", prefix + i);
            field.put("value", String.valueOf(v));
            customFields.add(field);
        }
    }
    
    private Map<String, String> createField(String name, String value) {
        Map<String, String> field = new HashMap<>();
        field.put("name", name);
        field.put("value", value);
        return field;
    }
    
    private String sexFunction(String sex) {
        switch(sex){        
	        case "Mlle":
	        case "Mme":
	        	return "f";
	        case "M.":
	        	return "m";
        }
		return null;
    }
    
    private String formatDate(String dateString) {
        SimpleDateFormat originalFormat = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat desiredFormat = new SimpleDateFormat("dd/MM/yyyy");
        try {
            Date date = originalFormat.parse(dateString);
            return desiredFormat.format(date);
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }
    
    private String repDate(String dateString) {
    	String date = formatDate(dateString);
    	System.out.println("/");
    	System.out.println(dateString);
    	System.out.println(date);
    	System.out.println("/");
    	String dateSansTirets = date.replace("/", "");
    	return dateSansTirets;
    }
    
    private String getEtatCivil(String etatCivil) {
        switch (etatCivil) {
            case "single":
                return "Célibataire";
            case "married":
                return "Marié(e)";
            case "concubinage":
                return "Concubinage";
            case "pacs":
                return "Pacsé(e)";
            case "widower":
                return "Veuf(ve)";
            case "divorced":
                return "Divorcé(e)";
            case "separated":
                return "Séparé(e)";
            default:
                return "";
        }
    }
    
    private String regimeChecked(String r) {
        switch (r) {
            case "alsace_moselle":
            case "retraite_alsace_moselle":
                return "am";
            case "agricole":
            case "salarie_agricole":
                return "a";
            case "retraite_tns":
            case "tns":
                return "t";
            case "salarie":
            case "fonction_publique":
            case "retraite_salarie":
            case "etudiant":
                return "s";
            default:
                return null;
        }
    }
    
    private String getRegime(String r) {
        switch (r) {
            case "alsace_moselle":
                return "Alsace-Moselle";
            case "retraite_alsace_moselle":
                return "Retraité Alsace-Moselle";
            case "agricole":
                return "Exploitant Agricole";
            case "salarie_agricole":
                return "Salarié Agricole";
            case "retraite_tns":
                return "Retraité TNS";
            case "tns":
                return "TNS Indépendant";
            case "salarie":
                return "Salarié";
            case "fonction_publique":
                return "Fonctionnaire";
            case "retraite_salarie":
                return "Retraité salarié";
            case "etudiant":
                return "Etudiant";
            default:
                return null;
        }
    }
	
    private HttpResponse<String> eSing(Souscription souscription, String m, String dataoffre)
	{		
		JsonObject offre = new Gson().fromJson(dataoffre, JsonObject.class);		
		JsonObject datasous = new Gson().fromJson(souscription.getData(), JsonObject.class);
	    JsonObject assure = new Gson().fromJson(datasous.get("assure"), JsonObject.class);
	    JsonObject conjoint = new Gson().fromJson(datasous.get("conjoint"), JsonObject.class);
	    String enfants = datasous.get("enfants").getAsString();
	    double montant = offre.get("price").getAsDouble();
	    String mailAssuree=datasous.get("emailAssure").getAsString();
        double cotis_annuelle =  montant * 12;        
        BigDecimal arrondi = new BigDecimal(cotis_annuelle);
        arrondi = arrondi.setScale(2, RoundingMode.HALF_UP);
        double cotis_annuelle_arrondie = arrondi.doubleValue();
		customFields = new ArrayList<>();
		String niveau =offre.get("niveau").getAsString();
		double sous_tota= montant;
		String priceproduit ="";
		
		if (offre.has("priceat")){
			customFields.add(createField("ijh", "X" ));
			sous_tota= montant - offre.get("priceat").getAsDouble();
			priceproduit = offre.get("priceat").getAsString()+" €";
			JsonArray pricerenfortArray = offre.getAsJsonArray("pricerenfort");
	        if (pricerenfortArray.size() > 0) {
	            JsonObject value = pricerenfortArray.get(0).getAsJsonObject();
	            niveau = value.get("niveau").getAsString();

	        }
        }
		customFields.add(createField("montant", montant+" €"));
		customFields.add(createField("cotis_ann", cotis_annuelle_arrondie+" €"));
		customFields.add(createField("priceproduit", priceproduit));
		customFields.add(createField("sous_tota", sous_tota+" €"));//["name" => "sous_tota", "value" => $sous_tota],
		customFields.add(createField("maiden_name_assure",  assure.get("nomJenueFille").getAsString()+" €"));
		customFields.add(createField("assu_"+sexFunction(assure.get("civiliteAssure").getAsString()), "X"));
		customFields.add(createField("lastname_assure",  datasous.get("nom").getAsString()));
		customFields.add(createField("firstname_assure",  datasous.get("prenom").getAsString()));
		customFields.add(createField("date_naissance_ass", formatDate(assure.get("dateNaissanceAssure").getAsString()) ));
		customFields.add(createField("email_assure", mailAssuree ));
		customFields.add(createField("nationalite_as", " ")); //["name" => "nationalite_as", "value" => $info["nationalite_assure"]],
		customFields.add(createField("situation_assure", getEtatCivil(assure.get("etatCivilAssure").getAsString() ) ));
		customFields.add(createField("cat_profe_assure", assure.get("categorieAssure").getAsString() ));
		customFields.add(createField("profession_assure", assure.get("professionAssure").getAsString() ));
		customFields.add(createField("telephone_contact", datasous.get("numeroTelephone").getAsString() ));
		customFields.add(createField("telephone_fixe", "" ));
		customFields.add(createField("adresse1_contact", assure.get("adresseAssure").getAsString() ));
		customFields.add(createField("ville_assure", assure.get("villeAssure").getAsString() ));
		customFields.add(createField("pays_contact", assure.get("paysAssure").getAsString() ));
		customFields.add(createField("code_postal_contact", datasous.get("adresse").getAsString() ));
		customFields.add(createField("city_birth", assure.get("communeNaissanceAssure").getAsString() ));
		customFields.add(createField("country_birth", assure.get("paysNaissanceAssure").getAsString()  ));
		customFields.add(createField("regime_ass", getRegime( assure.get("regime").getAsString() ) ));
		customFields.add(createField("regime_ass_"+regimeChecked( assure.get("regime").getAsString() ), "X"));
		customFields.add(createField(niveau, "X" ));		
		customFields.add(createField("iban", datasous.get("iban").getAsString() ));
		customFields.add(createField("bic", datasous.get("bic").getAsString() ));
		customFields.add(createField("DP"+ datasous.get("jourPrelevement").getAsString(), "X" ));
		
		if (datasous.get("jourPrelevement").getAsString().length()==1) {
			addCustomFields("0"+datasous.get("bic").getAsString() , "DPi");
		}else {
			addCustomFields(datasous.get("bic").getAsString() , "DPi");
		}
		
		addCustomFields(repDate (datasous.get("dateDebutContrat").getAsString()) , "effet");

		//if (!(offre.get("priceat").toString().isEmpty())){
		/*if (typeof (offre.get("priceat")) == 'undefined') {
			customFields.add(createField("ijh", "X" ));
		}*/

		
		if (offre.has("name_renfort")){
			customFields.add(createField(offre.get("name_renfort").toString(), "X" ));
		}
		if (offre.has("ijh")){
			customFields.add(createField("ijh", "X" ));
		}

		addCustomFields(datasous.get("numeroTelephone").getAsString() , "phone");
		addCustomFields(assure.get("codePostalNaissanceAssure").getAsString() , "CPB");
		addCustomFields(datasous.get("adresse").getAsString() , "CP");
		addCustomFields(datasous.get("iban").getAsString() , "iban");
		addCustomFields(datasous.get("bic").getAsString() , "bic");
		addCustomFields(assure.get("numeroSecSocialAssure").getAsString() , "secur_ass");
		addCustomFields(assure.get("codeOrganismeAssure").getAsString() , "numAFF_ass");
		addCustomFields(repDate (assure.get("dateNaissanceAssure").getAsString()) , "date_naissance_ass");
		//
        /*
         * 
         if ($p["identifiant"] == 'April'):
            array_push($this->customFields, ["name" => "madelin_".$info["madelin"], "value" => "X"]);
            array_push($this->customFields, ["name" => "ria_".$info["ria"], "value" => "X"]);
         endif;
         
$this->customFields = [
            ["name" => "priceproduit", "value" => $priceproduit],
         ];*/ 
        if ( !(conjoint.get("dateNaissance").getAsString().isEmpty() ) && !(conjoint.get("regime").getAsString().isEmpty() )){
        	customFields.add(createField("profession_conj", conjoint.get("professionConjoint").getAsString() ));
        	customFields.add(createField("conjfirst", conjoint.get("prenomConjoint").getAsString() ));
        	customFields.add(createField("conjlast", conjoint.get("nomConjoint").getAsString() ));
    		customFields.add(createField("conjdatenais", formatDate(conjoint.get("dateNaissance").getAsString()) ));
    		customFields.add(createField("conj_"+sexFunction(conjoint.get("civiliteConjoint").getAsString()), "X"));
    		customFields.add(createField("regime_conj", getRegime( conjoint.get("regime").getAsString() ) ));
    		customFields.add(createField("regime_conj_"+regimeChecked( conjoint.get("regime").getAsString() ), "X"));
    		addCustomFields(conjoint.get("numeroSecSocialConjoint").getAsString() , "secur_conj");
    		addCustomFields(conjoint.get("codeOrganismeConjoint").getAsString() , "numAFF_conj");
    		addCustomFields(repDate (conjoint.get("dateNaissance").getAsString()) , "conjdatenais");
    		
    		if (!(enfants.isEmpty() )){
        		customFields.add(createField("coupleenf", "X"));
    		}
    		else {
        		customFields.add(createField("coupleconj", "X"));
    		}
        }
        String nbenfants ="00";
        if ( !(enfants.isEmpty() )){
	    	JSONArray arr;
			try {
				arr = new JSONArray(enfants);
		    	List<String> list = new ArrayList<>();
		    	if(arr.length()<10){
		    		nbenfants="0"+arr.length();
		        }
		        else{
		    		nbenfants=""+arr.length();
		        }
		    	for(int i = 0; i < arr.length(); i++){
		    	    JSONObject enf = arr.getJSONObject(i);
		    		customFields.add(createField("enf_"+sexFunction(enf.getString("civiliteEnf"))+""+(i+1), "X"));
		    		customFields.add(createField("enflast"+(i+1), enf.getString("nomEnf")));
		    		customFields.add(createField("enffirst"+(i+1), enf.getString("prenomEnf")));
		    		customFields.add(createField("enfdatenais"+(i+1), formatDate(enf.getString("dateNaissance")) ));
		    		customFields.add(createField("regime_enf"+(i+1), getRegime(enf.getString("regime"))) );
		    		customFields.add(createField("regime_enf"+(i+1)+"_"+regimeChecked(enf.getString("regime")), "X") );
		    		customFields.add(createField("secur_enfant"+(i), enf.getString("numeroSecSocialEnfants")));
		    		addCustomFields(enf.getString("numeroSecSocialEnfants") , "secur_enf"+i+"_");		    		
		    		addCustomFields(enf.getString("codeOrganismeEnf") , "numAFF_enf"+(i+1)+"_");		    		
		    		addCustomFields(repDate (enf.getString("dateNaissance")) , "enfdatenais"+(i+1)+"_");
		    		
		            if ( (conjoint.get("dateNaissance").getAsString().isEmpty() ) && (conjoint.get("regime").getAsString().isEmpty() )){
		        		customFields.add(createField("coupleenf", "X"));
		            }
		    	}
			} catch (JSONException e) {
				//e.printStackTrace();
			}
	    }
		addCustomFields(nbenfants , "nbrenfants");		    		

		String nomTran= datasous.get("prenom").getAsString() +" "+datasous.get("nom").getAsString() ;
        Gson gson = new Gson();
        String jsonArray = gson.toJson(customFields); 
		HttpClient client = HttpClient.newHttpClient();   
		//+ "    \"email\": \""+m+"\",\n"
		String templateId="j248jurgxd27";
		if (offre.has("template_id")) {
			templateId=offre.get("template_id").getAsString();			
		}
		
		String dealID = fetchTransaction(souscription.getId());
        if (dealID=="") {
            dealID = createTransaction(mailAssuree,souscription.getId(),nomTran, offre.get("price").getAsString());
        }
        
		User u = souscription.getUserSous();
		String data = "{\n"
				+ "    \"name\": \"BA SEPA "+nomTran+"\",\n"
				+ "    \"type\": \"sales\",\n"
				+ "    \"value\": \""+montant+"\",\n"
				+ "    \"external_id\": \"deal_"+dealID+"\",\n"
				+ "    \"recipients\": [\n"
				+ "        {\n"
				+ "            \"email\": \""+mailAssuree+"\",\n"
				+ "            \"first_name\": \""+datasous.get("prenom").getAsString()+"\",\n"
				+ "            \"last_name\": \""+datasous.get("nom").getAsString()+"\",\n"
				+ "            \"role\": \"signer\",\n"
				+ "            \"role_name\": \"odn\"\n"
				+ "        }\n"
				+ "    ],\n"
				+ "    \"template_id\": \""+templateId+"\",\n"
				+ "    \"sender_email\": \""+u.getEmail()+"\",\n"
				+ "    \"is_automatic_sending\": false,\n"
				+ "    \"is_signing_biometric\": true,\n"
				+ "    \"omit_ip_from_certificate\": true,\n"
				+"    \"custom_fields\": " + jsonArray + "\n"  // Directly insert the JSON array
				+ "}";
		

        System.out.println(data); 
		HttpRequest request = HttpRequest.newBuilder()
		    .uri(URI.create("https://api.getaccept.com/v1/documents"))
		    .POST(BodyPublishers.ofString(data))
		    .setHeader("authorization", "Bearer "+tokenGetAccept)
		    .setHeader("content-type", "application/json")
		    .build();
		HttpResponse<String> response = null;
		try {
			response = client.send(request, HttpResponse.BodyHandlers.ofString());
			System.out.println(response.body()); 
			if (response.statusCode() == 200)
			{
				JsonObject donne = new Gson().fromJson(response.body(), JsonObject.class);
				String id = donne.get("id").getAsString();
				
				HttpRequest requestSeal = HttpRequest.newBuilder()
						.uri(URI.create("https://api.getaccept.com/v1/documents/"+id+"/seal"))
					    .POST(BodyPublishers.ofString(data))
					    .setHeader("authorization", "Bearer "+tokenGetAccept)
					    .setHeader("content-type", "application/json")
					    .build();
				HttpResponse<String> responseSeal = null;
				responseSeal = client.send(requestSeal, HttpResponse.BodyHandlers.ofString());
				if (responseSeal.statusCode() == 200)
				{
					//System.out.println(responseSeal.body());
					return responseSeal;
				}
			}
			return response;
		} catch (IOException | InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return response;
	}
	
	@Override
	public String signatureStatut(String id) {
		HttpResponse<String> r = documentStatuts(id);
		return r.body();
	}
	
	private HttpResponse<String> documentStatuts(String id)
	{
		HttpRequest request = HttpRequest.newBuilder()
				.uri(URI.create("https://api.getaccept.com/v1/documents/"+id+"/status"))
			    .GET()
			    .setHeader("authorization", "Bearer "+tokenGetAccept)
			    .setHeader("content-type", "application/json")
			    .build();
		HttpResponse<String> response = null;
		HttpClient client = HttpClient.newHttpClient();  
		try {
			response = client.send(request, HttpResponse.BodyHandlers.ofString());
			if (response.statusCode() == 200)
			{
				return response;
			}
			return response;
		} catch (IOException | InterruptedException e) {
			//e.printStackTrace();
		}
		return null;		
	}
	
	private HttpResponse<String> createHubspot(Souscription souscription, String m) throws IOException, InterruptedException
	{
		HttpClient client = HttpClient.newHttpClient();//parcours_mutuelle
		DateTimeFormatter isoFormatter = DateTimeFormatter.ISO_DATE_TIME;
        LocalDate localDate = LocalDate.parse(souscription.getCreatedAt().toString(), isoFormatter);
        long creationdate= Instant.parse( localDate+"T00:00:00.000Z" ).getEpochSecond()*1000;
        String lien="<a href='https://comparateur.slc-assurances.fr/etape"+souscription.getLastStep()+"/"+souscription.getSourceCompagneSouscrip().getId()+"/"+souscription.getId()+"' >Lien</a>";
		String data ="{\n"
				+ "  \"properties\": {\n"
				+ "    \"email\": \""+m+"\",\n"
				+ "    \"lead_source__mutuelle_\": \"parcours_mutuelle\",\n"
				+ "    \"date_d_insertion\": \""+creationdate+"\",\n"
				+ "    \"id_souscription\": \""+souscription.getId()+"\",\n"
				+ "    \"lien\": \""+lien+"\",\n"
				+ "    \"last_step\": \""+souscription.getLastStep()+"\"\n"
				+ "  }\n"
				+ "}";

		HttpRequest request = HttpRequest.newBuilder()
		    .uri(URI.create("https://api.hubapi.com/crm/v3/objects/contacts"))
		    .POST(BodyPublishers.ofString(data))
		    .setHeader("authorization", "Bearer "+token)
		    .setHeader("content-type", "application/json")
		    .build();

		HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

		return response;
	}

	private Souscription updateHubspot(Souscription souscription, String m)
	{
		Map<String, String> postData = new HashMap<>();
		Map<String, String> post = new HashMap<>();

	    postData.put("property", "date_d_insertion");
	    postData.put("value", souscription.getCreatedAt().toString());
	    post.put("properties", postData.get(0));

	        DateTimeFormatter isoFormatter = DateTimeFormatter.ISO_DATE_TIME;
	        LocalDate localDate = LocalDate.parse(souscription.getCreatedAt().toString(), isoFormatter);
	        long creationdate= Instant.parse( localDate+"T00:00:00.000Z" ).getEpochSecond()*1000;

	        int step = Integer.parseInt(souscription.getLastStep()) +1;
	        String lien="<a href='https://comparateur.slc-assurances.fr/etape"+souscription.getLastStep()+"/"+souscription.getSourceCompagneSouscrip().getId()+"/"+souscription.getId()+"' >Lien</a>";

	        JsonObject data = new Gson().fromJson(souscription.getData(), JsonObject.class);

		    JsonObject assure = new Gson().fromJson(data.get("assure"), JsonObject.class);
		    JsonObject conjoint = new Gson().fromJson(data.get("conjoint"), JsonObject.class);
		    String enfants = data.get("enfants").getAsString();

	        String donne =
	        		"<ul>"
		        		+ "<li><strong>Le choix :</strong> "+data.get("choix").getAsString()+ "</li>"
		        		+ "<li><strong>Email d'Assuré :</strong> "+data.get("emailAssure").getAsString()+ "</li>"
		        		+ "<li><strong>Date Début du Contrat:</strong> "+data.get("dateDebutContrat").getAsString()+ "</li>"
		        		+ "<li><strong>Date de Naissance d'Assuré :</strong> "+assure.get("dateNaissanceAssure").getAsString()+ "</li>"
		        		+ "<li><strong>Régime d'Assuré :</strong> "+assure.get("regime").getAsString()+ "</li>"
				        + "<li><strong>Code Postal :</strong> "+data.get("adresse").getAsString()+ "</li>"
		        		+ "<li><strong>Nom :</strong> "+data.get("nom").getAsString()+ "</li>"
		        		+ "<li><strong>Prénom:</strong> "+data.get("prenom").getAsString()+ "</li>"
		        		+ "<li><strong>N° Téléphone :</strong> "+data.get("numeroTelephone").getAsString()+ "</li>"
	        		+ "</ul>";

	        if ( !(conjoint.get("dateNaissance").getAsString().isEmpty() ) && !(conjoint.get("regime").getAsString().isEmpty() )){
	        	donne += "<ul>"
	        				+ "<li><strong>Information Conjoint :</strong></li>"
		        			+ "<ul>"
				    	        + "<li><strong>Date de Naissance du conjoint :</strong> "+conjoint.get("dateNaissance").getAsString()+ "</li>"
				    	        + "<li><strong>Régime du conjoint :</strong> "+conjoint.get("regime").getAsString()+ "</li>"
			        		+ "</ul>"
		        		+ "</ul>";
	        }
	        if ( !(enfants.isEmpty() )){
		    	System.out.println(data.get("enfants").getAsString());
		    	JSONArray arr;
				try {
					arr = new JSONArray(enfants);
			    	List<String> list = new ArrayList<>();
		        	donne += "<ul>"
			    	        + "<li><strong>Information Enfants :</strong></li>" ;
			    	for(int i = 0; i < arr.length(); i++){
			    	    list.add(arr.getJSONObject(i).getString("dateNaissance"));
			        	donne += "<ul>"
				    	        + "<li><strong>Enfant "+(i+1)+ ":</strong></li>"
				    	        + "<li><strong>Date de Naissance :</strong> "+arr.getJSONObject(i).getString("dateNaissance")+ "</li>"
				    	        + "<li><strong>Régime :</strong> "+arr.getJSONObject(i).getString("regime")+ "</li>"
				        		+ "</ul>";
			    	}
		        	donne += "</ul>";
				} catch (JSONException e) {
					//e.printStackTrace();
				}
		    }
	        String devis="<a href='"+data.get("devis").getAsString()+"'>Devis</a>";

	        String datas ="{\n"
	        		+ "  \"properties\": [\n"
	        		+ "    {\n"
	        		+ "      \"property\": \"date_d_insertion\",\n"
	        		+ "      \"value\":\""+creationdate+"\"\n"
	        		+ "    },\n"
	        		+ "    {\n"
	        		+ "      \"property\": \"id_souscription\",\n"
	        		+ "      \"value\":\""+souscription.getId()+"\"\n"
	        		+ "    },\n"
	        		+ "    {\n"
	        		+ "      \"property\": \"last_step\",\n"
	        		+ "      \"value\":\""+souscription.getLastStep()+"\"\n"
	        		+ "    },\n"
	        		+ "    {\n"
	        		+ "      \"property\": \"data\",\n"
	        		+ "      \"value\":\""+donne+"\"\n"
	        		+ "    },\n"
	        		+ "    {\n"
	        		+ "      \"property\": \"lien_devis\",\n"
	        		+ "      \"value\":\""+devis+"\"\n"
	        		+ "    },\n"
	        		+ "    {\n"
	        		+ "      \"property\": \"devis_l\",\n"
	        		+ "      \"value\":\""+data.get("devis").getAsString()+"\"\n"
	        		+ "    },\n"
	        		+ "    {\n"
	        		+ "      \"property\": \"lien\",\n"
	        		+ "      \"value\":\""+lien+"\"\n"
	        		+ "    }\n"
	        		+ "  ]\n"
	        		+ "}";

	        String url = "https://api.hubapi.com/contacts/v1/contact/email/"+m+"/profile";
	        HttpClient client = HttpClient.newHttpClient();
			HttpRequest request = HttpRequest.newBuilder()
				    .uri(URI.create(url))
				    .GET()
				    .setHeader("authorization", "Bearer "+token)
				    .setHeader("content-type", "application/json")
				    .build();
			HttpResponse<String> response = null;
			try {
				response = client.send(request, HttpResponse.BodyHandlers.ofString());
				//System.out.println(response.statusCode());
				//System.out.println(response.body());
				if (response.statusCode() == 404)
				{
					response=createHubspot(souscription,m);System.out.println(response.statusCode());
				}
				JsonObject cont = new Gson().fromJson(response.body(), JsonObject.class);
			    JsonObject contactdata = new Gson().fromJson(cont.get("properties"), JsonObject.class);

			    //JsonObject hubspot_owner_id = new Gson().fromJson("{104647473}", JsonObject.class);

			    String json = "{ \"hubspot_owner_id\": \"104647473\"}";

			    String hubspot_owner_value = "104647473";
			    Long owner_value = (long) 104647473;
			    if (contactdata.get("hubspot_owner_id")!=null)
			    {
			    	JsonObject hubspot_owner_id = new Gson().fromJson(contactdata.get("hubspot_owner_id"), JsonObject.class);
			    	 owner_value = Long.parseLong(hubspot_owner_id.get("value").getAsString());
			    	 hubspot_owner_value = hubspot_owner_id.get("value").getAsString();
			    }
			    //104647473
			    //Long owner_value = Long.parseLong(hubspot_owner_id.get("value").getAsString());

			    //String hubspot_owner_value = hubspot_owner_id.get("value").getAsString();
				Optional<User> existingUser = userRepository.findByIdentifiant(hubspot_owner_value);
				User user ;
				if (existingUser.isPresent()) {
					user = existingUser.get();
				}else {
					user = getInfoOwner (owner_value);
				}
				souscription.setUserSous(user);
				sousRepository.save(souscription); 
			} catch (IOException | InterruptedException e) {
			}

			String urlupdate = "https://api.hubapi.com/contacts/v1/contact/email/"+m+"/profile";
			HttpClient clientupdate = HttpClient.newHttpClient();
			HttpRequest requestupdate = HttpRequest.newBuilder()
				    .uri(URI.create(urlupdate))
				    .POST(BodyPublishers.ofString(datas))
				    .setHeader("authorization", "Bearer "+token)
				    .setHeader("content-type", "application/json")
				    .build();
			HttpResponse<String> responseupdate = null;
			try {
				responseupdate = clientupdate.send(requestupdate, HttpResponse.BodyHandlers.ofString());
				//System.out.println(responseupdate.statusCode());
				//System.out.println(responseupdate);
				if (responseupdate.statusCode() == 404)
				{
					createHubspot(souscription,m);
				}
				return souscription;
			} catch (IOException | InterruptedException e) {
			}
			return null;
	}

	private User getInfoOwner (Long id) {
		String url = "https://api.hubapi.com/crm/v3/owners/"+id;
        HttpClient client = HttpClient.newHttpClient();
		HttpRequest request = HttpRequest.newBuilder()
			    .uri(URI.create(url))
			    .GET()
			    .setHeader("authorization", "Bearer "+token)
			    .setHeader("content-type", "application/json")
			    .build();
		HttpResponse<String> response = null;
		try {
			response = client.send(request, HttpResponse.BodyHandlers.ofString());
			System.out.println(response.body());

			JsonObject data = new Gson().fromJson(response.body(), JsonObject.class);
		    String email = data.get("email").getAsString();
		    String lastname = data.get("lastName").getAsString();
		    String firstname = data.get("firstName").getAsString();

		    User user = new User();
		    user.setEmail(email);
		    user.setIdentifiant(""+id);
		    user.setLastname(lastname);
		    user.setFirstname(firstname);
		    User savedUser= userRepository.save(user);
		    String [] arr = {email, lastname,firstname} ;
		    return savedUser;
		} catch (IOException | InterruptedException e) {
		}

		return null;
	}
	
	@Override
	public String signatureresili(SouscriptionDto dto, String mail, String offre) {
		
		Long id= dto.getId();
		Souscription existingSouscription = sousRepository.findById(id).orElseThrow(()->new EntityNotFoundException(id+" not found"));
		existingSouscription.setLastStep(dto.getLastStep());
		existingSouscription.setData(dto.getData());
		Souscription savedSous= sousRepository.save(existingSouscription);
		updateHubspot(savedSous,mail); 
		HttpResponse<String> r = eSingresiliation(savedSous,mail,offre);

		return r.body();
	}
		
	@Override
	public String signaturedevoir(SouscriptionDto dto, String mail, String offre) {
		
		Long id= dto.getId();
		Souscription existingSouscription = sousRepository.findById(id).orElseThrow(()->new EntityNotFoundException(id+" not found"));
		existingSouscription.setLastStep(dto.getLastStep());
		existingSouscription.setData(dto.getData());
		Souscription savedSous= sousRepository.save(existingSouscription);
		updateHubspot(savedSous,mail);
		String dealID = fetchTransaction(id); 
		HttpResponse<String> r = eSingdevoir(savedSous,mail,offre);

		return r.body();
	}
    
    private HttpResponse<String> eSingdevoir(Souscription souscription, String m, String dataoffre)
	{
		System.out.println("souscription " +souscription);
		System.out.println("mail " +m);
		//System.out.println("offre " +assure.get("nomancienmutuelle").getAsString());
		
	User u = souscription.getUserSous();
	JsonObject offre = new Gson().fromJson(dataoffre, JsonObject.class);
	JsonObject datasous = new Gson().fromJson(souscription.getData(), JsonObject.class);
    JsonObject assure = new Gson().fromJson(datasous.get("assure"), JsonObject.class);
    JsonObject conjoint = new Gson().fromJson(datasous.get("conjoint"), JsonObject.class);
    JsonObject devoir = new Gson().fromJson(datasous.get("devoir_conseils"), JsonObject.class);
    JsonObject besoins = new Gson().fromJson(datasous.get("besoins_garanties"), JsonObject.class);
    String montant = offre.get("price").getAsString();
    String mailAssuree=datasous.get("emailAssure").getAsString();
    
     
	customFields = new ArrayList<>();
	customFields.add(createField("{{deal.nom_transaction}}", datasous.get("nom").getAsString()));
	customFields.add(createField("{{deal.prenom_transaction}}", datasous.get("prenom").getAsString()));
	customFields.add(createField("{{deal.ville_transaction}}", assure.get("villeAssure").getAsString() ));
	customFields.add(createField("{{deal.adresse_postale}}", assure.get("adresseAssure").getAsString() ));
	customFields.add(createField("{{deal.code_postale_transaction}}", datasous.get("adresse").getAsString() ));
	
	
	customFields.add(createField("{{deal.nom_consieillier}}", u.getFirstname()+" "+u.getLastname()));
	customFields.add(createField("{{deal.telephone}}",  ""));
	customFields.add(createField("{{deal.date_naiss_transaction}}", assure.get("dateNaissanceAssure").getAsString()));
	customFields.add(createField("{{deal.etes___vous_une_personne_politiquement_exposee__ppe___}}", devoir.get("question_PPE").getAsString() ));
	customFields.add(createField("{{deal.avez_vous_deja_une_complementaire_sante__}}",  ""));

	if (assure.has("dateechaeanceancienmutuelle")) {
		customFields.add(createField("{{deal.date_echeance_ancienne_mutuelle}}", assure.get("dateechaeanceancienmutuelle").getAsString()));
	}
	if (assure.has("nomancienmutuelle")) {
		customFields.add(createField("{{deal.nom_ancienne_mutuelle}}", assure.get("nomancienmutuelle").getAsString()));
	}
	
	customFields.add(createField("{{deal.formule_compagnie}}", ""));
	customFields.add(createField("{{deal.nombre_de_personnes_assurees}}",  "4"));
	customFields.add(createField("{{deal.pourquoi_souhaitez_vous_comparer_votre_assurance__}}", ""));
	customFields.add(createField("{{deal.etes_vous_beneficiaire_de_la_css_acs__couverture_securite_sociale__ou_en_cours_de_demande}}", devoir.get("question_CSS_ACS").getAsString() ));
	customFields.add(createField("{{deal.beneficiez_vous_deja_d_une_mutuelle_obligatoire_}}",  "oui" ));
	customFields.add(createField("{{deal.beneficiez_vous_d_une_prise_en_charge_100_}}", devoir.get("question_ALD").getAsString() ));
	
	
	customFields.add(createField("{{deal.faites_vous_l_objet_d_une_mesure_de_curatelle_ou_de_tutelle}}", devoir.get("question_curatelle").getAsString()));
	customFields.add(createField("{{deal.hospitalisation}}",  besoins.get("hospitalisation").getAsString() +"%"));
	customFields.add(createField("{{deal.chambre_particuliere}}", "oui"));
	customFields.add(createField("{{deal.soins_de_suite}}", "oui" ));
	customFields.add(createField("{{deal.soins_medicaux}}",  besoins.get("soins_courants").getAsString() ));
	customFields.add(createField("{{deal.medicaments_pris_en_charge}}", "oui" ));
	
	
	customFields.add(createField("{{deal.medicaments_non_pris_en_charge}}", "non"));
	customFields.add(createField("{{deal.les_analyses}}",  "150%"));
	customFields.add(createField("{{deal.optique}}", besoins.get("optique").getAsString() +"%"));
	customFields.add(createField("{{deal.lentilles}}", "non"));
	customFields.add(createField("{{deal.traitement_en_laser}}",  "non" ));
	customFields.add(createField("{{deal.dentaire}}", besoins.get("dentaire").getAsString() +"%"));
	
	customFields.add(createField("{{deal.dentaire_non_pris_en_charge}}", "non"));
	customFields.add(createField("{{deal.dentaire_pris_en_charge}}",  "non"));
	customFields.add(createField("{{deal.appareillage}}", "non"));
	customFields.add(createField("{{deal.petites_appareillage}}", "non" ));
	customFields.add(createField("{{deal.fauteuil_roulant}}", "non" ));
	customFields.add(createField("{{deal.aide_auditive}}", "non" ));
	
	
	customFields.add(createField("{{deal.medecine_douce}}", "non"));
	customFields.add(createField("{{deal.cure_thermale}}",  "non"));
	customFields.add(createField("{{deal.hebergement_transport}}", "non"));
	customFields.add(createField("{{deal.honoraire}}", "non" ));
	customFields.add(createField("{{deal.budget_minimum_souhaite}}",  "" ));
	customFields.add(createField("{{deal.budget_maximum_souhaite}}", "" ));
	
	
	customFields.add(createField("{{deal.proposition_1_compagnie}}",""));
	customFields.add(createField("{{deal.proposition_2_compagnie}}",  ""));
	customFields.add(createField("{{deal.proposition_3_compagnie}}", ""));
	customFields.add(createField("{{deal.proposition_1_niveau_compagnie}}", "" ));
	customFields.add(createField("{{deal.proposition_2_niveau_compagnie}}", "" ));
	customFields.add(createField("{{deal.proposition_3_niveau_compagnie}}", "" ));
	
	
	customFields.add(createField("{{deal.proposition_1_prix}}", ""));
	customFields.add(createField("{{deal.proposition_2_prix}}",  ""));
	customFields.add(createField("{{deal.proposition_3_prix}}", ""));
	customFields.add(createField("{{deal.besoins_future}}", "" ));
	customFields.add(createField("{{deal.proposition_recommandee}}",  offre.get("identifiant").getAsString() ));
	customFields.add(createField("{{deal.prise_en_charge_de_la_resiliation}}", "non" ));
	
	
	customFields.add(createField("{{deal.date_effet_du_contrat}}", datasous.get("dateDebutContrat").getAsString()));
	
	
	
	String nomTran= datasous.get("prenom").getAsString() +" "+datasous.get("nom").getAsString() ;
    Gson gson = new Gson();
    String jsonArray = gson.toJson(customFields); 
	HttpClient client = HttpClient.newHttpClient();   
	//+ "    \"email\": \""+m+"\",\n"
	
	

	String dealID = fetchTransaction(souscription.getId());
    if (dealID=="") {
        dealID = createTransaction(mailAssuree,souscription.getId(),nomTran, offre.get("price").getAsString());
    }
    
   
		String templateId="63qm6amj9963";
	String data = "{\n"
			+ "    \"name\": \"Devoir de conseil "+nomTran+"\",\n"
			+ "    \"type\": \"sales\",\n"
			+ "    \"value\": \"0\",\n"
			+ "    \"external_id\": \"deal_"+dealID+"\",\n"
			+ "    \"recipients\": [\n"
			+ "        {\n"
			+ "            \"email\": \""+mailAssuree+"\",\n"
			+ "            \"first_name\": \""+datasous.get("prenom").getAsString()+"\",\n"
			+ "            \"last_name\": \""+datasous.get("nom").getAsString()+"\",\n"
			+ "            \"role\": \"signer\",\n"
			+ "            \"role_name\": \"hubspot role\"\n"
			+ "        }\n"
			+ "    ],\n"
			+ "    \"template_id\": \""+templateId+"\",\n"
			+ "    \"sender_email\": \"najia@slc-assurances.fr\",\n"
			+ "    \"is_automatic_sending\": false,\n"
			+ "    \"is_signing_biometric\": true,\n"
			+ "    \"omit_ip_from_certificate\": true,\n"
			+"    \"custom_fields\": " + jsonArray + "\n"  // Directly insert the JSON array
			+ "}";
	

    System.out.println(data); 
	HttpRequest request = HttpRequest.newBuilder()
	    .uri(URI.create("https://api.getaccept.com/v1/documents"))
	    .POST(BodyPublishers.ofString(data))
	    .setHeader("authorization", "Bearer "+tokenGetAccept)
	    .setHeader("content-type", "application/json")
	    .build();
	HttpResponse<String> response = null;
	try {
		response = client.send(request, HttpResponse.BodyHandlers.ofString());
		System.out.println(response.body()); 
		if (response.statusCode() == 200)
		{
			JsonObject donne = new Gson().fromJson(response.body(), JsonObject.class);
			String id = donne.get("id").getAsString();
			
			HttpRequest requestSeal = HttpRequest.newBuilder()
					.uri(URI.create("https://api.getaccept.com/v1/documents/"+id+"/seal"))
				    .POST(BodyPublishers.ofString(data))
				    .setHeader("authorization", "Bearer "+tokenGetAccept)
				    .setHeader("content-type", "application/json")
				    .build();
			HttpResponse<String> responseSeal = null;
			responseSeal = client.send(requestSeal, HttpResponse.BodyHandlers.ofString());
			if (responseSeal.statusCode() == 200)
			{
				//System.out.println(responseSeal.body());
				return responseSeal;
			}
		}
		return response;
	} catch (IOException | InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

	return response;
}

    
	private HttpResponse<String> eSingresiliation(Souscription souscription, String m, String dataoffre)
	{
		System.out.println("souscription " +souscription);
		System.out.println("mail " +m);
		//System.out.println("offre " +assure.get("nomancienmutuelle").getAsString());
		
		
	JsonObject offre = new Gson().fromJson(dataoffre, JsonObject.class);
	JsonObject datasous = new Gson().fromJson(souscription.getData(), JsonObject.class);
    JsonObject assure = new Gson().fromJson(datasous.get("assure"), JsonObject.class);
    JsonObject conjoint = new Gson().fromJson(datasous.get("conjoint"), JsonObject.class);
    String montant = offre.get("price").getAsString();
    String mailAssuree=datasous.get("emailAssure").getAsString();
    
    
    System.out.println("assure ancien mut " +assure.get("nomancienmutuelle").getAsString());
	customFields = new ArrayList<>();
	customFields.add(createField("{{deal.nom_transaction}}", datasous.get("nom").getAsString()));
	customFields.add(createField("{{deal.prenom_transaction}}",  datasous.get("prenom").getAsString()));
	customFields.add(createField("{{deal.nom_ancienne_mutuelle}}", assure.get("nomancienmutuelle").getAsString()));
	customFields.add(createField("{{deal.numero_contrat_ancienne_mutuelle}}", assure.get("numeroanciencontrat").getAsString()));
	customFields.add(createField("{{deal.ville_transaction}}", assure.get("villeAssure").getAsString() ));
	customFields.add(createField("{{deal.adresse_postale}}",  assure.get("adresseAssure").getAsString() ));
	customFields.add(createField("{{deal.code_postale_transaction}}", datasous.get("adresse").getAsString() ));
	customFields.add(createField("{{deal.produit_demande}}", "Mutuelle"));
	customFields.add(createField("{{deal.numero_de_securite_sociale}}", assure.get("numeroSecSocialAssure").getAsString() ));
	customFields.add(createField("{{deal.adresse_ancienne_mutuelle}}", assure.get("adresseanciennemutuelle").getAsString())); //["name" => "nationalite_as", "value" => $info["nationalite_assure"]],
	customFields.add(createField("{{deal.compagnie_vendue_mutuelle}}", offre.get("identifiant").getAsString()  ));
	customFields.add(createField("{{deal.code_postal_ancienne_mutuelle}}", assure.get("codepostalancienmutuelle").getAsString() ));
	customFields.add(createField("{{deal.ville_ancienne_mutuelle}}", assure.get("villeancienmutuelle").getAsString() ));
	

	String nomTran= datasous.get("prenom").getAsString() +" "+datasous.get("nom").getAsString() ;
    Gson gson = new Gson();
    String jsonArray = gson.toJson(customFields); 
	HttpClient client = HttpClient.newHttpClient();   
	//+ "    \"email\": \""+m+"\",\n"
	

	String dealID = fetchTransaction(souscription.getId());
    if (dealID=="") {
        dealID = createTransaction(mailAssuree,souscription.getId(),nomTran, montant);
    }
	    User u = souscription.getUserSous();
   
		String templateId="63qm6azv38dy";
	String data = "{\n"
			+ "    \"name\": \"Mandat + résiliation infra"+nomTran+"\",\n"
			+ "    \"type\": \"sales\",\n"
			+ "    \"value\": \"0\",\n"
			+ "    \"external_id\": \"deal_"+dealID+"\",\n"
			+ "    \"recipients\": [\n"
			+ "        {\n"
			+ "            \"email\": \""+mailAssuree+"\",\n"
			+ "            \"first_name\": \""+datasous.get("prenom").getAsString()+"\",\n"
			+ "            \"last_name\": \""+datasous.get("nom").getAsString()+"\",\n"
			+ "            \"role\": \"signer\",\n"
			+ "            \"role_name\": \"hubspot role\"\n"
			+ "        }\n"
			+ "    ],\n"
			+ "    \"template_id\": \""+templateId+"\",\n"
			+ "    \"sender_email\": \"a.decortes@slc-assurances.fr\",\n"
			+ "    \"is_automatic_sending\": false,\n"
			+ "    \"is_signing_biometric\": true,\n"
			+ "    \"omit_ip_from_certificate\": true,\n"
			+"    \"custom_fields\": " + jsonArray + "\n"  // Directly insert the JSON array
			+ "}";
	

    System.out.println(data); 
	HttpRequest request = HttpRequest.newBuilder()
	    .uri(URI.create("https://api.getaccept.com/v1/documents"))
	    .POST(BodyPublishers.ofString(data))
	    .setHeader("authorization", "Bearer "+tokenGetAccept)
	    .setHeader("content-type", "application/json")
	    .build();
	HttpResponse<String> response = null;
	try {
		response = client.send(request, HttpResponse.BodyHandlers.ofString());
		System.out.println(response.body()); 
		if (response.statusCode() == 200)
		{
			JsonObject donne = new Gson().fromJson(response.body(), JsonObject.class);
			String id = donne.get("id").getAsString();
			
			HttpRequest requestSeal = HttpRequest.newBuilder()
					.uri(URI.create("https://api.getaccept.com/v1/documents/"+id+"/seal"))
				    .POST(BodyPublishers.ofString(data))
				    .setHeader("authorization", "Bearer "+tokenGetAccept)
				    .setHeader("content-type", "application/json")
				    .build();
			HttpResponse<String> responseSeal = null;
			responseSeal = client.send(requestSeal, HttpResponse.BodyHandlers.ofString());
			if (responseSeal.statusCode() == 200)
			{
				//System.out.println(responseSeal.body());
				return responseSeal;
			}
		}
		return response;
	} catch (IOException | InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}

	return response;
}

	@Override
	public void delete(Long id) {
		Souscription sous = sousRepository.findById(id).orElseThrow(()->new EntityNotFoundException(id+" not found"));
		sousRepository.deleteById(id);
	}

	@Override
	public SouscriptionDto findById(Long id) {
		return sousRepository.findById(id).map(SouscriptionDto::fromEntity)
        		//map:
                .orElseThrow(() -> new EntityNotFoundException("No Employee was found with the provided ID"));
	}

	@Override
	public List<SouscriptionDto> findAllSouscription() {
		// TODO Auto-generated method stub
		return sousRepository.findAll().stream().map(SouscriptionDto::fromEntity) // convertion liste
                .collect(Collectors.toList());
	}

	@Override
	public List<SouscriptionDto> listerSousbyParcours(String nameParcours) {
		List<Souscription> sous=sousRepository.getSousByIdNameParcours(nameParcours);
		List<SouscriptionDto> empdto=sous.stream().map(emp->SouscriptionDto.fromEntity(emp)).collect(Collectors.toList());
		return empdto;
	}

	@Override
	public Long recupererIdAffaireParIdSouscription(Long idSouscription) {
        return souscriptionRepository.findAffaireIdBySouscriptionId(idSouscription);
    }

}
