package be.msyben.vinylManager.entities;

import be.msyben.vinylManager.properties.Language;
import be.msyben.vinylManager.properties.Preferences;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * Cette classe représente un disque.
 *
 * @author Mathieu Syben
 *
 */
public class Disque implements Serializable, Cloneable {

    /**
     * uid
     */
    private static final long serialVersionUID = 3230572920835882356l;
    private List<Titre> faceA;
    private List<Titre> faceB;
    private Integer canaux;
    private String couleur;
    private Integer vitesse;
    private Integer taille;
    private String etat;
    private int num;

    /**
     * Creates a new instance of Disque
     */
    public Disque() {
    }

    /**
     * Récupère la liste des titres de la face A
     *
     * @return la liste des titres de la face A
     */
    public List<Titre> getFaceA() {
        if (faceA == null) {
            faceA = new ArrayList<Titre>();
        }
        return this.faceA;
    }

    /**
     * Défini la liste des titres de la face A
     *
     * @param faceA la liste des titres de la face A
     */
    public void setFaceA(List<Titre> faceA) {
        if (faceA == null) {
            faceA = new ArrayList<Titre>();
        }
        this.faceA = faceA;
    }

    /**
     * Ajoute un titre à la face A.
     *
     * @param titre Le titre à ajouter.
     */
    public void addTitreToFaceA(Titre titre) {
        if (faceA == null) {
            faceA = new ArrayList<Titre>();
        }
        faceA.add(titre);
    }

    /**
     * Récupère la liste des titres de la face B
     *
     * @return la liste des titres de la face B
     */
    public List<Titre> getFaceB() {
        if (faceB == null) {
            faceB = new ArrayList<Titre>();
        }
        return this.faceB;
    }

    /**
     * Défini la liste des titres de la face B
     *
     * @param faceB la liste des titres de la face B
     */
    public void setFaceB(List<Titre> faceB) {
        if (faceB == null) {
            faceB = new ArrayList<Titre>();
        }
        this.faceB = faceB;
    }

    /**
     * Ajoute un titre à la face B.
     *
     * @param titre Le titre à ajouter.
     */
    public void addTitreToFaceB(Titre titre) {
        if (faceB == null) {
            faceB = new ArrayList<Titre>();
        }
        faceB.add(titre);
    }

    /**
     * Getter for property num.
     *
     * @return Value of property num.
     */
    public int getNum() {
        return this.num;
    }

    /**
     * Setter for property num.
     *
     * @param num New value of property num.
     */
    public void setNum(int num) {
        this.num = num;
    }

    /**
     * Getter for property etat.
     *
     * @return Value of property etat.
     */
    public String getEtat() {
        return this.etat;
    }

    /**
     * Setter for property etat.
     *
     * @param etat New value of property etat.
     */
    public void setEtat(String etat) {
        this.etat = etat;
    }

    /**
     * Getter for property taille.
     *
     * @return Value of property taille.
     */
    public Integer getTaille() {
        return this.taille;
    }

    /**
     * Setter for property taille.
     *
     * @param taille New value of property taille.
     */
    public void setTaille(Integer taille) {
        this.taille = taille;
    }

    /**
     * Getter for property vitesse.
     *
     * @return Value of property vitesse.
     */
    public Integer getVitesse() {
        return this.vitesse;
    }

    /**
     * Setter for property vitesse.
     *
     * @param vitesse New value of property vitesse.
     */
    public void setVitesse(Integer vitesse) {
        this.vitesse = vitesse;
    }

    /**
     * Getter for property couleur.
     *
     * @return Value of property couleur.
     */
    public String getCouleur() {
        return this.couleur;
    }

    /**
     * Setter for property couleur.
     *
     * @param couleur New value of property couleur.
     */
    public void setCouleur(String couleur) {
        this.couleur = couleur;
    }

    /**
     * Getter pour canaux.
     *
     * @return canaux.
     */
    public Integer getCanaux() {
        return canaux;
    }

    /**
     * Setter pour canaux.
     *
     * @param canaux canaux.
     */
    public void setCanaux(Integer canaux) {
        this.canaux = canaux;
    }

    @Override
    public String toString() {
        boolean showDuration = Preferences.getInstance().get(Preferences.DISPLAY_DURATION_DISC, "Y").equalsIgnoreCase("Y");
        String dureeTotale = getDureeTotale();
        if (showDuration && dureeTotale != null) {
            return Language.getInstance().get("name.disque") + " " + getNum() + " (" + dureeTotale + ")";
        } else {
            return Language.getInstance().get("name.disque") + " " + getNum();
        }
    }

    @Override
    public Disque clone() throws CloneNotSupportedException {
        Disque clone = (Disque) super.clone();
        List<Titre> fa = new ArrayList<Titre>();
        for (Titre t : getFaceA()) {
            fa.add(t.clone());
        }
        clone.setFaceA(fa);
        List<Titre> fb = new ArrayList<Titre>();
        for (Titre t : getFaceB()) {
            fb.add(t.clone());
        }
        clone.setFaceB(fb);
        return clone;

    }

    public String getDureeTotale() {
        int dureeTotale = 0;
        for (Titre t : getFaceA()) {
            dureeTotale += t.getDuree();
        }
        for (Titre t : getFaceB()) {
            dureeTotale += t.getDuree();
        }
        if (dureeTotale == 0) {
            return null;
        }

        int min = dureeTotale / 60;
        int sec = dureeTotale % 60;
        
        String secS = sec < 10 ? "0" + sec : "" + sec;
        return min+":"+secS;
    }
    
    public String getDureeTotaleFace(boolean faceA) {
        
        int dureeTotale = 0;
        if (faceA) {
            for (Titre t : getFaceA()) {
                dureeTotale += t.getDuree();
            }
        } else {
            for (Titre t : getFaceB()) {
                dureeTotale += t.getDuree();
            }
        }
        if (dureeTotale == 0) {
            return null;
        }

        int min = dureeTotale / 60;
        int sec = dureeTotale % 60;
        
        String secS = sec < 10 ? "0" + sec : "" + sec;
        return min+":"+secS;
    }
}
