/*
 * Created on 23.11.2004
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package kirjasto;

import org.nakedobjects.object.AbstractNakedObject;
import org.nakedobjects.object.Title;
import org.nakedobjects.object.control.ActionAbout;
import org.nakedobjects.object.control.About;
import org.nakedobjects.object.control.ProgrammableAbout;
import org.nakedobjects.object.value.TextString;

/**
 * @author tmpoyhon
 * @author saelkale  
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class Nide extends AbstractNakedObject {
   //niteen id, joka erottaa sen muista saman teokseni niteistä
   private TextString id;


   private Teos teos;
   private Kommentti kommentti;
   private Laina laina;

   public Nide(){
     id = new TextString();

   }

   /** Palauttaa niteen id:n (=järjestysnumeron).
    * 
    * @return
    */
   public TextString getId(){
     return id;
   }
   public void setId(TextString id){
     this.id = id;
   }

   //Palauttaa niteen yksilöivän "nimen" = ISBN+niteen nro
   public Title title(){
         if(teos == null) return new Title("Teosta ei tiedetä");
         String nimi = teos.getTeoksenNimi().stringValue() ;
         if (teos.getIsbn().stringValue() != null) nimi += " " + teos.getIsbn().stringValue();
         return new Title(nimi).append("_").append(this.id);
   }

        // Yksinkertaisen otsikon rakentimet
   public static String singularName() {
       return "Nide";
   }
   public static String pluralName() {
       return "Niteet";
   }


 /*  public void setNid(TextString nid){
     this.nid = nid;    
   }*/

   public Teos getTeos(){
         resolve(teos);
         return teos;
   }

   /**
    * Niteeseen saa sijoittaa vain sen teoksen, joka siinä jo on.
    * (ja tyhjän tilalle saa aina sijoittaa jotain)
    * Toista teosta ei saa vaihtaa kesken kaiken.
    * Ei vain tule koskaan tähän metodiin :(
    * @param t
    * @return
    */
   public ActionAbout aboutSetTeos(Teos t) {
         return  (this.teos == null || matchesTeos(t)) ? ActionAbout.ENABLE : ActionAbout.DISABLE;
   }

   /**
    * Onko kyseessä oma teos, vai liittyykö nide jo 
    * johonkin toiseen teokseen
    * @param t
    * @return
    */
   public boolean matchesTeos(Teos t) {
                return this.teos == t;
   }

   public void setTeos(Teos te){
                if (this.teos != null) return;
                this.teos = te;
                if (te == null) return; // niteen poistaminen / poistuminen
                // id täytyy kysyä teokselta. Seuravan niteen järjestysnumeroa (lukumäärä) 
                // ei voida käyttää, sillä niteitä voidaan poistaa välistä
                id.setValue(new TextString(teos.getNextID()+""));
                te.setNide(this);
                objectChanged();
        }

        /**             
         * Poistetaan teos
         * @param t
         */
        public void dissociateTeos(Teos t) {
                t.dissociateNiteet(this);
                setTeos(null);
        }

   public void setKommentti(Kommentti kommentti){
         this.kommentti = kommentti;
         objectChanged();
   }

   public Kommentti getKommentti(){
     resolve(kommentti);
     return kommentti;
   }
   public Laina getLaina(){
         resolve(laina);
         return laina;
   }

   public void setLaina(Laina lai){
         laina = lai;
         objectChanged();
   }

   public void associateLaina(Laina n) {
         if(laina != null) return; //on jo lainassa
     if(n == null) return;    //lainaa ei ole olemassa

         this.setLaina(n);        //tämä nide asetetaan lainatuksi
         n.setNide(this);         //kerrotaan lainalle, että sillä on nide

   }

   public void dissociateLaina(Laina n) {
         if(!n.equals(laina)) return;

         this.setLaina(null);
         if(n == null) return;
         n.setNide(null);
   }

   /** About-teksti ei tule näkyviin minnekään. 
    * 
    * 
    */
   public About aboutActionLainaa(Laina n) {
         ProgrammableAbout a = new ProgrammableAbout();
         System.out.println("kalle");
         a.setDescription("Nide on jo lainassa!");
     a.makeAvailableOnCondition(laina!=null, "Nide on jo lainassa!");
         return a;
   }

   public void actionLainaa(Laina n){
     associateLaina(n);

   }
}