package be.msyben.vinylManager.tools.importexport;

import be.msyben.vinylManager.entities.Album;
import be.msyben.vinylManager.entities.Collection;
import be.msyben.vinylManager.entities.Disque;
import be.msyben.vinylManager.entities.Titre;
import be.msyben.vinylManager.tools.Tools;
import java.io.File;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

/**
 * Classe permettant l'export au format csv.
 * Le format :
 *   titre
 *   artiste
 *   compositeur
 *   reference
 *   editeur
 *   annee
 *   anneeParution
 *   pays
 *   chef
 *   orchestre
 *   musiciens
 *   etat
 *   commentaire
 *   cote
 *   genre
 *   valeur
 *   support
 *   parolier
 *   location
 *   possede
 *   date achat
 *   compilation
 *           num
 *           etat
 *           taille
 *           vitesse
 *           couleur
 *           canaux
 *           A|B
 *                   num
 *                   nom
 *                   duree
 *                   artiste
 *                   annee
 * @author Mathieu Syben
 */
public class CsvExport {

    /**
     * Le séparateur.
     */
    private static final char SEPARATOR = ';';
    private static final DateFormat df= new SimpleDateFormat("dd/MM/yyyy");

    /**
     * Exporte la collection courante en csv
     * @param f Le fichier devant contenir le csv
     */
    public static void exporterCSV(File f, Collection collection) {
        StringBuilder sb = new StringBuilder("");
        for (Album album : collection.getAlbums()) {
            if (album.getDisques().isEmpty()) {
                sb.append(makeLigne(album));
            } else {
                boolean add = false;
                for (Disque disque : album.getDisques()) {
                    for (Titre titre : disque.getFaceA()) {
                        sb.append(makeLigne(album, disque, titre, "A"));
                        add=true;
                    }
                    for (Titre titre : disque.getFaceB()) {
                        sb.append(makeLigne(album, disque, titre, "B"));
                        add=true;
                    }
                }
                if (!add){
                    sb.append(makeLigne(album));
                }
            }
        }
        Tools.writeFile(f, sb.toString().getBytes(Tools.defaultCharset));
    }

    /**
     * Crée une ligne.
     * @param album L'album
     * @param disque Le disque
     * @param titre Le titre
     * @param face La face (a ou b)
     * @return La ligne créée.
     */
    private static String makeLigne(Album album, Disque disque, Titre titre, String face) {        
        StringBuilder sb = new StringBuilder("");
        sb.append(prepare(album.getTitre()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getArtiste()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getCompositeur()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getReference()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getEditeur()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getAnnee()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getAnneeParution()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getPays()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getChef()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getOrchestre()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getMusiciens()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getEtat()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getCommentaire()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getCote(),album.getCoteDemi()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getGenre()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getValeur()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getSupport()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getParolier()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getLocation()));
        sb.append(SEPARATOR);
        sb.append(album.getPossede());
        sb.append(SEPARATOR);
        sb.append(album.getDateAchat()==null?"":df.format(album.getDateAchat()));
        sb.append(SEPARATOR);
        sb.append(album.getCompliation());
        sb.append(SEPARATOR);
        sb.append(prepare(disque.getNum()));
        sb.append(SEPARATOR);
        sb.append(prepare(disque.getEtat()));
        sb.append(SEPARATOR);
        sb.append(prepare(disque.getTaille()));
        sb.append(SEPARATOR);
        sb.append(prepare(disque.getVitesse()));
        sb.append(SEPARATOR);
        sb.append(prepare(disque.getCouleur()));
        sb.append(SEPARATOR);
        sb.append(prepare(disque.getCanaux()));
        sb.append(SEPARATOR);
        sb.append(face);
        sb.append(SEPARATOR);
        sb.append(prepare(titre.getNum()));
        sb.append(SEPARATOR);
        sb.append(prepare(titre.getNom()));
        sb.append(SEPARATOR);
        sb.append(prepare(titre.getDuree()));
        sb.append(SEPARATOR);
        sb.append(prepare(titre.getArtiste()));
        sb.append(SEPARATOR);
        sb.append(prepare(titre.getAnnee()));
        sb.append("\r\n");
        return sb.toString();
    }

    /**
     * Crée une ligne.
     * @param album L'album
     * @param disque Le disque
     * @param titre Le titre
     * @param face La face (a ou b)
     * @return La ligne créée.
     */
    private static String makeLigne(Album album) {
        StringBuilder sb = new StringBuilder("");
        sb.append(prepare(album.getTitre()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getArtiste()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getCompositeur()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getReference()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getEditeur()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getAnnee()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getAnneeParution()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getPays()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getChef()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getOrchestre()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getMusiciens()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getEtat()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getCommentaire()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getCote()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getGenre()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getValeur()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getSupport()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getParolier()));
        sb.append(SEPARATOR);
        sb.append(prepare(album.getLocation()));
        sb.append(SEPARATOR);
        sb.append(album.getPossede());
        sb.append(SEPARATOR);
        sb.append(album.getDateAchat()==null?"":df.format(album.getDateAchat()));
        sb.append(SEPARATOR);
        sb.append(album.getCompliation());
        sb.append("\r\n");
        return sb.toString();
    }

    /**
     * Préparation d'un entier.
     * @param i l'entier
     * @return Sa version en string.
     */
    private static String prepare(Integer i) {
        if (i == null) {
            return "";
        }
        return i.toString();
    }
    
    /**
     * Préparation d'une cote.
     * @param i la cote
     * @param demi x.5 ?
     * @return Sa version en string.
     */
    private static String prepare(Integer i, boolean demi) {
        if (i == null) {
            return "";
        }
        return i + (demi?".5":"");
    }

    /**
     * Prepare un string
     * @param s le String à préparer.
     * @return La version qu'il est possible de mettre dans le CSV
     */
    private static String prepare(String s) {
        if (s == null) {
            return "";
        }
        String ret = s;
        ret = ret.replace("" + SEPARATOR, " ");
        ret = ret.replace("\r", "\\r");
        ret = ret.replace("\n", "\\n");
        return ret;
    }
}
