package fr.insee.rmes.queries.geo;

import java.util.HashMap;
import java.util.Map;

import fr.insee.rmes.config.Configuration;
import fr.insee.rmes.modeles.geo.EnumTypeGeographie;
import fr.insee.rmes.queries.Queries;
import fr.insee.rmes.utils.Constants;

public class GeoQueries extends Queries {

    private static final String QUERIES_FOLDER = "geographie/";

    /* IDENTIFICATION*/
    public static String getCommuneByCodeAndDate(String code, String date) {
        return getTerritoire(code, date, EnumTypeGeographie.COMMUNE);
    }

    public static String getDepartementByCodeAndDate(String code, String date) {
        return getTerritoire(code, date, EnumTypeGeographie.DEPARTEMENT);
    }

    public static String getRegionByCodeAndDate(String code, String date) {
        return getTerritoire(code, date, EnumTypeGeographie.REGION);
    }

    public static String getArrondissementByCodeAndDate(String code, String date) {
        return getTerritoire(code, date, EnumTypeGeographie.ARRONDISSEMENT);
    }
    
    public static String getCommuneAssocieeByCodeAndDate(String code, String date) {
        return getTerritoire(code, date, EnumTypeGeographie.COMMUNE_ASSOCIEE);
    }
    
    public static String getCommuneDelegueeByCodeAndDate(String code, String date) {
        return getTerritoire(code, date, EnumTypeGeographie.COMMUNE_DELEGUEE);
    }
    
    /* LIST */
    public static String getListCommunes(String date) {
        return getTerritoire(Constants.NONE, date, EnumTypeGeographie.COMMUNE);
    }
    
    public static String getListDept(String date) {
        return getTerritoire(Constants.NONE, date, EnumTypeGeographie.DEPARTEMENT);
    }
    
    public static String getListRegion(String date) {
        return getTerritoire(Constants.NONE, date, EnumTypeGeographie.REGION);
    }
    
    public static String getListArrondissements(String date) {
        return getTerritoire(Constants.NONE, date, EnumTypeGeographie.ARRONDISSEMENT);
    }
    
    public static String getListArrondissementsMunicipaux(String date) {
        return getTerritoire(Constants.NONE, date, EnumTypeGeographie.ARRONDISSEMENT_MUNICIPAL);
    }
    
    public static String getListCommunesAssociees(String date) {
        return getTerritoire(Constants.NONE, date, EnumTypeGeographie.COMMUNE_ASSOCIEE);
    }
    
    public static String getListCommunesDeleguees(String date) {
        return getTerritoire(Constants.NONE, date, EnumTypeGeographie.COMMUNE_DELEGUEE);
    }
    
    
    /* ASCENDANT / DESCENDANT */
    public static String getAscendantsCommune(String code, String date, String type) {     
        return getAscendantOrDescendantsQuery(code, date, type, "Commune", true);
    }
    
    public static String getAscendantsDepartement(String code, String date, String type) {     
        return getAscendantOrDescendantsQuery(code, date, type, "Departement", true);
    }
    
    public static String getDescendantsCommune(String code, String date, String type) {     
        return getAscendantOrDescendantsQuery(code, date, type, "Commune", false);
    }
    
    public static String getDescendantsDepartement(String code, String date, String type) {     
        return getAscendantOrDescendantsQuery(code, date, type, "Departement", false);
    }
    
    public static String getDescendantsRegion(String code, String date, String type) {     
        return getAscendantOrDescendantsQuery(code, date, type, "Region", false);
    }


    private static String getAscendantOrDescendantsQuery(String code, String date, String type, String typeOrigine, boolean ascendant) {
        Map<String, Object> params = buildCodeAndDateParams(code, date);
        params.put("type",type);
        params.put("typeOrigine",typeOrigine);
        params.put("ascendant",String.valueOf(ascendant));
        return buildRequest(QUERIES_FOLDER, "getAscendantsOrDescendantsByCodeTypeDate.ftlh", params);
    }

    

    
    /* UTILS */
    private static String getTerritoire(String code, String date, EnumTypeGeographie typeGeo) {
        Map<String, Object> params = buildCodeAndDateParams(code, date);
        params.put("territoire",typeGeo.getTypeObjetGeo());
        params.put("chefLieu",typeGeo.getChefLieuPredicate());
        return buildRequest(QUERIES_FOLDER, "getTerritoireByCodeAndDate.ftlh", params);
    }

    private static Map<String, Object> buildCodeAndDateParams(String code, String date) {
        Map<String, Object> params = new HashMap<>();
        params.put("code", code);
        params.put("date", date);
        return params;
    }
    
    @Deprecated
    public static String getCountry(String code) {
        return "SELECT ?uri ?intitule ?intituleEntier \n"
            + "FROM <http://rdf.insee.fr/graphes/geo/cog> \n"
            + "WHERE { \n"
            + "?uri rdf:type igeo:Etat . \n"
            + "?uri igeo:codeINSEE '"
            + code
            + "'^^xsd:token . \n"
            + "?uri igeo:nom ?intitule . \n"
            + "?uri igeo:nomEntier ?intituleEntier . \n"
            // Ensure that is not the dbpedia URI
            + "FILTER (REGEX(STR(?uri), '"
            + Configuration.getBaseHost()
            + "')) \n"
            + "FILTER (lang(?intitule) = 'fr') \n"
            + "FILTER (lang(?intituleEntier) = 'fr') \n"
            + "}";
    }

    public static String getArrondissementmunicipalByCodeAndDate(String code, String formatValidParameterDateIfIsNull) {
        // TODO Auto-generated method stub
        return null;
    }

  


}

@@ -1360,32 +1360,224 @@
 ELEGUEE);%0A    %7D%0A
+    %0A    public static String getArrondissementmunicipalByCodeAndDate(String code, String date) %7B%0A        return getTerritoire(code, date, EnumTypeGeographie.ARRONDISSEMENT_MUNICIPAL);%0A    %7D%0A%0A
     %0A    /* LIST
@@ -5536,199 +5536,8 @@
  %7D%0A%0A
-    public static String getArrondissementmunicipalByCodeAndDate(String code, String formatValidParameterDateIfIsNull) %7B%0A        // TODO Auto-generated method stub%0A        return null;%0A    %7D%0A
 %0A  %0A

Add ArrMunicipal Query