package fi.utu.tech.ooj.exercise2;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Date;

public class Asiakas {
    /**
     * Luokkainvariantti: Kaikilla Asiakas-olioilla tulee olla kaikki attribuutit (ei null). Postinumero tai puhelinnumero ei 0. Asiakasnumerot uniikkeja eri olioiden välillä
     */
    private String nimi;
    private String katuosoite;
    private int postinumero;
    private String postitoimipaikka;
    private int puhelinnumero;

    private int asiakasnumero;


    /**
     * Alkuehto: true
     * Loppuehto: palauttaa asiakkaan nimen
     * @return asiakkaan nimi, merkkijono
     */
    public String getNimi() {
        return nimi;
    }

    /**
     * Alkuehto: nimi on merkkijono, ei null
     * Loppuehto: asettaa olion nimeksi parametrin arvon
     * @param nimi asetettava nimi
     */
    public void setNimi(String nimi) {
        this.nimi = nimi;
    }

    /**
     * Alkuehto: true
     * Loppuehto: palauttaa olion katuosoitteen
     * @return asiakkaan osoite, merkkijono
     */
    public String getKatuosoite() {
        return katuosoite;
    }

    /**
     * Alkuehto: parametri on merkkijono, ei null
     * Loppuehto: asettaa olion katuosoitteeksi parametrin arvon
     * @param katuosoite uusi katuosoite
     */
    public void setKatuosoite(String katuosoite) {
        this.katuosoite = katuosoite;
    }

    /**
     * Alkuehto: true
     * Loppuehto: palauttaa olion postinumeron
     * @return olion postinumero
     */
    public int getPostinumero() {
        return postinumero;
    }

    /**
     * Alkuehto: parametri ei 0
     * Loppuehto: asettaa postinumeroksi parametrin arvon
     * @param postinumero uusi postinumero
     */
    public void setPostinumero(int postinumero) {
        this.postinumero = postinumero;
    }

    /**
     * Alkuehto: true
     * Loppuehto: palauttaa postitoimipaikan
     * @return olion postitoimipaikka
     */
    public String getPostitoimipaikka() {
        return postitoimipaikka;
    }

    /**
     * Alkuehto: parametri ei null
     * Loppuehto: asettaa parametrin uudeksi postitoimipaikaksi
     * @param postitoimipaikka uusi postitoimipaikka
     */
    public void setPostitoimipaikka(String postitoimipaikka) {
        this.postitoimipaikka = postitoimipaikka;
    }

    /**
     * Alkuehto: true
     * Loppuehto: palauttaa olion puhelinnumeron
     * @return olion puhelinnumero
     */
    public int getPuhelinnumero() {
        return puhelinnumero;
    }

    /**
     * Alkuehto: puhelinnumero ei 0
     * Loppuehto: asettaa uudeksi puh.nro. parametrin arvon
     * @param puhelinnumero
     */
    public void setPuhelinnumero(int puhelinnumero) {
        this.puhelinnumero = puhelinnumero;
    }

    /**
     * Alkuehto: true
     * Loppuehto: palauttaa olion asiakasnumeron
     * @return asiakkaan asiakasnumero
     */
    public int getAsiakasnumero() {
        return asiakasnumero;
    }

    /**
     * Alkuehto: nimi, katuosoite, postitoimipaikka ei null. Postinumero, puhelinnumero ei 0.
     * Loppuehto: Luo uuden Asiakas-olion jonka attribuutit ovat parametrien arvot. Satunnaisgeneroi uuden uniikin asiakasnumeron, ei 0.
     * @param nimi uusi nimi
     * @param katuosoite uusi katuosoite
     * @param postinumero uusi postinumero
     * @param postitoimipaikka uusi postitoimipaikka
     * @param puhelinnumero uusi puhelinnumero
     */
    public Asiakas(String nimi, String katuosoite, int postinumero, String postitoimipaikka, int puhelinnumero) {
        this.nimi = nimi;
        this.katuosoite = katuosoite;
        this.postinumero = postinumero;
        this.postitoimipaikka = postitoimipaikka;
        this.puhelinnumero = puhelinnumero;
    }

    /**
     * Alkuehto: tuotteet-lista ei tyhjä, päivämäärä juuri kyseinen päivä.
     * Loppuehto: Luo uuden laskun kyseiselle asiakkaalle halutuista tuotteista.
     */
    public void luoLasku(ArrayList<LaskuRivi> tuotteet, Date paivamaara) {}
}
/**
 * Perustelut:
 * Luokan käytön kannalta on järkevää, että kaikki tiedot asiakkaasta vaaditaan. Ei olisi mitään järkeä tallentaa asiakasta, jolla ei ole esimerkiksi nimeä.
 * Kaikille arvoille on getterit ja setterit kapseloinnin takia. Asiakasnumerolle pelkkä setteri, sen muuttaminen ei ole tarpeen ja pahimmassa tapauksessa voisi rikkoa luokkainvariantin.
 * Asiakasnumero ei ole tehtävänannossa vaadittu, mutta helpottaa asiakkaan tallennusta rekisteriin ja sieltä hakemista. Asiakasnumeron uniikkius varmistaa sen, että asiakkaat voidaan tallentaa myös sellaisiin tietojärjestelmiin, joissa jokaiselle oliolle vaaditaan jokin uniikki piirre, jolla ne voi löytää (esim hajautustaulu)
 * luoLasku metodi on mielestäni järkevää tehdä juuri Asiakas-luokkaan, sillä lasku tehdään aina yhdelle tietylle asiakkaalle.
 */