/**
 * Mp3Frame.java
 *
 * Caitlin Ross
 * 100735219
 */

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.util.*;

public class Mp3Frame extends JFrame{
	
	private SongList songList;
	private SearchPanel searchPanel;
	private OpenPanel openPanel;
	private ListPanel artistListPanel;
	private ListPanel songListPanel;
    private GridBagLayout layout;
    private GridBagConstraints constraints;
    private ListType searchType;

    public Mp3Frame() {
    	super("Mp3 Database: Caitlin Ross");
    	setDefaultCloseOperation(EXIT_ON_CLOSE);
    	searchType = ListType.ARTIST;
    	
    	songList = new SongList();
    	
    	layout = new GridBagLayout();
    	setLayout(layout);
    	constraints = new GridBagConstraints();
    	
    	searchPanel = new SearchPanel(this);
    	setConsts(0, 0, 50, 0);
    	layout.setConstraints(searchPanel, constraints);
    	add(searchPanel);
    	
    	openPanel = new OpenPanel(this);
    	setConsts(1, 0, 50, 0);
    	layout.setConstraints(openPanel, constraints);
    	add(openPanel);
    	
    	artistListPanel = new ListPanel(this, ListType.ARTIST);
    	setConsts(0, 1, 50, 100);
    	layout.setConstraints(artistListPanel, constraints);
    	add(artistListPanel);
    	
    	songListPanel = new ListPanel(this, ListType.SONG);
    	setConsts(1, 1, 50, 100);
    	layout.setConstraints(songListPanel, constraints);
    	add(songListPanel);
    	
    	pack();
    }
    
    public void searchButtonClicked(){
    	if(searchType == ListType.SONG){
    		songListPanel.setData(songList.findSongs(searchPanel.getSearchTemplate()));
    	}
    	else if (searchType == ListType.ARTIST){
    		artistListPanel.setData(songList.findArtists(searchPanel.getSearchTemplate()));
    	}
    	else{
    		//error
    	}
    }
    
    public void openButtonClicked(){
    	File dataFileOrDirectory = null;
    	String currentDirectoryProperty = System.getProperty("user.dir");
    	File currentDirectory = new File(currentDirectoryProperty);
    	
    	JFileChooser chooser = new  JFileChooser();
    	chooser.setCurrentDirectory(currentDirectory);
    	chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
    	
    	int returnVal = chooser.showOpenDialog(null);
    	
    	if (returnVal == JFileChooser.APPROVE_OPTION) { 
           dataFileOrDirectory = chooser.getSelectedFile();
    	   traverse(dataFileOrDirectory);
    	   artistListPanel.setData(songList.getArtists());
    	   songListPanel.setData(songList.getSongs());
   	    }
    }
    
    public void songRadioButtonClicked(){
    	searchType = ListType.SONG;
    }
    
    public void artistRadioButtonClicked(){
    	searchType = ListType.ARTIST;
    }
    
    public void artistSelected(Object obj){
    	String anArtist = (String)obj;
    	songListPanel.setData(songList.getSongsByArtist(anArtist));
    }
    
    public void songSelected(Object obj){
    	String aSong = (String)obj;
    	artistListPanel.setData(songList.getArtistsBySong(aSong));
    	Song selected = songList.getASong(aSong);
    	if(selected!=null)
    		openPanel.setSongData(selected);
    }
    
    private void traverse(File fileOrDir) {
    	//Recursive Case
        if (fileOrDir.isDirectory()) {
            File[] children = fileOrDir.listFiles();
            for (int i=0; i<children.length; i++) {
                traverse(children[i]);
            }
        }
        //Basis Case
        else {
            String fileName = fileOrDir.getName();
            StringTokenizer tokenizer = new StringTokenizer(fileName, "-");
            Song aSong;
            
            if(tokenizer.countTokens()==3){
            	aSong = new Song();
            	int aNumber;
            	try{
            		aNumber = Integer.parseInt(tokenizer.nextToken().trim());
            	}
            	catch(NumberFormatException e){
            		aNumber = 0;
            	}
            	
            	aSong.setTrackNumber(aNumber);
            	aSong.setArtist(tokenizer.nextToken().trim());
            	String aSongTitle = tokenizer.nextToken().trim();
            	aSong.setSongTitle(aSongTitle.substring(0,aSongTitle.length()-4));
            	tokenizer = new StringTokenizer(fileOrDir.getParent(), "-");
            	if(tokenizer.countTokens() >= 2){
            		tokenizer.nextToken();
            		aSong.setAlbum(tokenizer.nextToken().trim());
            	}
            	songList.addSong(aSong);
            }
        }
    }
    
    private void setConsts(int xpos, int ypos, int xweight, int yweight){
    	constraints.gridx = xpos;
    	constraints.gridy = ypos;
    	constraints.gridwidth = 1;
    	constraints.gridheight = 1;
    	constraints.fill = GridBagConstraints.BOTH;
    	constraints.weightx = xweight;
    	constraints.weighty = yweight;
    }
    
}