package jnet.client;

import java.io.File;
import java.io.IOException;
import java.util.ListIterator;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import jnet.lib.Status;
import jnet.lib.object.Map;
import jnet.lib.object.MapObject;

public class SoundManager {
    
    private static int count = 0;
    
    
    public static void playOnline(){
        int count = 0;
        for (Map map : Client.maps) {
            for (MapObject object : map.getObjects()) {
                if (object.getStatus() == Status.OFFLINE && count != 0) {
                    playNextOffline();
                    break;
                } else if (object.getStatus() == Status.OFFLINE) {
                    count++;
                    playFirstOffline();
                    break;
                }
            }
        }
    }
    
    public static void changeStatus(int state){
        if (Client.config.getBoolean("sound")) {
            if (count == 0 && state == Status.OFFLINE) {
                count++;
                playFirstOffline();
            } else if (count > 0 && state == Status.OFFLINE) {
                count++;
                playNextOffline();
            } else if (count != 1 && state == Status.OK) {
                count--;
                playOneOnline();
            } else if (count == 1 && state == Status.OK) {
                count--;
                playAllOnline();
            }
        }
        
        
    }
    
    public static void playOneOnline(){
            playSound(Client.config.getString("sound_one_online"), Client.config.getInt("volume"));  
    }
    
    public static void playAllOnline(){
            playSound(Client.config.getString("sound_all_online"), Client.config.getInt("volume"));  
    }
    
    public static void playFirstOffline(){
            playSound(Client.config.getString("sound_first_offline"), Client.config.getInt("volume"));  
    }
    
    public static void playNextOffline(){
            playSound(Client.config.getString("sound_next_offline"), Client.config.getInt("volume"));  
    }

    public static void playSound(String filePath, int volume) {
        try {
            File zvukovySoubor = new File(filePath);
            AudioInputStream audioStream = AudioSystem.getAudioInputStream(zvukovySoubor);

            // Získání zvukového klipu
            Clip clip = AudioSystem.getClip();
            clip.open(audioStream);

            // Nastavení hlasitosti
            FloatControl ovladaniHlasitosti = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);

            setVolume(ovladaniHlasitosti, volume);
            
            // Přehrání zvuku
            clip.start();



            // Čekání na dokončení přehrávání
           Thread.sleep(clip.getMicrosecondLength() / 1000);

        } catch (UnsupportedAudioFileException e) {
            System.out.println("Nepodporovaný formát souboru.");
        } catch (IOException e) {
            System.out.println("Chyba při načítání souboru.");
        } 
        catch (LineUnavailableException e) {
            System.out.println("Zvukové zařízení není dostupné.");
        } catch (InterruptedException e) {
            System.out.println("Přehrávání bylo přerušeno.");
        }
    }
    
    /**
     * Nastavení hlasitosti.
     * @param volumeControl Objekt pro ovládání hlasitosti.
     * @param percent Požadovaná hlasitost v procentech (0 - 100).
     */
    private static void setVolume(FloatControl volumeControl, int percent) {
        float min = volumeControl.getMinimum(); // Minimální hodnota v dB
        float max = volumeControl.getMaximum(); // Maximální hodnota v dB
        float range = max - min;
        float value = min + (range * percent / 100); // Výpočet hodnoty v dB
        volumeControl.setValue(value);
    }

}
