/*
 * 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.collection.InternalCollection;
import org.nakedobjects.object.value.TextString;
import org.nakedobjects.object.value.WholeNumber;


/**
 * @author mmhilleb
 *
 * Teos käsittää perustietoja, kuten nimi, tekijät, 
 * julkaisuvuosi... kaikkea sellaista, 
 * mitä ei kuitenkaan oikeasti jaksa täyttää.
 */
public class Teos extends AbstractNakedObject {

    public static final long serialVersionUID = 1L;
        private final TextString teoksenNimi;
        private final WholeNumber julkaisuVuosi;
        private final TextString isbn;
        private final TextString tekijat;
        private final WholeNumber sivumaara;
        private final InternalCollection kommentit; // Kommentti kommentti;
        private final InternalCollection niteet;
        private int seuraavan_niteen_id;

    // "Rakenteellinen" rakennin
    public Teos() {
        teoksenNimi = new TextString();
        tekijat = new TextString();
        julkaisuVuosi = new WholeNumber();
        isbn = new TextString();
        sivumaara = new WholeNumber();
        niteet = new InternalCollection(Nide.class, this);
        kommentit = new InternalCollection(Kommentti.class, this);
        seuraavan_niteen_id = 0;
    }

    // "Toiminnallinen" rakennin
    public void created() {
        // aika vähäsesti toimintaa :)
    }

    public TextString getTeoksenNimi() {
        return teoksenNimi;
    }

    /**
     * todo: tee intiks
     * @return
     */
    public WholeNumber getJulkaisuVuosi() {
        return julkaisuVuosi ;
    }


    /** 
         * @return Returns the isbn.
         */
        public TextString getIsbn() {
                return isbn;
        }
        /**
         * @return Returns the sivumaara.
         */
        public WholeNumber getSivumaara() {
                return sivumaara;
        }

        /**
         * @return Returns the tekijat.
         */
        public TextString getTekijat() {
                return tekijat;
        }

        // Yksinkertaisen otsikon rakentimet
    public static String singularName() {
        return "Teoksen tiedot";
    }
    public static String pluralName() {
        return "Teokset";
    }

    public Title title() {
        // erikoisemman otsikon rakennin
        String kirjannimi = teoksenNimi.stringValue();
        if (kirjannimi == null) kirjannimi = "Uusi kirja";
        return new Title( kirjannimi + " Jonnen kirjastossa");

    }

    public InternalCollection getKommentit() {
        //resolve(kommentti);
        return kommentit;
    }

    /**
     * Kommentin liittäminen teokseen
     * @param uusKommentti
     */
    public void associateKommentit(Kommentti uusKommentti) {
        //kommentti = uusKommentti;
        if (! uusKommentti.allowAssociation(this)) return;
        kommentit.add(uusKommentti);
        uusKommentti.associateOlio(this);
        objectChanged();
    }

    /**
     * Kommentin poistaminen kokoelmista.
     * @param k
     */
    public void dissociateKommentti(Kommentti k) {
        if (kommentit.contains(k)) {
                kommentit.remove(k);
                k.dissociateOlio(this);
                objectChanged();
        }
    }

    /**
     * Listataan teoksen niteet
     * @return
     */
    public InternalCollection getNiteet() {
        return niteet;
    }

    /**
     * Lisätään toksesta uusi nide
     * @param n
     */
    public void setNide(Nide n) {
        n.setTeos(this);
        if (! n.matchesTeos(this)) return; // vertailua ei pitäis tehdä näin
        if (! niteet.contains(n)) { // lisätään nide kokoelmiin
                niteet.add(n);
                objectChanged();
        }
    }

    /**
     * Wrapperi tekniikan haluamasta nimestä omaan toteutukseen..
     * @param n
     */
    public void associateNiteet(Nide n) {
        setNide(n);
    }

    /**
     * Niteen poistaminen / poistuminen
     */
    public void dissociateNiteet(Nide n) {
        n.setTeos(null);
        getNiteet().remove(n);
    }

    /**
     * Palauttaa sueraavan id:n, jota nide voi käyttää itsensä 
     * "rekisteröintiin"
     * @return
     */
    public int getNextID() {
        return ++this.seuraavan_niteen_id;
    }

}