package dreamteam.carpooling.appl;

import dreamteam.carpooling.appl.DriverBehaviours.HandlePassengersOffersBehaviour;
import dreamteam.carpooling.appl.DriverBehaviours.RegisterInYPBehaviour;
import dreamteam.carpooling.appl.PassengerBehaviours.SearchDriversOffersInYPBehaviour;

import dreamteam.carpooling.appl.Util.Parser;
import jade.core.AID;
import jade.core.Agent;
import jade.util.leap.LinkedList;
import org.jgrapht.Graph;
import org.jgrapht.alg.BidirectionalDijkstraShortestPath;
import org.jgrapht.alg.DijkstraShortestPath;
import org.jgrapht.graph.DefaultWeightedEdge;
import jade.domain.DFService;
import jade.domain.FIPAException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

<<<<<<< HEAD
=======
import java.util.LinkedList;
>>>>>>> feature/add_districts
import java.util.List;

/**
 * Агент - житель города. Каждый агент может играть две роли: пассажира и водителя.
 * В какой-то момент он должен определиться, кем он будет в итоге.
 */
public class CitizenAgent extends Agent {

    private Car car = null;
    private Graph<String, DefaultWeightedEdge> city = new Parser().getCity();

    private String start, finish;

    public List<AID> suitableDrivers = new LinkedList<>();

    public static final Logger logger = LoggerFactory.getLogger(CitizenAgent.class);

    @Override
    protected void setup() {
        super.setup();
        logger.info("Hello! Agent {} is ready.", getAID().getName());

        Object[] args = getArguments();

        // Запоминаем старт и финиш, если они правильно заданы
        if (args != null && args.length >= 2 &&
                this.city.containsVertex(args[0].toString()) && this.city.containsVertex(args[1].toString()) &&
                !args[0].toString().equals(args[1].toString())) {
            this.start  = args[0].toString();
            this.finish = args[1].toString();
            logger.info("Agent {}: start - node {}, destination - node {}",
                    getAID().getName(), this.getStart(), this.getFinish());
        } else { // Если заданы неправильно, убиваем агента
            logger.info("Agent {} has invalid parameters", getAID().getName());
            this.doDelete();
            return;
        }

        // Смотрим, есть ли машина
        if (args.length == 4) {
            this.car = new Car(Byte.parseByte(args[2].toString()), Float.parseFloat(args[3].toString()));
            logger.info("Agent {} has car with capacity {} and cost per km {}",
                    getAID().getName(), car.getCapacity(), car.getCostPerKilometer());
        }

        // Поведения для роли водителя
        if (car != null) {
            addBehaviour(new RegisterInYPBehaviour());
            addBehaviour(new HandlePassengersOffersBehaviour(this, 3000));
        }

        // Поведения для роли пассажира
        addBehaviour(new SearchDriversOffersInYPBehaviour(this, 3000));
    }

    public String getStart() {
        return start;
    }

    public String getFinish() {
        return finish;
    }

<<<<<<< HEAD
    /*public List<String> getWayByMyCar(){
        List<String> my_way = new java.util.LinkedList<String>();
        List<DefaultWeightedEdge> edges_in_way =
                DijkstraShortestPath.findPathBetween(this.city, start, finish);
    }*/
=======
    @Override
    protected void takeDown() {
        // Deregister from the yellow pages
        try {
            DFService.deregister(this);
        }
        catch (FIPAException fe) {
            fe.printStackTrace();
        }
    }

>>>>>>> feature/add_districts
}

@@ -369,42 +369,8 @@
 nt;%0A
-import jade.util.leap.LinkedList;%0A
 impo
@@ -666,28 +666,8 @@
 y;%0A%0A
-%3C%3C%3C%3C%3C%3C%3C HEAD%0A=======
 %0Aimp
@@ -696,38 +696,8 @@
 st;%0A
-%3E%3E%3E%3E%3E%3E%3E feature/add_districts%0A
 impo
@@ -2920,21 +2920,9 @@
  %7D%0A%0A
-%3C%3C%3C%3C%3C%3C%3C HEAD
 %0A
+
     
@@ -3167,16 +3167,9 @@
 %7D*/%0A
-=======
 %0A
+
     
@@ -3408,36 +3408,6 @@
  %7D%0A%0A
-%3E%3E%3E%3E%3E%3E%3E feature/add_districts%0A
 %7D%0A

fix merge