package be.msyben.vinylManager.tools.importexport;

import be.msyben.vinylManager.exceptions.VinylManagerException;
import be.msyben.vinylManager.properties.Language;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Classe de donnée utilisée lors de l'import csv.
 *
 * @author Mathieu Syben
 */
public class CsvImportData {

    private String titre;
    private String artiste;
    private String compositeur;
    private String reference;
    private String editeur;
    private String annee;
    private String anneeParution;
    private String chef;
    private String orchestre;
    private String musiciens;
    private String etat;
    private String commentaire;
    private String cote;
    private String genre;
    private String valeur;
    private Integer support;
    private String parolier;
    private String location;
    private Date dateAchat;
    private boolean compilation;
    private boolean possede;
    private int disqueNumero;
    private String disqueEtat;
    private Integer taille;
    private Integer vitesse;
    private String couleur;
    private Integer canaux;
    private String face;
    private int numeroPiste;
    private String nomPiste;
    private int dureePiste;
    private String artistePiste;
    private String anneePiste;
    private boolean hasDisques;
    private String pays;

    /**
     * Constructeur privé.
     */
    private CsvImportData() {
    }
    private static final int NBR_COL_ALBUM = 21;
    private static final int NBR_COL_DISQUE = 28;
    private static final DateFormat df = new SimpleDateFormat("dd/MM/yyyy");

    /**
     * Constructeur.
     *
     * @param ligne les données de la ligne. param separator le séparateur.
     */
    public CsvImportData(String ligne, char separator) throws VinylManagerException {
        if (ligne == null) {
            throw new VinylManagerException(Language.getInstance().get("csv.import.line.null"));
        }
        String[] data = ligne.split("" + separator);
        if (data.length < NBR_COL_DISQUE && data.length != NBR_COL_ALBUM) {
            throw new VinylManagerException(Language.getInstance().get("csv.import.line.short"));
        }
        int idx=0;
        titre = data[idx++];
        artiste = data[idx++];
        compositeur = data[idx++];
        reference = data[idx++];
        editeur = data[idx++];
        annee = data[idx++];
        anneeParution = data[idx++];
        pays = data[idx++];
        chef = data[idx++];
        orchestre = data[idx++];
        musiciens = data[idx++];
        etat = data[idx++];
        commentaire = data[idx++];
        cote = data[idx++];
        genre = data[idx++];
        valeur = data[idx++];
        try {
            support = Integer.parseInt(data[idx++]);
        } catch (NumberFormatException ex) {
            support = null;
        }
        parolier = data[idx++];
        location = data[idx++];
        possede = Boolean.parseBoolean(data[idx++]);
        String dateAchatS = data[idx++];
        if (dateAchatS != null && !dateAchatS.isEmpty()) {
            try {
                dateAchat = df.parse(dateAchatS);
            } catch (ParseException e) {
                dateAchat = null;
            }
        }
        compilation = Boolean.parseBoolean(data[idx++]);

        if (data.length > NBR_COL_ALBUM) {
            hasDisques = true;
            try {
                disqueNumero = Integer.parseInt(data[idx++]);
            } catch (NumberFormatException nex) {
                throw new VinylManagerException(Language.getInstance().get("csv.import.disque.num.error"));
            }
            disqueEtat = data[idx++];
            try {
                taille = Integer.parseInt(data[idx++]);
            } catch (NumberFormatException ex) {
                taille = null;
            }
            try {
                vitesse = Integer.parseInt(data[idx++]);
            } catch (NumberFormatException ex) {
                vitesse = null;
            }
            couleur = data[idx++];
            try {
                canaux = Integer.parseInt(data[idx++]);
            } catch (NumberFormatException ex) {
                canaux = null;
            }

            face = data[idx++].toLowerCase();
            if (!(face.equals("a") || face.equals("b"))) {
                throw new VinylManagerException(Language.getInstance().get("csv.import.face.error"));
            }
            try {
                numeroPiste = Integer.parseInt(data[idx++]);
            } catch (NumberFormatException nex) {
                throw new VinylManagerException(Language.getInstance().get("csv.import.piste.num.error"));
            }
            nomPiste = data[idx++];
            if (data.length > idx) {
                try {
                    dureePiste = Integer.parseInt(data[idx++]);
                } catch (NumberFormatException nex) {
                    dureePiste = 0;
                    idx++;
                }
            } else {
                dureePiste = 0;
            }

            if (data.length > idx) {
                artistePiste = data[idx++];
            } else {
                artistePiste = "";
                idx++;
            }

            if (data.length > idx) {
                anneePiste = data[idx++];
            } else {
                anneePiste = "";
                idx++;
            }
        } else {
            hasDisques = false;
        }
    }

    public String getAnnee() {
        return annee;
    }

    public String getAnneeParution() {
        return anneeParution;
    }
    
    public String getAnneePiste() {
        return anneePiste;
    }

    public String getArtiste() {
        return artiste;
    }

    public String getArtistePiste() {
        return artistePiste;
    }

    public String getCommentaire() {
        return commentaire;
    }

    public boolean isCompilation() {
        return compilation;
    }

    public int getCote() {
        try {
            double coteD = Double.parseDouble(cote);
            return (int) Math.floor(coteD);
        } catch (NumberFormatException ex) {
            return 0;
        }
    }
    public boolean getCoteDemi(){
        return cote.endsWith(".5");
    }

    public String getCouleur() {
        return couleur;
    }

    public int getDisqueNumero() {
        return disqueNumero;
    }

    public int getDureePiste() {
        return dureePiste;
    }

    public String getEditeur() {
        return editeur;
    }

    public String getEtat() {
        return etat;
    }

    public String getFace() {
        return face;
    }

    public String getGenre() {
        return genre;
    }

    public String getMusiciens() {
        return musiciens;
    }

    public String getNomPiste() {
        return nomPiste;
    }

    public int getNumeroPiste() {
        return numeroPiste;
    }

    public String getReference() {
        return reference;
    }

    public Integer getTaille() {
        return taille;
    }

    public String getTitre() {
        return titre;
    }

    public String getValeur() {
        return valeur;
    }

    public boolean isHasDisques() {
        return hasDisques;
    }

    public String getDisqueEtat() {
        return disqueEtat;
    }

    public String getChef() {
        return chef;
    }

    public String getOrchestre() {
        return orchestre;
    }

    public String getCompositeur() {
        return compositeur;
    }

    public Integer getSupport() {
        return support;
    }

    public Integer getVitesse() {
        return vitesse;
    }

    public Date getDateAchat() {
        return dateAchat;
    }

    public String getParolier() {
        return parolier;
    }

    public boolean getPossede() {
        return possede;
    }

    public Integer getCanaux() {
        return canaux;
    }
    
    public String getPays(){
        return pays;
    }

    public String getLocation() {
        return location;
    }
    
    
    
    
}
