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.SimpleBehaviour;
import ld5_2.ontology.BuyCar;
import ld5_2.ontology.BuyCarMsg;
import ld5_2.ontology.BuyCarResponse;
import ld5_2.ontology.BuyCarResponseMsg;
import ld5_2.ontology.CarList;
import ld5_2.ontology.CarListMsg;
import ld5_2.ontology.CarMaker;
import ld5_2.ontology.CarOntology;
import ld5_2.ontology.CarSearch;
import ld5_2.ontology.CarSearchMsg;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;


public class Buyer extends Agent {
    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 void sendCarSearch() {
        Ontology onto = CarOntology.getInstance();
        Codec codec = new SLCodec();
        
        ACLMessage req = new ACLMessage(ACLMessage.INFORM);
        req.setLanguage(codec.getName()); 
        req.setOntology(onto.getName()); 
        ContentManager cm = getContentManager();
        cm.registerLanguage(codec);
        cm.registerOntology(onto);

        AID a = new AID("Seller", AID.ISLOCALNAME);

        req.clearAllReceiver();     //Resyveriai cikle "dasideda"
        req.addReceiver(a); 
        req.setConversationId("car-search");

        CarMaker make = new CarMaker();
        make.setGID(1);
        make.setCountry("Japan");
        make.setMakeName("Honda");
        make.setMakeAddress("Tokyo 12/62");

        CarSearch carSearch = new CarSearch();
        carSearch.setCarMake(make);

        CarSearchMsg msg = new CarSearchMsg();
        msg.setCarSearchLine(carSearch);

        try {
            cm.fillContent(req, msg);
            req.addUserDefinedParameter("klase", "CarSearch");
            send(req);
        } catch (Exception ex) {
            print(ex.getMessage(), "sendCarSearch");
        }
    }

    private class WaitForMessagesCarList 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-list");
            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 CarListMsg)
                    {
                        CarListMsg p = (CarListMsg) c;
                        CarList l = null;
                        
                        l = p.getCarListLine();
                        if (l.getCount() == 1)
                        {
                            print("buying car: \""+l.getVIN(), "WaitForMessagesCarSearch");
                            //Order Book
                            BuyCar list = new BuyCar();
                            list.setVIN(l.getVIN());
                            BuyCarMsg o = new BuyCarMsg();
                            o.setBuyCarLine(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");
                    
                            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 WaitForMessagesBuyCarResponseMsg 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-res");
            ACLMessage msg = myAgent.receive(mt);       
                        
            if (msg != null) 
            {                
                try
                {                    
                    String pran = msg.getContent();
                    print("Message received: "+pran, "WaitForMessagesBuyCarResponseMsg");
                    
                    ContentElement c = cm.extractContent(msg);
                    
                    if (c instanceof BuyCarResponseMsg)
                    {
                        BuyCarResponseMsg p = (BuyCarResponseMsg) c;
                        BuyCarResponse l = null;
                        
                        l = p.getBuyCarResLine();
                        if (l.getPrice() < 10000)
                        {
                            print("Buying the car: \""+l.getVIN(), "WaitForMessagesBuyCarResponseMsg"); 
                        }
                    }                
                    else
                    {
                        print("received unknown message: " + pran, "WaitForMessagesCarSearch");
                    }
                } 
                catch (Exception ex)
                {
                    print("Ontology parsing error: "+ ex.getMessage(), "WaitForMessagesCarSearch");
                }
            }
            else block();
        }
    }

    @Override 
    public void setup() {
        addBehaviour(new WaitForMessagesCarList());
        addBehaviour(new WaitForMessagesBuyCarResponseMsg());
        addBehaviour(new buyCar());
    }

    private class buyCar extends SimpleBehaviour {
        @Override
        public void action() {
            sendCarSearch();
        }

        @Override
        public boolean done() {
            return true;
        }
    }

    @Override  
    public void takeDown() 
    {     
    } 
}