import java.lang.Math;
import java.util.LinkedList;
import java.util.ArrayList;
import java.lang.reflect.*;
import java.awt.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.Arrays;


//Nodes that are visitable
interface Node{
  public void accept(Visitor visitor);
}

class Movie implements Node{

  private double price;
  private double fileSize;
  private double rating;

  public Movie(double p, double fsz, double r){
    price = p;
    fileSize = fsz;
    rating = r;
  }

  public double getPrice() {
    return price;
  }
  public double getFileSize() {
    return fileSize;
  }

  //GIVES VISITOR ACCESS TO ELEMENT
  public void accept(Visitor visitor) {
    visitor.visit(this);
  }
}

class Book implements Node{

  private double price;
  private double weight;

  public Book(double p, double w){
    price = p;
    weight = w;
  }

  public double getPrice() {
    return price;
  }
  public double getWeight() {
    return weight;
  }

  //GIVES VISITOR ACCESS TO ELEMENT
  public void accept(Visitor visitor) {
    visitor.visit(this);
  }

}





interface Visitor{
  public void visit(Book book);  
  public void visit(Movie movie);
}

class ShippingVisitor implements Visitor {
  private double totalShippingForCart;


  //SHIPPING COSTS ARE VARIABLE BY WEIGHT FOR BOOKS
  public void visit(Book book) {
    if(book.getPrice() < 10.0) {
      totalShippingForCart += book.getWeight() / 2;
    }
  }

  //SHIPPING COSTS ARE VARIABLE BY A MOVIE's FILE SIZE
  public void visit(Movie movie) {
    totalShippingForCart += movie.getFileSize() / 10;
  }



  public double getTotalShipping() {
    return totalShippingForCart;
  }
}



class ShoppingCart {
  //normal shopping cart stuff
  public ArrayList<Node> items;

  public ShoppingCart(){
    items = new ArrayList<Node>();
  }

  public void addItem(Node i){
    items.add(i);
  }

  public double calculateShipping() {
    //create a visitor
    ShippingVisitor visitor = new ShippingVisitor();
    //iterate through all items
    for(Node item: items) {
      item.accept(visitor);
    }
    double shipping = visitor.getTotalShipping();
    return shipping;
  }
}

public class MyMainVisitor
{
  public static void main(String[] args)
  {
    System.out.println("");
    Book andThenThereWereNone = new Book(5, 7);
    Movie avengers = new Movie(3, 13, 11);




    ShoppingCart cart = new ShoppingCart();
    cart.addItem(andThenThereWereNone);
    cart.addItem(avengers);


    System.out.println("Total Shipping: " + cart.calculateShipping());
   
  }
}