package org.Models;

import java.io.IOException;
import java.io.InputStream;

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

/**
 * Classe Musique n'étant pas purement données métier, donc n'aurait normalement
 * sa place dans le package Models. Il faudrait l'externaliser. Par manque de
 * temps, suite à notre discussion, nous avons décidé de laisser la musique ici.
 */
public class Musique {
    private Clip clip;
    private long clipPositionPause = 0;
    private boolean estEnPause = false;
    private boolean estArrete = false;
    private boolean estInitialise = false;

    public Musique() {
        initialiserClip();
    }

    /**
     * Initialise le clip audio à partir du fichier TetrisMusic.wav.
     */
    private void initialiserClip() {
        try {
            InputStream audioSrc = getClass().getResourceAsStream("/TetrisMusic.wav");
            if (audioSrc == null) {
                
                return;
            }

            AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioSrc);
            clip = AudioSystem.getClip();
            clip.open(audioStream);
            estInitialise = true;

            clip.addLineListener(event -> {
                if (event.getType() == LineEvent.Type.STOP && !estEnPause && !estArrete) {
                    clip.setFramePosition(0);
                    clip.start();
                }
            });

            System.out.println("Clip audio initialisé avec succès.");
        } catch (UnsupportedAudioFileException e) {
            
        } catch (LineUnavailableException e) {
            
        } catch (IOException e) {
            
        }
    }

    /**
     * Joue la musique à partir du début.
     */
    public void start() {
        if (estInitialise && !estArrete) {
            clip.setFramePosition(0);
            clip.start();
            estEnPause = false;
            System.out.println("Lecture de la musique...");
        }
        System.out.println("Fin du thread de musique.");
    }

    /**
     * met en pause la musique. rejoue la musique à partir de la position actuelle.
     */
    public void basculePlayPause() {
        if (!estInitialise || estArrete)
            return;

        estEnPause = !estEnPause;

        if (estEnPause) {
            clipPositionPause = clip.getMicrosecondPosition();
            clip.stop();
            System.out.println("Musique en pause à la position " + clipPositionPause + " µs");
        } else {
            clip.setMicrosecondPosition(clipPositionPause);
            clip.start();
            System.out.println("Musique reprise à la position " + clipPositionPause + " µs");
        }
    }

    /**
     * Arrête la musique et libère les ressources.
     */
    public void arreterMusique() {
        if (estInitialise) {
            estArrete = true;
            clip.stop();
            clip.close();
            System.out.println("Arrêt de la musique.");
        }
    }
}