package org.insa.graph;

/**
 * Class containing information for road that may be shared by multiple arcs.
 * 
 * Sharing information between arcs reduces memory footprints of the program - A
 * long road is often split into multiple arcs at each intersection.
 * 
 */
public class RoadInformation {

    /**
     * Road type.
     */
    public enum RoadType {
        MOTORWAY,
        TRUNK,
        PRIMARY,
        SECONDARY,
        MOTORWAY_LINK,
        TRUNK_LINK,
        PRIMARY_LINK,
        SECONDARY_LINK,
        TERTIARY,
        TRACK,
        RESIDENTIAL,
        UNCLASSIFIED,
        LIVING_STREET,
        SERVICE,
        ROUNDABOUT,
        PEDESTRIAN,
        CYCLEWAY,
        COASTLINE
    }

    // Type of the road (see above).
    private final RoadType type;

    // Access information
    private final AccessRestrictions access;

    // One way road?
    private final boolean oneway;

    // Max speed in kilometers per hour.
    private final int maxSpeed;

    // Name of the road.
    private final String name;

    /**
     * Create a new RoadInformation instance containing the given parameters.
     * 
     * @param roadType Type of the road (see {@link RoadType}).
     * @param access Access restrictions for the road (see
     * {@link AccessRestrictions}).
     * @param isOneWay true if this road is a one way road, false otherwise.
     * @param maxSpeed Maximum speed for the road (in kilometers-per-hour).
     * @param name Name of the road.
     */
    public RoadInformation(RoadType roadType, AccessRestrictions access, boolean isOneWay,
            int maxSpeed, String name) {
        this.type = roadType;
        this.access = access;
        this.oneway = isOneWay;
        this.maxSpeed = maxSpeed;
        this.name = name;
    }

    /**
     * @return Access restrictions for this road.
     */
    public AccessRestrictions getAccessRestrictions() {
        return this.access;
    }

    /**
     * @return Type of the road.
     */
    public RoadType getType() {
        return type;
    }

    /**
     * @return true if the road is a one-way road.
     */
    public boolean isOneWay() {
        return oneway;
    }

    /**
     * @return Maximum speed for this road (in kilometers-per-hour).
     */
    public int getMaximumSpeed() {
        return maxSpeed;
    }

    /**
     * @return Name of the road.
     */
    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        String typeAsString = "road";
        if (getType() == RoadType.COASTLINE) {
            typeAsString = "coast";
        }
        if (getType() == RoadType.MOTORWAY) {
            typeAsString = "highway";
        }
        return typeAsString + " : " + getName() + " " + (isOneWay() ? " (oneway) " : "") + maxSpeed
                + " km/h (max.)";
    }

}
