.pragma library

.import "fonctions.js" as Fonctions             // Permet d'utiliser les fonctions classiques ci-dessous... (cf https://doc.qt.io/qt-5/qtqml-javascript-imports.html )



const LANGUE_FR = 0;
const LANGUE_EN = 1;
const LANGUE_DE = 2;
const LANGUE_ES = 3;
const LANGUE_PT = 4;
const LANGUE_NL = 5;
const LANGUE_IT = 6;
const LANGUE_LV = 7;    // Lettonie
const LANGUE_CA = 8;    // Catalan




//=====================================================================================
// Fonctions  : Renvoit le durée, en secondes, de l'une des périodes d'analyse prédéfinies.
// Reçoit :     La période d'analyse (0: 1 heure, 1: 24 heures, 2: 7 jours et 3: 30 jours)
// Retour :     La durée, en secondes
//=====================================================================================
function duree_periode_analyse(periode_analyse)
{
    var duree;

    switch(periode_analyse)
    {
        default:
        case 0 :                        // 1 heure
            duree = (1 * 1 * 60 * 60);
            break;

        case 1 :                        // 24 heures
            duree = (1 * 24 * 60 * 60);
            break;

        case 2 :                        // 7 jours
            duree = (7 * 24 * 60 * 60);
            break;

        case 3 :                        // 30 jours
            duree = (30 * 24 * 60 * 60);
            break;
    }
    return(duree)
}

//=====================================================================================
// Fonctions  : Renvoit le nom de l'une des périodes d'analyse prédéfinies.
// Reçoit :     La période d'analyse (0: 1 heure, 1: 24 heures, 2: 7 jours et 3: 30 jours)
// Retour :     Le texte du nom
//=====================================================================================
function nom_periode_analyse(periode_analyse)
{
    var nom;

    switch(periode_analyse)
    {
        default:
        case 0 :                        // 1 heure
            nom = qsTr("1 heure");
            break;

        case 1 :                        // 24 heures
            nom = qsTr("24 heures");
            break;

        case 2 :                        // 7 jours
            nom = qsTr("7 jours");
            break;

        case 3 :                        // 30 jours
            nom = qsTr("30 jours");
            break;
    }
    return(nom);
}

//=====================================================================================
// Fonctions  : Renvoit da date de début et de fin de l'intervalle en cours d'analyse.
// Reçoit :     La période d'analyse (0: 1 heure, 1: 24 heures, 2: 7 jours et 3: 30 jours)
//              La date de début et la date de fin en UTC au format JS
//              Le fuseau horaire et l'heure d'été en cours
// Retour :     La date de début et la date de fin en UTC au format JS mais ajustées à
//              la période en cours d'analyse.
//=====================================================================================
function ajustement_periode_analyse(periode_analyse, debut, fin, fuseau, heure_ete)
{
    var date_debut, date_fin;

    // Passage en heure LOCALE pour effectuer les traitements :
    date_debut = date_courante(debut, fuseau, heure_ete);     // En LOCALE
    date_fin = date_courante(fin, fuseau, heure_ete);         // EN LOCALE

    // Ajustements à l'intervalle fini d'analyse :
    switch(periode_analyse)
    {
        default:
        case 0:                         // 1 heure
            date_debut.setMinutes(Math.trunc(date_debut.getMinutes() / 5) * 5);
            date_debut.setSeconds(0);
            date_fin.setMinutes(Math.trunc(date_fin.getMinutes() / 5) * 5);
            date_fin.setSeconds(0);
            break;

        case 1:                         // 24 heures
            date_debut.setMinutes(0);
            date_debut.setSeconds(0);
            date_fin.setMinutes(0);
            date_fin.setSeconds(0);
            break;

        case 2:                         // 7 jours
            date_debut.setHours(Math.trunc(date_debut.getHours() / 6) * 6);
            date_debut.setMinutes(0);
            date_debut.setSeconds(0);
            date_fin.setHours(Math.trunc(date_fin.getHours() / 6) * 6);
            date_fin.setMinutes(0);
            date_fin.setSeconds(0);
            break;

        case 3:                         // 30 jours
            date_debut.setHours(0);
            date_debut.setMinutes(0);
            date_debut.setSeconds(0);
            date_fin.setHours(0);
            date_fin.setMinutes(0);
            date_fin.setSeconds(0);
            break;
    }

    return {
        debut: date_utc(date_debut, fuseau, heure_ete),     // Retour en UTC
        fin: date_utc(date_fin, fuseau, heure_ete)          // Retour en UTC
    }
}




//=====================================================================================
// Fonctions  : Génère une chaine de la forme "hh:mm" en heure locale à partir des
//              heures et minutes UTC reçues en paramètre
// Reçoit :     Valeur de heures et minutes, fuseau horaire
// Retour :     La chaine sur 5 caractères "hh:mm'
//=====================================================================================
function conversion_heure_minutes_locales(hr, mn, fuseau, heure_ete)
{
    var retour;
    var today = new Date;
    var date = new Date(today.getFullYear(), today.getMonth(), today.getDate(), hr, mn, 0);

    date = date_add_secondes(date, ((fuseau + heure_ete) * 60 * 60));           // Correction du fuseau horaire pour l'affichage

    retour = Fonctions.format_deux_digits(date.getHours(), '0') + ":" + Fonctions.format_deux_digits(date.getMinutes(), '0');

//console.log("Valeur reçue Hr=" + hr + " et min=" + mn + " et chaine de retour =" + retour);
    return(retour)
}


//=====================================================================================
// Fonctions  : Génère la date du moment ou convertit une date existante en tenant
//              compte du fuseau horaire reçu
// Reçoit :     La date à convertir au format JS (ou NULL si on veut la date courante), le fuseau, et le décalage heure Eté/Hiver
// Retour :     La date dans le fuseau et avec décalage Eté/Hiver, au format JS
//=====================================================================================
function date_courante(dt, fuseau, heure_ete)
{
var date;

    if (dt === null)
    {
        date = new Date;
        date = date_add_secondes(date, ((fuseau + heure_ete) * 60 * 60));           // Correction du fuseau horaire pour l'affichage
        return(date);
    }
    else
    {
        date = date_add_secondes(dt, ((fuseau + heure_ete) * 60 * 60));           // Correction du fuseau horaire pour l'affichage
        return(date);
    }
}

//=====================================================================================
// Fonctions  : Convertit une date existante en UTC
// Reçoit :     La date à convertir au format JS, le fuseau, et le décalage heure Eté/Hiver
// Retour :     La date UTC, au format JS
//=====================================================================================
function date_utc(dt, fuseau, heure_ete)
{
var date;

    if (dt === null) return (null);

    date = date_add_secondes(dt, -((fuseau + heure_ete) * 60 * 60));           // Correction du fuseau horaire et de l'heure Ete/Hiver

    return(date);
}

//=====================================================================================
// Fonctions  : Convertit une valeur d'heure en une chaine dépendant de la langue
// Reçoit :     La valeur d'heure, entre 00 et 23, ou 24 (fin de nuit), 25 (aube nautique),
//              26 (aube), 27 (lever du soleil), 28 (zénith), 29 (coucher du soleil),
//              30 (crépuscule), 31 (crépuscule nautique) ou 32 (début de nuit).
//              Et la valeur de minutes, entre 00 et 59, ou 60 (aucune minute à retourner)
// Retour :     La chaine
//=====================================================================================
function nom_heure(heure, minute)
{
    var chaine_h;
    var chaine_m;

    var texte_heures_speciales = [qsTr("Fin de nuit"), qsTr("Aube nautique"), qsTr("Aube"), qsTr("Lever du soleil"), qsTr("Zénith"), qsTr("Coucher du soleil"), qsTr("Crépuscule"), qsTr("Crépuscule nautique"), qsTr("Début de nuit")];

    if ((heure < 0) || (heure > 32)) return("---");

    if (heure < 24)
    {
        chaine_h = qsTr("%1h").arg(((heure<10) ? "0" + heure : "" + heure));
        chaine_m = "" + ((minute<10) ? "0" + minute : "" + minute);                 // On ne renvoit les minutes que si l'on n'est pas sur une heure spéciale.
    }
    else
    {
        chaine_h = texte_heures_speciales[heure - 24];
        chaine_m = "";
    }

    return (chaine_h + chaine_m);

}


//=====================================================================================
// Fonctions  : Convertit une date au format JS en une chaine au format 'hh:mm:ss'
// Reçoit :     La date à convertir
// Retour :     La chaine
//=====================================================================================
function chaine_heure(date)
{
    var retour;
    var heures = date.getHours();
    var minutes = date.getMinutes();
    var secondes = date.getSeconds();

    retour = (heures <= 9) ? "0" + heures : heures;
    retour += ":";
    retour += (minutes <= 9) ? "0" + minutes : minutes;
    retour += ":";
    retour += (secondes <= 9) ? "0" + secondes : secondes;

    return (retour);
}

//=====================================================================================
// Fonctions  : Convertit une date au format JS en une chaine au format 'hh:mm'
// Reçoit :     La date à convertir
// Retour :     La chaine
//=====================================================================================
function chaine_heure_courte(date)
{
    var retour;
    var heures = date.getHours();
    var minutes = date.getMinutes();

    retour = (heures <= 9) ? "0" + heures : heures;
    retour += ":";
    retour += (minutes <= 9) ? "0" + minutes : minutes;

    return (retour);
}

//=====================================================================================
// Fonctions  : Convertit une date au format JS en une chaine au format 'dd/MM hh:mm'
// Reçoit :     La date à convertir
// Retour :     La chaine
//=====================================================================================
function chaine_date_heure_courte(date)
{
    var retour;

    var mois = date.getMonth() + 1;                     // Les mois commencent à 0
    var jour = date.getDate();
    var heures = date.getHours();
    var minutes = date.getMinutes();

    retour = (jour <= 9) ? "0" + jour : jour;
    retour += "/";
    retour += (mois <= 9) ? "0" + mois : mois ;
    retour += " ";
    retour += (heures <= 9) ? "0" + heures : heures;
    retour += ":";
    retour += (minutes <= 9) ? "0" + minutes : minutes;

    return (retour);
}

//=====================================================================================
// Fonctions  : Convertit une date au format JS en une chaine au format 'JJ/MM/AAAA'
// Reçoit :     La date à convertir
// Retour :     La chaine
//=====================================================================================
function chaine_date(date)
{
    var retour;

    var annee = date.getFullYear();
    var mois = date.getMonth() + 1;                     // Les mois commencent à 0
    var jour = date.getDate();

    retour = (jour <= 9) ? "0" + jour : jour;
    retour += "/";
    retour += (mois <= 9) ? "0" + mois : mois ;
    retour += "/";
    retour += annee;

    return (retour);
}


//=====================================================================================
// Fonctions  : Convertit un n° de jour (1=lundi, 7=dimanche, 8=tous les jours) en une
//              chaine de jour de la semaine dépendant de la langue
// Reçoit :     Le n° du jour
// Retour :     La chaine
//=====================================================================================
function nom_jour_semaine(no)
{
    var textes_jour_semaine = [qsTr("Lundi"), qsTr("Mardi"), qsTr("Mercredi"), qsTr("Jeudi"), qsTr("Vendredi"), qsTr("Samedi"), qsTr("Dimanche"), qsTr("Tous les jours")];

    if ((no < 1) || (no > 8)) return("---");

    return (textes_jour_semaine[(no - 1)]);
}


//=====================================================================================
// Fonctions  : Convertit une date au format JS en une chaine de jour de la seamine dépendant de la langue
// Reçoit :     La date
// Retour :     La chaine
//=====================================================================================
function chaine_jour_semaine(date)
{
    var jour_semaine = date.getDay();
    if (jour_semaine === 0) jour_semaine = 7;

    return (nom_jour_semaine(jour_semaine));
}


//=====================================================================================
// Fonctions  : Convertit une date au format JS en une chaine au format 'JJ/MM/AAAA'
//              ou sa version correspondante au pays
// Reçoit :     La date à convertir, le code langue (de 1 à N - Cf 'fonctions_localisation.js')
// Retour :     La chaine
//=====================================================================================
function chaine_date_longue(date, langue)
{
    var retour = "";
    var texte_jour = "";

    var annee = date.getFullYear();
    var mois = date.getMonth() + 1;                     // Les mois commencent à 0
    var jour = date.getDate();
    var jour_semaine = date.getDay();

    var textes_mois = [qsTr("janvier"), qsTr("février"), qsTr("mars"), qsTr("avril"), qsTr("mai"), qsTr("juin"), qsTr("juillet"), qsTr("août"), qsTr("septembre"), qsTr("octobre"), qsTr("novembre"), qsTr("décembre")];

    switch(langue)
    {
        //--------------------------------------------------------
        default:
            // Mise en forme n° du jour :
            if (jour === 1) texte_jour = "1<sup>er</sup>";
            else if ((jour > 1) && (jour <= 9)) texte_jour = "0" + jour;
            else texte_jour = jour;

            retour += texte_jour;
            retour += ' ';
            retour += textes_mois[mois - 1];
            retour += ' ';
            retour += annee;

            break;

        //---------------------------------------------------------
        case LANGUE_EN:
            // Mise en forme n° du jour :
            if ((jour === 1) || (jour === 21) || (jour === 31)) texte_jour = jour + "<sup>st</sup>";
            else if ((jour === 1) || (jour === 22)) texte_jour = jour + "<sup>nd</sup>";
            else if ((jour === 3) || (jour === 23)) texte_jour = jour + "<sup>rd</sup>";
            else texte_jour = jour + "th";

            retour += texte_jour;
            retour += ' ';
            retour += textes_mois[mois - 1];
            retour += ' ';
            retour += annee;

            break;
        //---------------------------------------------------------
        case LANGUE_DE:
            // Mise en forme n° du jour :
            texte_jour = jour + ".";

            retour += texte_jour;
            retour += ' ';
            retour += textes_mois[mois - 1];
            retour += ' ';
            retour += annee;

            break;
    }

    return (retour);
}

//=====================================================================================
// Fonctions  : Convertit une date au format JS en une chaine au format 'YYY-MM-dd hh:mm:ss'
// Reçoit :     La date à convertir
// Retour :     La chaine
//=====================================================================================
function chaine_date_heure_bdd(date)
{
    var retour;

    var annee = date.getFullYear();
    var mois = date.getMonth() + 1;                     // Les mois commencent à 0
    var jour = date.getDate();
    var heures = date.getHours();
    var minutes = date.getMinutes();
    var secondes = date.getSeconds();

    retour = annee;
    retour += "-";
    retour += (mois <= 9) ? "0" + mois : mois;
    retour += "-";
    retour += (jour <= 9) ? "0" + jour : jour;
    retour += " ";
    retour += (heures <= 9) ? "0" + heures : heures;
    retour += ":";
    retour += (minutes <= 9) ? "0" + minutes : minutes;
    retour += ":";
    retour += (secondes <= 9) ? "0" + secondes : secondes;
    return (retour);
}

//=====================================================================================
// Fonctions  : Convertit la date au format JS reçue en une chaine au format 'YYMMdd_hhmmss'
// Reçoit :     La date au format JS à convertir
// Retour :     La chaine
//=====================================================================================
function chaine_date_heure_fichier(date)
{
    var retour;

    var annee = date.getYear();                         // Sur 2 digits
    var mois = date.getMonth() + 1;                     // Les mois commencent à 0
    var jour = date.getDate();
    var heures = date.getHours();
    var minutes = date.getMinutes();
    var secondes = date.getSeconds();

    retour = annee;
    retour += (mois <= 9) ? "0" + mois : mois;
    retour += (jour <= 9) ? "0" + jour : jour;
    retour += "_";
    retour += (heures <= 9) ? "0" + heures : heures;
    retour += (minutes <= 9) ? "0" + minutes : minutes;
    retour += (secondes <= 9) ? "0" + secondes : secondes;
    return (retour);
}


//=====================================================================================
// Fonctions  : Convertit une chaine provenant de la BDD ('YYY-MM-ddThh:mm:ss.000') en
//              une date au format JS
// Reçoit :     La chaine à convertir
// Retour :     La date
//=====================================================================================
function chaine_bdd_date_heure(chaine_date)
{
    var t, result = null;

   if (typeof chaine_date === 'string')
   {
      t = chaine_date.split(/[-:.T ]/);                                                      // On coupe la chaine initiale en recherchant les '-', ':', '.', ' ' et 'T'
//      console.log(t[0] + "/" + t[1] + "/" + t[2] + "//" + t[3] + "/" + t[4] + "/" + t[5]);
      result = new Date(t[0], t[1] - 1, t[2], t[3] || 0, t[4] || 0, t[5] || 0);             //when t[3], t[4] and t[5] are missing they defaults to zero
   }
   else console.log("Le type reçu dans la fonction 'chaine_bdd_date_heure' n'est pas correct");

   return result;
}


//=====================================================================================
// Fonctions  : Ajoute une quantité de secondes à une date. Si le nombre de secondes est
//              négatif, il s'agit d'une soustraction...
// Reçoit :     La date à convertir et le nombre de secondes à ajouter
// Retour :     La nouvelle date
//=====================================================================================
function date_add_secondes(date, secondes)
{
    var date_retour = new Date();

    date_retour.setTime(date.getTime() + (secondes *1000));

    return(date_retour);
}

//=====================================================================================
// Fonctions  : Convertir une valeur en ms en une chaine de durée (jour-heures-minutes-secondes)
// Reçoit :     Le nombre à convertir
// Retour :     La chaine de durée
//=====================================================================================
function chaine_duree(duree)
{
var x;

    duree = Math.abs(duree);                        // Si la valeur est négative, on prend la valeur absolue (évite les erreurs...)
    var secondes = Math.trunc(duree / 1000);        // Passage de ms en s
    var minutes = Math.trunc(secondes/60);
    var heures = Math.trunc(minutes/60);
    var jours = Math.trunc(heures/24);

    secondes = secondes % 60;
    minutes = minutes % 60;
    heures = heures % 24;

    if (jours !== 0) return(qsTr(jours + " jours," + heures + " heures"));
    else if (heures !== 0) return(qsTr(heures + " heures, " + minutes + " mins"));
    else if (minutes !== 0) return(qsTr(minutes + " mins, " + secondes + " secs"));
    else if (secondes !== 0) return(qsTr(secondes + " secondes"));
    else return("---")
}


