package com.gdx.musicevents.tool;

import java.io.File;
import java.io.FileFilter;
import java.text.Collator;
import java.util.Comparator;

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Button;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.List;
import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.ui.TextButton;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.gdx.musicevents.MusicState;
import com.gdx.musicevents.Track;
import com.gdx.musicevents.tool.file.FileChooser;
import com.gdx.musicevents.tool.file.FileChooser.ResultListener;

public class TrackListPanel extends Table {
    

    
    private final Comparator<Track> comparator = new Comparator<Track>() {
        @Override
        public int compare(Track o1, Track o2) {

            Collator comp = java.text.Collator.getInstance();
            return comp.compare(o1.toString(), o2.toString());
        }
    };
    
    private MusicState state;

    private Button removeTrack;

    private Button addTrack;

    private List<Track> trackList;
    
    public TrackListPanel(final Skin skin, final Stage stage, final MusicStatePanel eventDetailsPanel) {
        super(skin);

        setBackground(skin.getDrawable("panel-background"));
        
        this.top().left();
        this.defaults().top().left().pad(2);
        
        final Label tracksLabel = new Label("Tracks", skin, "title");
        this.add(tracksLabel).fillX().expandX().colspan(2).row();

        trackList = new List<Track>(skin);
        this.add(new ScrollPane(trackList)).fill().expand().colspan(2).row();
        
        addTrack = new TextButton("Add", skin);
        addTrack.addListener(new ChangeListener() {
            @Override
            public void changed(ChangeEvent event, Actor actor) {
                if(!addTrack.isChecked()){
                    return;
                }
                
                final String basePath = eventDetailsPanel.getManager().getBasePath();
                
                FileChooser dialog = FileChooser.createPickDialog("Add track", skin, Gdx.files.internal(basePath));
                dialog.setResultListener(new ResultListener() {
                    @Override
                    public boolean result(boolean success, FileHandle result) {
                        if(success){
                            Track track = new Track(result.name());
                            track.init(basePath, state);
                            state.addTrack(track);
                        }
                        eventDetailsPanel.show(state);
                        return true;
                    }
                });
                dialog.disableDirectoryBrowsing();
                dialog.setOkButtonText("Add");
                dialog.setFilter(new FileFilter() {
                    @Override
                    public boolean accept(File pathname) {
                        String path = pathname.getPath();
                        return path.matches(".*(?:ogg|mp3|wav)");
                    }
                });
                dialog.show(stage);
                
                addTrack.setChecked(false);
            }
        });
        
        this.add(addTrack).fillX().expandX();
        
        removeTrack = new TextButton("Remove", skin);
        removeTrack.addListener(new ChangeListener(){
            @Override
            public void changed(ChangeEvent event, Actor actor) {
                if(!removeTrack.isChecked()){
                    return;
                }
                
                Track track = trackList.getSelected();
                state.removeTrack(track);
                eventDetailsPanel.show(state);
                
                removeTrack.setChecked(false);
            }
        });
        
        this.add(removeTrack).fillX().expandX();
        
        trackList.addListener(new ChangeListener(){
            @Override
            public void changed(ChangeEvent event, Actor actor) {
                enableDisable(trackList, addTrack, removeTrack);
            }
        });
    }
    
    private void updateTrackList(List<Track> trackList, final MusicState state) {
        trackList.getItems().clear();
        trackList.setItems(state.getTracks());
        trackList.getItems().sort(comparator);
    }
    
    private void enableDisable(List<Track> trackList, Button add, Button remove){
        add.setDisabled(state == null);
        remove.setDisabled(trackList.getSelected() == null || trackList.getItems().size == 0);
    }

    public void setMusicState(MusicState state) {
        this.state = state;
        updateTrackList(trackList, state);
        enableDisable(trackList, addTrack, removeTrack);
    }
}