package org.lucci.madhoc.env;


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.lucci.madhoc.network.Station;
import org.lucci.madhoc.simulation.Configurable;
import org.lucci.madhoc.simulation.random.RandomNumberGenerator;
import org.lucci.up.data.Point;

/*
 * Created on Jul 24, 2004
 */

/**
 * @author luc.hogie
 */
public abstract class MobilityModel implements Configurable
{
    private Station mobileNode;
    private MobilityMedium mobilityMedium;

    private File file;
    private FileOutputStream fos;
    
    
    
    
    public  void configure() throws Throwable
    {
        if (getMobileNode().getNetwork().getSimulation().getConfiguration().getBoolean("mobility_write_xy_files"))
        {
            String s = getMobileNode().getNetwork().getSimulation().getConfiguration().getString("xy_mobility_directory");
            s += File.separator + getMobileNode().getIdentifier() + ".txt";
            this.file = new File(s);
            this.fos = new FileOutputStream(this.file);
        }
    }


    public void saveLocation()
    {
        if (fos != null)
        {
            Point p = getMobileNode().getLocation();
            String s = p.getX() + ", " + p.getY() + '\n';

            try
            {
                fos.write(s.getBytes());
                fos.flush();
            }
            catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    
    public void setMobileNode(Station station)
    {
        if (this.mobileNode != null)
            throw new IllegalStateException("station is already defined");

        this.mobileNode = station;
        setMobilityMedium(new MobilityMedium.Legs(getMobileNode().getNetwork().getSimulation().getRandomNumberGenerator().getRandom()));
    }

    
    public abstract void moveStation(double duration, double simulatedTime);

    



    
    /**
     * @return Returns the station.
     */
    public Station getMobileNode()
    {
        return mobileNode;
    }
    
    /**
     * @return Returns the mobilityMedium.
     */
    public MobilityMedium getMobilityMedium()
    {
        return mobilityMedium;
    }
    /**
     * @param mobilityMedium The mobilityMedium to set.
     */
    public void setMobilityMedium(MobilityMedium mobilityMedium)
    {
        if (mobilityMedium == null)
            throw new IllegalArgumentException();

        this.mobilityMedium = mobilityMedium;
    }

}