/*
 *  TP1 Solution de Louis Martin
 *  Une solution parmi tant d'autres possibles
 *  2012-10-28
 */
 
 var intrants;
 var resultats;
 
 intrants = lireEtValiderParametresLigneCommande();
 if ( intrants ) {
     resultats = calculerPrixEtTaxes( intrants );
     afficherResultats( resultats );
 }
 
 // La fonction valide les paramètres de la ligne de commande
 // Elle retourne null si les paramètres ne sont pas valides
 // ou si le code du produit est absent du catalague
 // autrement elle retourne un objet contenant les paramètres
 function lireEtValiderParametresLigneCommande() {
     "use strict";
     var codeProduit;
     var quantite;
     var nombreParametres = process.argv.length;
     if ( nombreParametres < 4 ) {
         console.log( "\nCertains paramètres requis sont absents de la ligne de commade" );
         console.log( "La ligne de commande doit avoir la forme :" );
         console.log( "\tnode nom_fichier.js code_produit quantité\n" );
         return null;
     } else if ( nombreParametres > 4 ) {
         console.log( "\nLe nombre de paramètres sur la ligne de commande est plus grands que requis" );
         console.log( "Les paramètres excédentaires sont ignorés\n" );
     }
     codeProduit = process.argv[ 2 ];
     if ( getProduitPourCode( codeProduit ) === undefined ) {
         console.log( "\nAucun produit du catalogue ne correspond au code '" + codeProduit + "'\n" );
         return null;
     }
     quantite = Number( process.argv[ 3 ] );
     if ( isNaN( quantite) ) {
         console.log( "\nLe paramètre représentant la quantité ne peut être interprété comme un nombre\n" );
         return null;
     }
     return { codeProduit: codeProduit, quantite: quantite };
 }
 
 function getProduitPourCode( codeProduit ) {
     "use strict";
     var catalogueProduits = {
         '119423': { description: 'Craquelins', prix: 2.75, taxable: false },
         '248800': { description: 'Haricots blancs', prix: 2.19, taxable: false },
         '328001': { description: 'Olives farcies', prix: 1.99, taxable: false },
         '376894': { description: 'Moutarde', prix: 1.99, taxable: false },
         '383863': { description: 'Buiscuits', prix: 2.75, taxable: false },
         '435038': { description: 'Huile de tournesol', prix: 4.99, taxable: false },
         '435071': { description: 'Papier aluminium', prix: 5.39, taxable: true },
         '487603': { description: 'Vinaigre balsamique', prix: 7.49, taxable: false },
         '544411': { description: 'Pois verts', prix: 1.79, taxable: false },
         '564369': { description: 'Barres granola', prix: 3.99, taxable: false },
         '570490': { description: 'Essuie-tout', prix: 4.29, taxable: true },
         '584237': { description: 'Balai', prix: 14.69, taxable: true },
         '585578': { description: 'Brosse à vaisselle', prix: 2.29, taxable: true },
         '674385': { description: 'Bouillon', prix: 3.99, taxable: false },
         '728241': { description: 'Cornichons', prix: 2.19, taxable: false },
         '741761': { description: 'Amandes', prix: 3.49, taxable: false },
         '838314': { description: 'Sel', prix: 0.99, taxable: true },
         '867044': { description: 'Ananas dans son jus', prix: 1.25, taxable: false },
         '870326': { description: 'Lasagne', prix: 2.49, taxable: false },
         '901703': { description: 'Barres tendres', prix: 2.49, taxable: false },
         '928045': { description: 'Poivre', prix: 1.99, taxable: false },
         '954339': { description: 'Cornets gaufrés', prix: 3.99, taxable: false },
         '960827': { description: 'Diner Kraft', prix: 1.09, taxable: false },
         '085106': { description: 'Fondue au chocolat', prix: 4.19, taxable: false },
         '091247': { description: 'Détergent à vaisselle', prix: 2.99, taxable: true },
         '049840': { description: 'Café instantanné', prix: 12.99, taxable: false }
     };
     var produit = catalogueProduits[ codeProduit ];
     if ( produit === undefined ) {
         return undefined;
     } else {
         return { code: codeProduit, description: produit.description, prix: produit.prix, taxable: produit.taxable };
     }
 }
 
 function calculerPrixEtTaxes( parametres ) {
     "use strict";
     var produit = getProduitPourCode( parametres.codeProduit );
     var quantite = parametres.quantite;
     var prixAvantTaxes = normaliserDollarsCents( quantite * produit.prix );
     var tps = 0;
     var tvq = 0;
     if ( produit.taxable ) {
         tps = normaliserDollarsCents( prixAvantTaxes * 0.05 );
         tvq = normaliserDollarsCents( ( prixAvantTaxes + tps ) * 0.095 );
     }
     var prixTotal = normaliserDollarsCents( prixAvantTaxes + tps + tvq );
     return { produit: produit, quantite: quantite, prixAvantTaxes: prixAvantTaxes, tps: tps, tvq: tvq, prixTotal: prixTotal };
 }
 
 function normaliserDollarsCents( montant ) {
     "use strict";
     return Number( montant.toFixed( 2 ) );
 }
 
 function afficherResultats( resultats ) {
     "use strict";
     console.log( resultats );
 }