<?php

namespace Garradin;
use Garradin\Plugin\Facturation\Facture;

define('DEVIS', 0);
define('FACT', 1);
define('CERFA', 2);
define('COTIS', 3);

$db = DB::getInstance();
$facture = new Facture;
$infos = $plugin->getInfos();


// 0.2.0 - Stock le contenu en json plutôt qu'en serialized
if (version_compare($infos->version, '0.2.0', '<'))
{
    $r = (array) DB::getInstance()->get('SELECT * FROM plugin_facturation_factures');
    
    foreach ($r as $e) {
        $e->contenu =json_encode(unserialize((string) $e->contenu));
        $db->update('plugin_facturation_factures', $e, $db->where('id', (int)$e->id));
    }
}

// 0.3.0 - Migration Facturation\Config vers la table plugins
if (version_compare($infos->version, '0.3.0', '<'))
{
    $conf = $db->getAssoc('SELECT cle, valeur FROM plugin_facturation_config ORDER BY cle;');
    foreach($conf as $k=>$v)
    {
        if(!$plugin->setConfig($k, $v))
        {
            throw new UserException('Erreur dans la conversion de la configuration pour la clé : '.$k);
        }
    }
    $db->exec('DROP TABLE `plugin_facturation_config`;');
}

// 0.4.0 - Migration Facturation\Config vers la table plugins
if (version_compare($infos->version, '0.4.0', '<'))
{
    $db->exec(<<<EOT
        CREATE TABLE IF NOT EXISTS plugin_facturation_paiement
        -- Moyens de paiement
        (
            code TEXT NOT NULL PRIMARY KEY,
            nom TEXT NOT NULL
        );

        INSERT OR IGNORE INTO plugin_facturation_paiement (code, nom) VALUES ('CB', 'Carte bleue');
        INSERT OR IGNORE INTO plugin_facturation_paiement (code, nom) VALUES ('CH', 'Chèque');
        INSERT OR IGNORE INTO plugin_facturation_paiement (code, nom) VALUES ('ES', 'Espèces');
        INSERT OR IGNORE INTO plugin_facturation_paiement (code, nom) VALUES ('PR', 'Prélèvement');
        INSERT OR IGNORE INTO plugin_facturation_paiement (code, nom) VALUES ('TI', 'TIP');
        INSERT OR IGNORE INTO plugin_facturation_paiement (code, nom) VALUES ('VI', 'Virement');
        INSERT OR IGNORE INTO plugin_facturation_paiement (code, nom) VALUES ('AU', 'Autre');

            
        CREATE TABLE IF NOT EXISTS plugin_facturation_factures_tmp
        (
            id					INTEGER PRIMARY KEY,
            type_facture		INTEGER NOT NULL DEFAULT 0,
            numero				TEXT NOT NULL UNIQUE,
            receveur_membre 	INTEGER NOT NULL, -- bool
            receveur_id			INTEGER NOT NULL,
            date_emission		TEXT NOT NULL, -- CHECK (date(date_emission) IS NOT NULL AND date(date_emission) = date_emission),
            date_echeance		TEXT NOT NULL, -- CHECK (date(date_echeance) IS NOT NULL AND date(date_echeance) = date_echeance),
            reglee				INTEGER DEFAULT 0, -- bool
            archivee			INTEGER DEFAULT 0, -- bool
            moyen_paiement		TEXT NOT NULL,
            contenu 			TEXT NOT NULL,
            total   			REAL DEFAULT 0
        );

        INSERT INTO plugin_facturation_factures_tmp SELECT * FROM plugin_facturation_factures;
        DROP TABLE plugin_facturation_factures;
        ALTER TABLE plugin_facturation_factures_tmp RENAME TO plugin_facturation_factures;

EOT
);

}

// 0.6.0 - Migration Facturation\Config vers la table plugins
if (version_compare($infos->version, '0.6.0', '<'))
{
    $r = $db->first('SELECT id, total FROM plugin_facturation_factures;');
    if (strpos($r->total,'.'))
    {
        // SQL -> total integer
        $db->exec(<<<EOT
        
        CREATE TABLE IF NOT EXISTS plugin_facturation_factures_tmp
        (
            id					INTEGER PRIMARY KEY,
            type_facture		INTEGER NOT NULL DEFAULT 0,
            numero				TEXT NOT NULL UNIQUE,
            receveur_membre 	INTEGER NOT NULL, -- bool
            receveur_id			INTEGER NOT NULL,
            date_emission		TEXT NOT NULL, -- CHECK (date(date_emission) IS NOT NULL AND date(date_emission) = date_emission),
            date_echeance		TEXT NOT NULL, -- CHECK (date(date_echeance) IS NOT NULL AND date(date_echeance) = date_echeance),
            reglee				INTEGER DEFAULT 0, -- bool
            archivee			INTEGER DEFAULT 0, -- bool
            moyen_paiement		TEXT NOT NULL,
            contenu 			TEXT NOT NULL,
            total   			INTEGER DEFAULT 0
        );
        
        INSERT INTO plugin_facturation_factures_tmp SELECT * FROM plugin_facturation_factures;
        DROP TABLE plugin_facturation_factures;
        ALTER TABLE plugin_facturation_factures_tmp RENAME TO plugin_facturation_factures;
EOT
    );
    
        foreach($factures = $facture->listAll() as $k=>$f)
        {
            foreach($f->contenu as $line => $content)
		    {
                // Petit bug qui peut arriver avec des contenus mal enregistrés en db
               if (is_int($content)) 
               {
                   continue;
               }

			    $contenu[] = ['designation' => $content['designation'],
                    'prix' => (int) ($content['prix'] * 100) ];
		    }

		    $f->contenu = $contenu;
		    $data = (array) $f;
            $data['total'] = (int) ($data['total'] * 100);
		    unset($data['id']);
		    unset($data['date_emission']);
		    unset($data['date_echeance']);
            $facture->edit($f->id, $data);
		    unset($contenu);
        }
    }
}