<?php

namespace Garradin\Plugin\RecusFiscaux;

use Garradin\DB;
use KD2\ZipWriter;

class Utils
{
    /**
     * @return liste des activités
     */
    public static function getActivites()
    {
        return DB::getInstance()->get(
            "SELECT
               id as idActivite,
               label,
               description
             FROM services
             ORDER BY label"
        );
    }

    /**
     * @return liste des tarifs d'une activité
     * @param $activite : identifiant de l'activité
     */
    public static function getTarifs($activite)
    {
        return DB::getInstance()->get(
            "SELECT
             services_fees.id as idTarif,
             services_fees.label as titreTarif,
             services_fees.description as descTarif,
             services_fees.amount as montantTarif
             FROM services_fees
             WHERE services_fees.id_service = ?",
            $activite
        );
    }

    /**
     * @return liste de toutes les activités et tarifs
     */
    public static function getActivitesEtTarifs()
    {
        return DB::getInstance()->get(
            "SELECT
             services.id as idActivite,
             services.label as titreActivite,
             services.description as descActivite,
             services_fees.id as idTarif,
             services_fees.label as titreTarif,
             services_fees.description as descTarif
             FROM services
             LEFT JOIN services_fees ON services_fees.id_service = services.id
             ORDER BY services.id, services_fees.id"
        );
    }

    /**
     * @return liste de toutes les activités, tarifs et comptes associés
     */
    public static function getActivitesTarifsEtComptes()
    {
        return DB::getInstance()->get(
            "SELECT
             services.id as idActivite,
             services.label as titreActivite,
             services.description as descActivite,
             services_fees.id as idTarif,
             services_fees.label as titreTarif,
             services_fees.description as descTarif,
             acc_accounts.code as numeroCpt,
             acc_accounts.label as nomCpt
             FROM services
             LEFT JOIN services_fees ON services_fees.id_service = services.id
             LEFT JOIN acc_accounts ON services_fees.id_account = acc_accounts.id
             ORDER BY services.label"
        );
    }

    /**
     * @return tous les versements de l'année
     * @param $annee
     */
    public static function getTousLesVersements($annee)
    {
        $sql =
             "SELECT
                services.id as idActivite,
                services_fees.id as idTarif,
                services.label as activite,
                services_fees.label as tarif,
                services_fees.amount as montant,
                acc_transactions_users.id_user as idUser,
                acc_transactions_lines.credit as versement,
                membres.nom as nom,
                membres.adresse as adresse,
                membres.ville as ville,
                membres.code_postal as codePostal,
                membres.email as courriel,
                acc_transactions.date,
                acc_transactions_users.id_transaction as idTrans
              FROM acc_transactions_users
              INNER JOIN membres on acc_transactions_users.id_user = membres.id
              INNER JOIN acc_transactions on acc_transactions_users.id_transaction = acc_transactions.id
              INNER JOIN services_users on acc_transactions_users.id_service_user = services_users.id
              INNER JOIN services on services_users.id_service = services.id
              INNER JOIN services_fees on services_users.id_fee = services_fees.id
              INNER JOIN acc_transactions_lines on acc_transactions_lines.id_transaction = acc_transactions.id
              WHERE
                (strftime(\"%Y\", acc_transactions.date) = ?
              AND
                acc_transactions_lines.credit > 0)
              ORDER by services.id, services_fees.id, membres.nom, acc_transactions.date";
        return DB::getInstance()->get($sql, $annee);
    }

    /**
     * @return versements d'une année pour un ensemble de tarifs donnés
     * @param $annee
     * @param array $lesTarifs
     */
    public static function getVersementsActivite($annee, $lesTarifs)
    {
        $db = DB::getInstance();
        $sql = sprintf(
            'SELECT
                services.id as idActivite,
                services_fees.id as idTarif,
                services.label as activite,
                services_fees.label as tarif,
                services_fees.amount as montant,
                acc_transactions_users.id_user as idUser,
                acc_transactions_lines.credit as versement,
                membres.nom as nom,
                membres.adresse as adresse,
                membres.ville as ville,
                membres.code_postal as codePostal,
                membres.email as courriel,
                acc_transactions.date,
                acc_transactions_users.id_transaction as idTrans
              FROM acc_transactions_users
              INNER JOIN membres on acc_transactions_users.id_user = membres.id
              INNER JOIN acc_transactions on acc_transactions_users.id_transaction = acc_transactions.id
              INNER JOIN services_users on acc_transactions_users.id_service_user = services_users.id
              INNER JOIN services on services_users.id_service = services.id
              INNER JOIN services_fees on services_users.id_fee = services_fees.id
              INNER JOIN acc_transactions_lines on acc_transactions_lines.id_transaction = acc_transactions.id
              WHERE
                (strftime(%s, acc_transactions.date) = "%d"
              AND
                services_fees.%s
              AND
                acc_transactions_lines.credit > 0)
              ORDER by membres.nom, acc_transactions.date',
            '"%Y"',
            $annee,
            $db->where('id', $lesTarifs));
        return $db->get($sql);
    }

    /**
     * liste du total de versements par personne pour une année donnée
     * @param année
     */
    public static function getVersementsTotaux($annee) {
        $sql =
            "SELECT
                 acc_transactions_users.id_user as idUser,
                 membres.nom as nom,
                 sum(acc_transactions_lines.credit) AS montant,
                 membres.adresse as adresse,
                 membres.code_postal as codePostal,
                 membres.ville as ville
             FROM
                 acc_transactions_users,
                 membres,
                 acc_transactions
             INNER JOIN acc_transactions_lines
             ON acc_transactions_lines.id_transaction = acc_transactions.id
             WHERE (
                 strftime('%Y', acc_transactions.date) = ?
             AND
                 acc_transactions_lines.credit > 0
             AND
                 acc_transactions_users.id_transaction = acc_transactions.id
             AND
                 acc_transactions_users.id_user = membres.id
             )
             GROUP by acc_transactions_users.id_user
             ORDER by membres.nom COLLATE NOCASE;
            ";
        return DB::getInstance()->get($sql, $annee);
    }

    /**
     * @return nom de l'association
     */
    public static function getNomAsso() {
        return DB::getInstance()->first(
            "SELECT value
             FROM config
             WHERE key = 'nom_asso'"
        )->value;
    }

    /**
     * @return adresse de l'association
     */
    public static function getAdresseAsso() {
        return DB::getInstance()->first(
            "SELECT value
             FROM config
             WHERE key = 'adresse_asso'"
        )->value;
    }

    /**
     * @return liste des années fiscales
     */
    public static function getAnneesFiscales() {
        $rows = DB::getInstance()->get(
            "SELECT strftime('%Y', start_date) as annee
             FROM acc_years
             ORDER by start_date DESC"
        );
        $anneesFiscales = array();
        foreach ($rows as $row) {
            $anneesFiscales[] = $row->annee;
        }
        return $anneesFiscales;
    }

    /** TODO
     * générer les reçus
     * @param tableau des versements par personne
     */
    static function genererRecus() {
        
    }

    /**
     * enregistrer les fichiers dans une archive zip
     * @param $fileList : liste des fichiers à archiver
     * @param $year : pour générer le nom de l'archive
     * @param $archiveDir : ne sert plus
     */
    static function makeArchive(
        $fileList,
        $year,
        $archiveDir = null)
    {
        $zipFilename = "recus_dons" . $year . ".zip";
        header('Content-type: application/zip');
        header(sprintf('Content-Disposition: attachment; filename="%s"', $zipFilename));
        $zip = new ZipWriter('php://output');
        $zip->setCompression(0);
        foreach ($fileList as $fileName)
        {
            $zip->add(basename($fileName), null, $fileName);
        }
        $zip->close();
    } // makeArchive
}