#!/bin/bash /usr/scripts/python.sh
# -*- coding: utf-8 -*-
# #############################################################
#                                            ..
#                       ....  ............   ........
#                     .     .......   .            ....  ..
#                   .  ... ..   ..   ..    ..   ..... .  ..
#                   .. .. ....@@@.  ..  .       ........  .
#              ..  .  .. ..@.@@..@@.  .@@@@@@@   @@@@@@. ....
#         .@@@@. .@@@@. .@@@@..@@.@@..@@@..@@@..@@@@.... ....
#       @@@@... .@@@.. @@ @@  .@..@@..@@...@@@.  .@@@@@.    ..
#     .@@@..  . @@@.   @@.@@..@@.@@..@@@   @@ .@@@@@@..  .....
#    ...@@@.... @@@    .@@.......... ........ .....        ..
#   . ..@@@@.. .         .@@@@.   .. .......  . .............
#  .   ..   ....           ..     .. . ... ....
# .    .       ....   ............. .. ...
# ..  ..  ...   ........ ...      ...
#  ................................
#
# #############################################################
"""
 cout.py

     Fonctions pour calculer le prix d'une impression
       (ne calcul que le prix de l'encre.
        retourne le prix pour une copie en A4)

 Copyright (c) 2006 by www.crans.org
"""

# Début : Ajout log pour réestimer les coûts
import time
# Fin 
import sys
import tempfile
import os
import commands
import shutil
import syslog
import stat
if '/usr/scripts' not in sys.path:
    sys.path.append('/usr/scripts')
from cranslib.deprecated import module as deprecated_module
deprecated_module()
from cranslib.utils import QuoteForPOSIX as escapeForShell
def __init__():
    pass

# ########################################################### #
#                        CONSTANTES                           #
# ########################################################### #
#
#
from gestion import config
import gestion.config.impression
COUT_UNITE_COULEUR = config.impression.c_coul
COUT_UNITE_NOIRE = config.impression.c_noir
COUT_PASSAGE_TAMBOUR_NOIR = config.impression.c_tambour_noir
COUT_PASSAGE_TAMBOUR_COULEUR = config.impression.c_tambour_coul

# Début : Ajout log pour réestimer les coûts
FICHIER_LOG="/var/log/log_couts/estimations"
# Fin 

# ########################################################### #
#                          ERREURS                            #
# ########################################################### #
#
#
class FichierInvalide(Exception):
    """
    Si le fichier est invalide
    """
    def __str__(self):
        return self.args[0]
    def file(self):
        try:
            return self.args[1]
        except:
            return "n/a"

def try_command(cmd, tmp_rep, error_msg):
    u""" Execute a command, log output and raise exception if it fails. """

    (status, rep) = commands.getstatusoutput(cmd)
    if status:
        syslog.openlog('impression')
        syslog.syslog(syslog.LOG_ERR, 'command failed (%d): %s' % (status, cmd))
        for l in rep.split('\n'):
            syslog.syslog(syslog.LOG_ERR, 'output: %s' % l)
        syslog.closelog()
        shutil.rmtree(tmp_rep)
        raise ValueError, error_msg % status

# ########################################################### #
#                       PRIX                                  #
# ########################################################### #
def base_prix(path_pdf_file, color=False):
    u""" Calcul le prix d'une impression couleur ou noir et blanc sur papier A4 """

    # nom_rep seras le dossier dans tmp ou tous les fichier créé par
    #     convert seront entreposé
    nom_rep = tempfile.mkdtemp(prefix='tmpimpr')
    nom_png = "%s/convert.png" % nom_rep # Nom prefixe et chemin des png créé par convert
    escaped_path_pdf_file = escapeForShell(path_pdf_file)
    escaped_path_ps_file = escapeForShell(path_pdf_file + ".ps")
    error_msg = "ERREUR %%d : Fichier invalide. Aucun %s cree."
    if color:
        error_msg += " (couleurs)"
        gs_device = "png16m"
        nb_composante = 4 # Cyan, Magenta, Jaune, Noir
        percent_program = "percentcolour"
    else:
        gs_device = "pnggray"
        nb_composante = 1 # Noir
        percent_program = "percentblack"

    if not os.access(path_pdf_file + ".ps",os.F_OK) or \
        os.stat(path_pdf_file)[stat.ST_MTIME] > os.stat(path_pdf_file + ".ps")[stat.ST_MTIME]:
            # Convertit les pdf en ps
            try_command("nice -n 5 pdftops %s %s" % (escaped_path_pdf_file,
                                                     escaped_path_ps_file),
                        nom_rep,
                        error_msg % "ps")

    # Convertit les ps en png (il est néscessaire de passer par un ps
    # car ghostscript refuse certain pdf)
    try_command("nice -n 5 gs -sDEVICE=%s -r30 -dBATCH -dNOPAUSE -dSAFER -dPARANOIDSAFER -dGraphicsAlphaBits=4 -dTextAlphaBits=4 -dMaxBitmap=50000000 -sOutputFile=%s%%d -q %s" %
                (gs_device, nom_png, escaped_path_ps_file),
                nom_rep,
                error_msg % "png")

    # Récupère la liste des fichiers
    list_filepng=os.listdir(nom_rep)
    # Calcule le nombre de pixel
    remplissage = [0] * (nb_composante + 1) # couleurs (N ou CMJN), nombre de pages
    for fichier in list_filepng:
        resultats = commands.getoutput("nice -n 5 /usr/scripts/impression/%s %s/%s" % (percent_program, nom_rep, fichier))
        l_resultats = resultats.split(":")
        for i in range(nb_composante):
            remplissage[i] += float(l_resultats[i])*float(l_resultats[nb_composante])
        remplissage[nb_composante] += float(l_resultats[nb_composante])

    # suppression des fichiers temporaires
    shutil.rmtree(nom_rep)

    total_noir = remplissage[nb_composante-1]
    total_couleur = sum(remplissage[0:nb_composante-1])
    faces = int(remplissage[nb_composante])

    if total_couleur > 0:
       c_total = ((COUT_PASSAGE_TAMBOUR_COULEUR + COUT_PASSAGE_TAMBOUR_NOIR) * faces  # passage dans les toners
                  + COUT_UNITE_NOIRE * total_noir                                     # cout encre noire
                  + COUT_UNITE_COULEUR * total_couleur)                               # cout encre couleur
    else: # Pas de couleur, malgre l'indication
        c_total = (COUT_PASSAGE_TAMBOUR_NOIR * faces  # passage dans les toners
                   + COUT_UNITE_NOIRE * total_noir)   # cout encre noire

    # Début : Ajout log pour réestimer les coûts
    fichier_log_est=open(FICHIER_LOG,"a")
    fichier_log_est.write("%d %d %3d %10.3f %10.3f %s\n" % (time.time(), color, faces, total_noir, total_couleur, path_pdf_file) )
    fichier_log_est.close()
    # Fin 

    return (float(c_total)/100, faces)

# ########################################################### #
#                       PRIX COULEURS                         #
# ########################################################### #
#
# Clacul le prix d'une impression couleur
#
def base_prix_couleurs(path_pdf_file):
    """
    Clacul le prix d'une impression couleur   sur papier A4 pour le fichier path_pdf_file
    """
    return base_prix(path_pdf_file, color=True)

# ########################################################### #
#                          PRIX N&B                           #
# ########################################################### #
#
# calcul le prix d'une impression en noir et blanc
#
def base_prix_nb(path_pdf_file):
    """
    Clacul le prix d'une impression noire et blanc sur papier A4 pour le fichier path_pdf_file
    """
    return base_prix(path_pdf_file, color=False)
