/**
 * TicketMachine models a naive ticket machine that issues
 * flat-fare tickets.
 * The price of a ticket is specified via the constructor.
 * It is a naive machine in the sense that it trusts its users
 * to insert enough money before trying to print a ticket.
 * It also assumes that users enter sensible amounts.
 *
 * @author David J. Barnes and Michael Kolling
 * @version 2008.03.30
 */ public class TicketMachine
{
    // The price of a ticket from this machine.
    private int  price ;
    // The amount of money entered by a customer so far.
    private int balance;
    // The total amount of money collected by this machine.
    private int total;
    /**
     * Exercise 2.15 Write in full the 
     * declaration for a field of type 
     * int whose name is status.
     */
    private int status;

    /**
     * Create a machine that issues tickets of the given price.
     * Note that the price must be greater than zero, and there
     * are no checks to ensure this.
     * Exercise 2.39
     */
    public TicketMachine()
    {
        price = 1000;
        balance = 0;
        total = 0;
    }
    
    /**Exercise 2.42
     * 
     */
    public void TicketSet(int ticketCost)
    {
        price = ticketCost;
    }

    /**
     * Return the price of a ticket.
     */
    public int getPrice()
    {
        return price;
    }

    /**Exercise 2.33
     * Request the correct amount of money
     */
    public void prompt()
    {
        System.out.println("Please insert the correct amount of money.");
    }
    
    /**Exercise 2.34
     * Show price
     */
    public void showPrice()
    {
        System.out.println("The price of the ticket is " + price);
    }
    /**
     * Return the amount of money already inserted for the
     * next ticket.
     */
    public int getBalance()
    {
        return balance;
    }

    /**
     * Receive an amount of money in cents from a customer.
     */
    public void insertMoney(int amount)
    {
        balance = balance + amount;
    }

    /**Exercise 2.24 Define an accessor method, getTotal, 
     * that returns the value of the total field.
     */
    public int getTotal()
    {
        return total;
    }

    /**
     * Print a ticket.
     * Update the total collected and
     * reduce the balance to zero.
     */
    public void printTicket()
    {
        // Simulate the printing of a ticket.
        System.out.println("##################");
        System.out.println("# The BlueJ Line");
        System.out.println("# Ticket");
        System.out.println("# " + price + " cents.");
        System.out.println("##################");
        System.out.println();

        // Update the total collected with the balance.
        total = total + balance;
        // Clear the balance.
        balance = 0;
    }

    /**
     * Exercise 2.30 & 2.41
     * Set Price
     */
    public void setPrice(int newValue)
    {
        price = newValue;
        //return price;
    }    

    /**
     * Exercise 2.32
     * Reduce price by the given amount.
     */
    public void discount(int amount)
    {
      price = price - amount;  
         }

    /**Exercise 2.40
     * Empty machine
     */    
    public void empty()
    {
        total = 0;
    }
        }
