# -*- coding:utf-8 -*-

__nom_fichier__ = "distributeur"
__author__ = "tinet1"
__date__ = "mars 2018"

"""
Exercices - Fichier

Rendre la monnaie

classe Distributeur
"""

class Distributeur:
    
    def __init__(self, monnaie, caisse):
        """
        Méthode constructeur, crée les attributs fichier_monniae_, fichier_stock_, pieces_, stock_
        :param monnaie: Fichier contenant les informations sur les pièces possibles (en centimes)
        :param caisse: Fichier contenant le stock de chaque pièce
        """
        self.fichier_monnaie_ = monnaie
        self.fichier_stock_ = caisse
        self.pieces_ = self.file2liste(monnaie)
        self.stock_ = self.file2liste(caisse)
        
    def file2liste(self, fichier):
        """
        :param fichier: Fichier contenant une liste de nombre entiers
        :return: Liste des nombres du fichier
        """
        # Ouverture du fichier
        f_in = open(fichier,'r')
        # Lecture de la liste de nombres
        ligne = f_in.readline().split()
        # Création de la liste
        liste = [int(piece) for piece in ligne]
        # Fermeture du fichier
        f_in.close()
                 
        return liste
        
    def update_fichier_stock(self):
        """
        Mise à jour du fichier contenant le stock de pièces
        :return: None
        """
        # Ouverture du fichier
        f_out = open(self.fichier_stock_, 'w')

        # Ecriture du stock actuel de pièces
        for stock in self.stock_:
            f_out.write(str(stock) + " ")

        # Fermeture du fichier
        f_out.close()
        
    def rendre_monnaie(self, sap, sv):
        """
        :param sap: int, somme à payer (en centimes)
        :param sv: int, somme versée (en centimes)
        :return: Liste des pièces rendues ( + mise à jour du fichier de stock)
        """

        # Somme versée insuffisante
        if sv < sap:
            print("Reste à verser : ",(sap-sv)/100,"euros >.<")
            return None

        # Pas de pièces à rendre (appoint)
        if sv == sap:
            return []

        # Calcul des pièces à rendre
        du = sv - sap
        liste = []

        for i in range(len(self.pieces_)):

            # On ne peut pas rendre plus de pièces qu'il y en a dans le stock
            nb = min(du//self.pieces_[i], self.stock_[i])

            # Mise à jour de la liste de rendu, de la somme restant à rendre et du stock
            liste.append(nb)
            du -= nb*self.pieces_[i]
            self.stock_[i] -= nb

        # Stock de pieces trop faible
        if du >= self.pieces_[-1]:
            print("Pas assez de pièces, désolé -.-")

        # Mise à jour du fichier de sauvegarde
        self.update_fichier_stock()

        return liste
            


if __name__ == "__main__":
    
    # Validation
    
    caisse = "Caisse.txt"
    monnaie = "Monnaie.txt"
    
    distrib = Distributeur(monnaie, caisse)

    # Somme versée suffisante
    print(distrib.rendre_monnaie(1320,3000))

    # Somme versée insuffisante
    print(distrib.rendre_monnaie(3000,1320))

    # Stock insuffisant
    print(distrib.rendre_monnaie(1000,100000))
