/******************************************************************************
 ** $Id: Absprache.java 814 2015-11-13 13:02:30Z wmh $
 ** Diese Datei ist Bestandteil der Java-Quelltexte des Würfelspiels JaFuffy.
 ** Lauffähig ab Java 7.
 ******************************************************************************
 ** Copyright (C) Wolfgang Hauck <wolfgang.hauck@3kelvin.de>
 ******************************************************************************
 ** This program is free software: you can redistribute it and/or modify
 ** it under the terms of the GNU General Public License as published by
 ** the Free Software Foundation, either version 3 of the License, or
 ** (at your option) any later version.
 **
 ** This program is distributed in the hope that it will be useful,
 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ** GNU General Public License for more details.
 **
 ** You should have received a copy of the GNU General Public License
 ** along with this program.  If not, see <http://www.gnu.org/licenses/>.
 ******************************************************************************
 ** Die aktuellste Version von JaFuffy findet sich im Internet unter
 ** <http://jafuffy.3kelvin.de>.
 **
 ** Kommentare, Fehler oder Erweiterungswünsche bitte per E-Mail senden an
 ** <jafuffy@3kelvin.de>.
 ******************************************************************************/
package jafuffy;

import java.io.IOException;
import java.net.URL;

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;

/** Bereitstellung von URLs für Ressourcen. */
public enum Ressource {

    /** Liefert eine Ressource zurück, welche sich auf einen Text aus der Anleitung bezieht. */
    ANLEITUNG("/Anleitung/"),
    /** Liefert eine Ressource zurück, welche sich auf einen Informationstext bezieht. */
    LIESMICH("/Liesmich/"),
    /** Liefert eine Ressource zurück, welche sich auf einen Sound bezieht. */
    SOUND("sounds/"),
    /** Liefert eine Ressource zurück, welche sich auf eine Grafik oder ein Icon bezieht. */
    ICON("icons/");

    /** Gibt an, ob Stummschaltung vorliegt. */
    private static boolean stumm = false;

    /**
     * Erzeugt einen Clip zu einer Tondatei zum wiederholten Abspielen.
     * 
     * @param name
     *            Name der Tondatei
     * @return Clip, der wiederholt abgespielt werden kann.
     */
    public static Clip clip(final String name) {
        if (soundsystem()) {
            try {
                final AudioInputStream stream = AudioSystem.getAudioInputStream(Ressource.SOUND.url(name));
                final DataLine.Info info = new DataLine.Info(Clip.class, stream.getFormat());
                final Clip clip = (Clip) AudioSystem.getLine(info);
                try {
                    clip.open(stream);
                } catch (LineUnavailableException exception) {
                    exception.printStackTrace();
                }

                return clip;
            } catch (UnsupportedAudioFileException | IOException | LineUnavailableException exception) {
                exception.printStackTrace();
            }
        }
        return null;
    }

    /** Stummschaltung. */
    public static void schalteStumm() {
        stumm = true;
    }

    /** @return Gibt an, ob Soundsystem vorhanden ist. */
    public static boolean soundsystem() {
        return !stumm && AudioSystem.getMixerInfo().length > 0;
    }

    /** Art der Ressource. */
    private final String art;

    /**
     * Konstruktor.
     *
     * @param art
     *            Die Art der Ressource.
     */
    Ressource(String art) {
        this.art = art;
    }

    /**
     * Baut eine URL für eine Ressource zusammen.
     *
     * @param name
     *            Name der Ressource
     * @return Liefert URL für gefundene Ressource zurück
     */
    public URL url(String name) {
        URL url;
        url = Ressource.class.getResource(art + name);
        if (url == null) {
            System.out.println("Ressource \"" + art + name + "\" nicht gefunden!");
        }
        return url;
    }

}
