package ld5_2;
import jade.content.ContentElement;
import jade.content.ContentManager;
import jade.content.lang.Codec;
import jade.content.lang.sl.SLCodec;
import jade.content.onto.Ontology;
import jade.core.AID;
import jade.core.Agent;
import jade.core.behaviours.CyclicBehaviour;
import jade.core.behaviours.TickerBehaviour;
import ld5_2.ontology.BuyCar;
import ld5_2.ontology.BuyCarMsg;
import ld5_2.ontology.BuyCarResponse;
import ld5_2.ontology.BuyCarResponseMsg;
import ld5_2.ontology.CarData;
import ld5_2.ontology.CarList;
import ld5_2.ontology.CarListMsg;
import ld5_2.ontology.CarMaker;
import ld5_2.ontology.CarModel;
import ld5_2.ontology.CarOntology;
import ld5_2.ontology.CarSearch;
import ld5_2.ontology.CarSearchMsg;
import ld5_2.ontology.Zmogus;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;


public class Seller extends Agent {
    Zmogus owner;
    CarMaker make;
    CarModel model;
    CarData car;
    

    private void print(String data, String elgesenosId) {
        if (elgesenosId != null) {
            System.out.println("A[" + getLocalName() + " | " + elgesenosId + "] " + data);
        } else {
            System.out.println("A[" + getLocalName() + "] " + data);
        }
    }

    private class WaitForMessagesCarSearch extends CyclicBehaviour 
    {
        @Override
        public void action() 
        {               
            Ontology onto = CarOntology.getInstance();
            Codec codec = new SLCodec();
            ContentManager cm = getContentManager();
            cm.registerLanguage(codec);
            cm.registerOntology(onto);
            
            MessageTemplate mt = MessageTemplate.MatchConversationId("car-search");
            ACLMessage msg = myAgent.receive(mt);
                        
            if (msg != null) 
                 {                
                try
                {                    
                    String pran = msg.getContent();
                    print("Message received: "+pran, "WaitForMessagesCarSearch");
                    
                    ContentElement c = cm.extractContent(msg);
                    
                    if (c instanceof CarSearchMsg)
                    {
                        CarSearchMsg p = (CarSearchMsg) c;
                        CarSearch l = null;
                        
                        l = p.getCarSearchLine();
                        print(l.getCarMake() + " vs expected: " + car.getModel().getMaker(), pran);
                        if (l.getCarMake().getMakeName().equals(car.getModel().getMaker().getMakeName()))
                        {
                            print("selling car: \""+car.getModel().getModelName()+"\" made by "+ car.getModel().getMaker().getMakeName() + " from" + owner.getName(), "WaitForMessagesCarSearch");
                            //Order Book
                            CarList list = new CarList();
                            list.setCount(1);
                            list.setVIN(car.getVIN());
                            CarListMsg o = new CarListMsg();
                            o.setCarListLine(list);
                    
                            ACLMessage omsg = new ACLMessage(ACLMessage.INFORM);
                            omsg.setLanguage(codec.getName()); 
                            omsg.setOntology(onto.getName());
                            omsg.setConversationId(msg.getConversationId());
                            omsg.setInReplyTo(msg.getReplyWith());
                            omsg.clearAllReceiver();     
                            omsg.addReceiver(msg.getSender());
                            omsg.setConversationId("car-list");
                    
                            cm.fillContent(omsg, o);                        
                            send(omsg);  
                        }
                    }                
                    else
                    {
                        print("received unknown message: " + pran, "WaitForMessagesCarSearch");
                    }
                } 
                catch (Exception ex)
                {
                    print("Ontology parsing error: "+ ex.getMessage(), "WaitForMessagesCarSearch");
                }
            }
            else block();
        }
    }

    private class WaitForMessagesCarBuyMsg extends CyclicBehaviour 
    {
        @Override
        public void action() 
        {               
            Ontology onto = CarOntology.getInstance();
            Codec codec = new SLCodec();
            ContentManager cm = getContentManager();
            cm.registerLanguage(codec);
            cm.registerOntology(onto);
            
            MessageTemplate mt = MessageTemplate.MatchConversationId("car-buy");
            ACLMessage msg = myAgent.receive(mt);
                        
            if (msg != null) 
            {                
                try
                {                    
                    String pran = msg.getContent();
                    print("Message received: "+pran, "WaitForMessagesCarBuyMsg");
                    
                    ContentElement c = cm.extractContent(msg);
                    
                    if (c instanceof BuyCarMsg)
                    {
                        BuyCarMsg p = (BuyCarMsg) c;
                        BuyCar l = null;
                        
                        l = p.getBuyCarLine();
                        if (l.getVIN() == car.getVIN())
                        {
                            print("Comfirmation to buy the car: \""+l.getVIN(), "WaitForMessagesCarBuyMsg");
                            //Order Book
                            BuyCarResponse list = new BuyCarResponse();
                            list.setVIN(l.getVIN());
                            list.setPrice(100);
                            BuyCarResponseMsg o = new BuyCarResponseMsg();
                            o.setBuyCarResLine(list);
                    
                            ACLMessage omsg = new ACLMessage(ACLMessage.INFORM);
                            omsg.setLanguage(codec.getName()); 
                            omsg.setOntology(onto.getName());
                            omsg.setConversationId(msg.getConversationId());
                            omsg.setInReplyTo(msg.getReplyWith());
                            omsg.clearAllReceiver();     
                            omsg.addReceiver(msg.getSender());
                            omsg.setConversationId("car-buy-res");
                    
                            cm.fillContent(omsg, o);                        
                            send(omsg);  
                        }
                    }                
                    else
                    {
                        print("received unknown message: " + pran, "WaitForMessagesCarSearch");
                    }
                } 
                catch (Exception ex)
                {
                    print("Ontology parsing error: "+ ex.getMessage(), "WaitForMessagesCarSearch");
                }
            }
            else block();
        }
    }

    @Override 
    public void setup() {
        owner = new Zmogus();
        owner.setID("z1");
        owner.setAddress("vilnius2");
        owner.setLastName("Petrauskas");
        owner.setName("Jonas");
        make = new CarMaker();
        make.setCountry("Japan");
        make.setMakeName("Honda");
        model = new CarModel();
        model.setMID(11);
        model.setMaker(make);
        model.setModelName("BestModel");
        model.setModification("UltraFast");
        car = new CarData();
        car.setVIN(111);
        car.setModel(model);
        car.setColor("red");
        car.setEngine("V8");
        car.setOwner(owner);
        car.setYearBuilt(2000);

        addBehaviour(new WaitForMessagesCarSearch());
        addBehaviour(new WaitForMessagesCarBuyMsg());
    }


    @Override  
    public void takeDown() 
    {     
    } 
}