<?php

namespace Garradin\Plugin\RecusFiscaux;

use Garradin\DB;
use KD2\ZipWriter;

class Utils
{
    /**
     * @return tarifs demandés
     * @param array $tarifs
     */
    public static function getTarifs($tarifs)
    {
        $db = DB::getInstance();
        $sql = sprintf(
            'SELECT id, id_service as idActivite, label, description, amount as montant
             FROM services_fees
             WHERE services_fees.%s',
            $db->where('id', $tarifs));
        return $db->get($sql);
    }

    /**
     * @return activités correspondant aux tarifs demandés
     * @param array $tarifs
     */
    public static function getActivites($tarifs)
    {
        $db = DB::getInstance();
        $sql = sprintf(
            'SELECT services.id, services.label, services.description
             FROM services
             LEFT JOIN services_fees ON services_fees.id_service = services.id
             WHERE services_fees.%s
             GROUP BY services.id',
            $db->where('id', $tarifs));
        return $db->get($sql);
    }

    /**
     * @return versements correspondants à l'année et aux tarifs donnés
     * @param $annee
     * @param array $tarifs
     */
    public static function getVersementsTarifs($annee, $tarifs)
    {
        $db = DB::getInstance();
        $sql = sprintf(
            'SELECT
                 services_fees.id as idTarif,
                 membres.id as idUser,
                 acc_transactions_lines.credit as versement,
                 acc_transactions.date
             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_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 services_fees.id, membres.nom, acc_transactions.date',
            '"%Y"',
            $annee,
            $db->where('id', $tarifs));
        return $db->get($sql);
    }

    /**
     * Versements totaux par personne pour une année donnée
     * @param année
     */
    public static function getVersementsTotaux($annee)
    {
        $sql =
            "SELECT
                 membres.id as idUser,
                 sum(acc_transactions_lines.credit) AS versement
             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 U_NOCASE;
            ";
        return DB::getInstance()->get($sql, $annee);
    }

    /**
     * @return personnes ayant versé des dons pour une année donnée
     * @param $annee
     */
    public static function getDonateurs($annee)
    {
        $sql =
            "SELECT
                 membres.id as idUser,
                 membres.nom as nom,
                 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 membres.id
             ORDER by membres.nom COLLATE U_NOCASE;
            ";
        return DB::getInstance()->get($sql, $annee);
    }

    public static function getLignesReduction($lesTaux)
    {
        foreach ($lesTaux as $elem)
        {
            /*
            $ligne = "taux " . $elem->taux . ", ligne " . $elem->ligne;
            if ($elem->remarque != "") {
                $ligne .= ", " . $elem->remarque;
            }
            $lignes[$elem->taux] = $ligne;
            */
            $lignes[$elem->taux] = $elem->remarque;
        }
        return $lignes;
    }
    public static function getLigneReduction($taux)
    {
        return $_SESSION['ligneReduction'][$taux];
    }

    /**
     * @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 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;
    }

    /**
     * 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
}