package sbu.javafx;

import javafx.animation.PauseTransition;
import javafx.fxml.FXML;
import javafx.event.ActionEvent;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.*;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.util.Duration;


public class MusicController {

    @FXML
    public ListView<Song> playlistListView;
    @FXML
    public ListView<Song> musicsListView;
    @FXML
    private VBox root;
    @FXML
    Label nowPlayingLabel;
    @FXML
    Button playPauseBtn;
    @FXML
    Button audioBtn;
    @FXML
    Button openPlaylistBtn;
    @FXML
    Button themeToggleBtn;
    @FXML
    Button nextBtn;
    @FXML
    Button preveBtn;
    @FXML
    Button repeatBtn;
    @FXML
    private Label messageLabel;
    private boolean isDarkMode=true;
    private boolean isPlaying=false;
    private boolean isMute=false;
    private boolean isOpen=false;
    private boolean isRepeat=false;
    private Song currentSong = null;
    ImageView playIcon;
    ImageView pauseIcon;
    ImageView audioIcon;
    ImageView muteIcon;

    String path;
    Media media;
    MediaPlayer player ;

    // TODO: Define your UI components using the @FXML annotation.

    @FXML
    public void initialize() {
        Image playImg = new Image(getClass().getResourceAsStream("/image/play.png"));
        Image pauseImg = new Image(getClass().getResourceAsStream("/image/pause.png"));
        Image audioImg= new Image(getClass().getResourceAsStream("/image/icons8-audio-64.png"));
        Image muteImg= new Image(getClass().getResourceAsStream("/image/icons8-mute-64.png"));

        playIcon = new ImageView(playImg);
        pauseIcon = new ImageView(pauseImg);
        audioIcon= new ImageView(audioImg);
        muteIcon= new ImageView(muteImg);

        playIcon.setFitWidth(35);
        playIcon.setFitHeight(35);
        pauseIcon.setFitWidth(35);
        pauseIcon.setFitHeight(35);
        audioIcon.setFitWidth(35);
        audioIcon.setFitHeight(35);
        muteIcon.setFitWidth(35);
        muteIcon.setFitHeight(35);

        playPauseBtn.setGraphic(playIcon);

        nextBtn.setOnAction(e ->{

            player.pause();

            if(isOpen) {
                currentSong=playlistListView.getItems().get(findIndex(playlistListView,currentSong)+1);
                setPlayer(currentSong).play();
            }else{
                currentSong=musicsListView.getItems().get(findIndex(musicsListView,currentSong)+1);
                setPlayer(currentSong).play();
            }
        });

        preveBtn.setOnAction(e ->{

            player.pause();

            if(isOpen) {
                currentSong=playlistListView.getItems().get(findIndex(playlistListView,currentSong)-1);
                setPlayer(currentSong).play();
            }else{
                currentSong=musicsListView.getItems().get(findIndex(musicsListView,currentSong)-1);
                setPlayer(currentSong).play();
            }
        });

        repeatBtn.setOnAction(e->{
            if(!isRepeat){
                repeatBtn.setStyle(
                        "-fx-border-color: blue;" +
                                "-fx-border-width: 2px;" +
                                "-fx-border-radius: 100em;"
                );
                isRepeat=true;
            }else{
                repeatBtn.setStyle("-fx-border-color: transparent;");
                isRepeat=false;
            }
        });

    }

    public void setupListView(ListView<Song> listView) {

        listView.setCellFactory(param -> new ListCell<Song>() {
            @Override
            protected void updateItem(Song song, boolean empty) {
                super.updateItem(song, empty);

                if (empty || song == null) {
                    setText(null);
                    setGraphic(null);
                    return;
                }

                Label nameLabel = new Label(song.getName());
                nameLabel.setStyle("-fx-font-weight: bold; -fx-font-size: 14px;");

                Label singerLabel = new Label(song.getSinger());
                singerLabel.setStyle("-fx-text-fill: gray; -fx-font-size: 12px;");

                VBox songInfo = new VBox(3);
                songInfo.setAlignment(Pos.CENTER_LEFT);

                songInfo.getChildren().addAll(nameLabel, singerLabel);

                Button addToPlaylistBtn = new Button("Add to playlist");
                addToPlaylistBtn.getStyleClass().add("playlist-button");
                addToPlaylistBtn.setOnAction(e -> {
                    addToPlaylist(e, song);
                });

                Button playBtn = new Button("Play");
                playBtn.getStyleClass().add("play-button");
                playBtn.setOnAction(e -> {
                    play(e, song);
                });

                HBox row = new HBox(10);
                row.setPadding(new Insets(10));
                row.setAlignment(Pos.CENTER_LEFT);

                Region spacer = new Region();
                HBox.setHgrow(spacer, Priority.ALWAYS);

                row.getChildren().addAll(songInfo, spacer, playBtn, addToPlaylistBtn);

                setGraphic(row);
            }
        });
    }

    @FXML
    public void toggleTheme(ActionEvent event) {
        if (isDarkMode) {
            themeToggleBtn.setText("Dark");
            changeTheme();
            isDarkMode = false;
        } else {
            themeToggleBtn.setText("Light");
            changeTheme();
            isDarkMode = true;
        }
    }

    public void changeTheme(){
        Scene scene = root.getScene();
        scene.getStylesheets().clear();

        if(isDarkMode){
            scene.getStylesheets().add(
                    getClass().getResource("/css/dark.css").toExternalForm()
            );

        }else{
            scene.getStylesheets().add(
                    getClass().getResource("/css/light.css").toExternalForm()
            );
        }

        isDarkMode=!isDarkMode;
    }

    //TODO: Implement the logic to play a song. This method should update the UI to show which song is currently playing.


    public MediaPlayer setPlayer(Song song) {//این تابع برای ست کردن مدیای در حال پخشه

        nowPlayingLabel.setText(song.getName());

        path = getClass()
                .getResource(song.getPath())
                .toExternalForm();
        media = new Media(path);
        player = new MediaPlayer(media);

        //این برا اینه که تموم شد بره بعدی
        player.setOnEndOfMedia(() -> {
            if(isRepeat){
                player.seek(player.getStartTime());
                player.play();
            }
            else
                nextBtn.fire();
        });

        return player;
    }

    public void play(ActionEvent event, Song song){

        currentSong = song;

        if(player != null){
            player.stop();
        }

        setPlayer(currentSong);

        player.play();

        isPlaying = true;

        playPauseBtn.setGraphic(pauseIcon);
    }

    @FXML
    public void playPause(ActionEvent a){

        if(player == null){
            return;
        }

        if(isPlaying){
            playPauseBtn.setGraphic(playIcon);

            player.pause();
            isPlaying = false;

        } else {
            playPauseBtn.setGraphic(pauseIcon);

            player.play();
            isPlaying = true;
        }
    }

    @FXML
    public void mute(ActionEvent e){
        if(!isMute){
            audioBtn.setGraphic(muteIcon);
            player.setVolume(0);
            isMute=true;
        }else{
            audioBtn.setGraphic(audioIcon);
            player.setVolume(100);
            isMute=false;
        }
    }

    //TODO: Logic to add a specific song to the user's playlist.

    public void addToPlaylist(ActionEvent event, Song song) {
        //Add the song to a list or update a ListView.
        playlistListView.getItems().add(song);

        messageLabel.setText("Added to playlist!");
        messageLabel.setVisible(true);

        PauseTransition pause = new PauseTransition(Duration.seconds(2));

        pause.setOnFinished(e -> {
            messageLabel.setVisible(false);
        });

        pause.play();
    }

    // TODO:This method should open a new window or change the current scene  to display the "Playlist" page.

    public void openPlaylistWindow(ActionEvent e) {

        if(isPlaying) {
            playPause(e);
        }

        if(!isOpen){
            // باز کردن پلی لیست
            if(playlistListView.getItems().isEmpty()){

                Alert alert = new Alert(Alert.AlertType.WARNING);

                alert.setTitle("Empty Playlist");
                alert.setHeaderText(null);
                alert.setContentText("Playlist is empty!");

                alert.showAndWait();

                return;
            }

            isOpen = true;

            openPlaylistBtn.setText("Back");

            musicsListView.setVisible(false);
            musicsListView.setManaged(false);

            playlistListView.setVisible(true);
            playlistListView.setManaged(true);

        } else {
            // برگشت به صفحه اصلی
            isOpen = false;

            openPlaylistBtn.setText("Open Playlist");

            musicsListView.setVisible(true);
            musicsListView.setManaged(true);

            playlistListView.setVisible(false);
            playlistListView.setManaged(false);
        }
    }

    public int findIndex(ListView<Song> listView, Song song){
        for(int i = 0; i < listView.getItems().size(); i++){

            if(listView.getItems().get(i).equals(song)){
                return i;
            }
        }

        return -1;
    }

}


