package be.msyben.vinylManager.pdf.datasources;

import be.msyben.vinylManager.entities.Album;
import be.msyben.vinylManager.entities.Collection;
import be.msyben.vinylManager.entities.Disque;
import be.msyben.vinylManager.tools.Sort;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRField;

/**
 * Datasource pour les rapports long en pdf
 *
 * @author Mathieu Syben
 */
public class ListeLong implements JRDataSource {

    private int idx = -1;
    private List<String[]> data = new ArrayList<String[]>();

    /**
     * Constructeur ptivé inutilisé
     */
    private ListeLong() {
    }

    /**
     * Constructeur
     *
     * @param collection la collection
     */
    public ListeLong(Collection collection) {

        List<Album> albums = collection.getAlbums();
        Sort.sort(albums);

        for (Album album : albums) {
            for (Disque disque : album.getDisques()) {

                int cote = album.getCote();
                String coteS = "";;
                if (cote > 0 && cote <= 5) {
                    coteS = cote + (album.getCoteDemi() ? ".5" : "") + "/5";
                }

                String titreDisque = album.getArtisteForList() + album.getAnnee() + album.getTitre() + disque.getNum();

                int max = Math.max(disque.getFaceA().size(), disque.getFaceB().size());
                for (int i = 0; i < max; i++) {

                    String titre1 = "";
                    if (i < disque.getFaceA().size()) {
                        titre1 = disque.getFaceA().get(i).toString();
                    }
                    String titre2 = "";
                    if (i < disque.getFaceB().size()) {
                        titre2 = disque.getFaceB().get(i).toString();
                    }

                    String[] entry;

                    if (album.getDisques().size() == 1) {
                        entry = new String[]{album.getArtisteForList(), album.getAnnee(), album.getTitre(), coteS, titreDisque, titre1, titre2};
                    } else {
                        entry = new String[]{album.getArtisteForList(), album.getAnnee(), album.getTitre() + " (disque " + disque.getNum() + ")", coteS, titreDisque, titre1, titre2};
                    }
                    data.add(entry);
                }
            }
        }
    }

    @Override
    public boolean next() throws JRException {
        if (data.isEmpty()) {
            return false;
        }
        idx++;
        return (idx < data.size());
    }

    @Override
    public Object getFieldValue(JRField jRField) throws JRException {
        if (jRField == null) {
            return null;
        }

        if (jRField.getName().equals("ARTISTE")) {
            return data.get(idx)[0];
        }
        if (jRField.getName().equals("ANNEE")) {
            return data.get(idx)[1];
        }
        if (jRField.getName().equals("TITRE")) {
            return data.get(idx)[2];
        }
        if (jRField.getName().equals("COTE")) {
            return data.get(idx)[3];
        }
        if (jRField.getName().equals("DISQUE")) {
            return data.get(idx)[4];
        }
        if (jRField.getName().equals("TITRE_DISQUE_1")) {
            return data.get(idx)[5];
        }
        if (jRField.getName().equals("TITRE_DISQUE_2")) {
            return data.get(idx)[6];
        }

        return null;
    }
}
