package be.msyben.vinylManager.tools.internalEntities;

import be.msyben.vinylManager.entities.Album;
import be.msyben.vinylManager.entities.Disque;
import be.msyben.vinylManager.properties.Canaux;
import be.msyben.vinylManager.properties.Support;
import be.msyben.vinylManager.properties.Taille;
import be.msyben.vinylManager.properties.Vitesse;
import java.lang.reflect.InvocationTargetException;
import org.apache.commons.beanutils.PropertyUtils;

/**
 * Champs affichable et utilisé pour le tri pour l'arbre.
 *
 * @author Mathieu Syben
 */
public final class TreeSortColumn {

    /**
     * Constructeur.
     */
    private TreeSortColumn() {
    }

    /**
     * Récupère le nom du champs à utiliser pour le tri.
     *
     * @param selection l'identifiant de colonne.
     * @return le nom du champs à utiliser pour le tri.
     */
    public static String getFieldNameForSorting(int selection) {
        switch (TreeSortColumnEnum.getTreeSortColumnEnum(selection)) {
            case artiste:
                return "artisteForSorting";
            default:
                return TreeSortColumnEnum.getTreeSortColumnEnum(selection).getField();
        }
    }

    /**
     * Récupère la valeur de l'album pour le tri en fonction du champs choisi.
     * @param album L'album
     * @param selection L'identifiant du champs choisi.
     * @return La valeur pour le tri.
     */
    public static String getValueForSorting(Album album, int selection) {
        String needed = getFieldNameForSorting(selection);
        String display = "";
        try {
            Object obj = PropertyUtils.getProperty(album, needed);
            display = obj == null ? "" : obj.toString();
        } catch (IllegalAccessException ex) {
        } catch (InvocationTargetException ex) {
        } catch (NoSuchMethodException ex) {
        }
        return display;
    }

    /**
     * Récupère l'affichage suivant la sélection pour un album. Traitement
     * spécifique pour la vitesse et la taille.
     *
     * @param album l'album dont on veut récupérer la propriété.
     * @param selection L'id de la colonne.
     * @return La propriété à afficher.
     */
    public static String getDisplay(Album album, int selection) {
        switch (TreeSortColumnEnum.getTreeSortColumnEnum(selection)) {
            case artiste:
                return album.getArtisteForList();
            case support:
                return Support.getSupport(album.getSupport()).getName();
            default:
                String display = "";
                try {
                    Object obj = PropertyUtils.getProperty(album, TreeSortColumnEnum.getTreeSortColumnEnum(selection).getField());
                    display = obj == null ? "" : obj.toString();
                } catch (IllegalAccessException ex) {
                } catch (InvocationTargetException ex) {
                } catch (NoSuchMethodException ex) {
                }
                return display;
        }

    }

    /**
     * Récupère la vitesse d'un album (de ses disques).
     * @param a l'album.
     * @return la vitesse de l'album. Si ce n'est pas un vinyl, alors le nom du support.
     */
    public static String getVitesseForAlbum(Album a) {
        if (a == null) {
            return "";
        }

        Support sup = Support.getSupport(a.getSupport());
        if (sup != Support.vinyl) {
            return sup.getName();
        }

        boolean v33 = false;
        boolean v45 = false;
        boolean v78 = false;
        boolean v16 = false;
        boolean vna = false;

        for (Disque d : a.getDisques()) {
            Vitesse v = Vitesse.getVitesse(d.getVitesse());
            switch (v) {
                case vitesse16:
                    v16 = true;
                    break;
                case vitesse33:
                    v33 = true;
                    break;
                case vitesse45:
                    v45 = true;
                    break;
                case vitesse78:
                    v78 = true;
                    break;
                case vitesseNA:
                    vna = true;
                    break;
                default:
                    break;
            }
        }
        boolean already = false;
        String ret = "";
        if (v33) {
            if (already) {
                ret += " + ";
            }
            ret += Vitesse.vitesse33.getName();
            already = true;
        }
        if (v45) {
            if (already) {
                ret += " + ";
            }
            ret += Vitesse.vitesse45.getName();
            already = true;
        }
        if (v78) {
            if (already) {
                ret += " + ";
            }
            ret += Vitesse.vitesse78.getName();
            already = true;
        }
        if (v16) {
            if (already) {
                ret += " + ";
            }
            ret += Vitesse.vitesse16.getName();
            already = true;
        }
        if (vna) {
            if (already) {
                ret += " + ";
            }
            ret += Vitesse.vitesseNA.getName();
            already = true;
        }

        return ret;
    }

    /**
     * Récupère la taille d'un album (de ses disques).
     * @param a l'album.
     * @return la taille de l'album. Si ce n'est pas un vinyl, alors le nom du support.
     */
    public static String getTailleForAlbum(Album a) {
        if (a == null) {
            return "";
        }

        Support sup = Support.getSupport(a.getSupport());
        if (sup != Support.vinyl) {
            return sup.getName();
        }

        boolean t30 = false;
        boolean t25 = false;
        boolean t17 = false;
        boolean tna = false;

        for (Disque d : a.getDisques()) {
            Taille t = Taille.getTaille(d.getTaille());
            switch (t) {
                case taille17:
                    t17 = true;
                    break;
                case taille25:
                    t25 = true;
                    break;
                case taille30:
                    t30 = true;
                    break;
                case tailleNA:
                    tna = true;
                    break;
                default:
                    break;
            }
        }

        boolean already = false;
        String ret = "";
        if (t30) {
            if (already) {
                ret += " + ";
            }
            ret += Taille.taille30.getName();
            already = true;
        }
        if (t25) {
            if (already) {
                ret += " + ";
            }
            ret += Taille.taille25.getName();
            already = true;
        }
        if (t17) {
            if (already) {
                ret += " + ";
            }
            ret += Taille.taille17.getName();
            already = true;
        }
        if (tna) {
            if (already) {
                ret += " + ";
            }
            ret += Taille.tailleNA.getName();
            already = true;
        }

        return ret;
    }

    /**
     * Récupère les canaux d'un album (de ses disques).
     * @param a l'album.
     * @return les canaux de l'album. 
     */
    public static String getCanauxForTree(Album a) {
        if (a == null) {
            return "";
        }


        boolean cstereo = false;
        boolean cmono = false;
        boolean cmulti = false;
        boolean cautre = false;

        for (Disque d : a.getDisques()) {
            if (d.getCanaux() != null) {
                Canaux c = Canaux.getCanaux(d.getCanaux());
                switch (c) {
                    case stereo:
                        cstereo = true;
                        break;
                    case mono:
                        cmono = true;
                        break;
                    case multicanaux:
                        cmulti = true;
                        break;
                    case autre:
                        cautre = true;
                        break;
                    default:
                        break;
                }
            }
        }

        boolean already = false;
        String ret = "";
        if (cstereo) {
            if (already) {
                ret += " + ";
            }
            ret += Canaux.stereo.getName();
            already = true;
        }
        if (cmono) {
            if (already) {
                ret += " + ";
            }
            ret += Canaux.mono.getName();
            already = true;
        }
        if (cmulti) {
            if (already) {
                ret += " + ";
            }
            ret += Canaux.multicanaux.getName();
            already = true;
        }
        if (cautre) {
            if (already) {
                ret += " + ";
            }
            ret += Canaux.autre.getName();
            already = true;
        }

        return ret;
    }
}
