package jp.ac.kyutech.mns.ist;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import jp.ac.kyutech.mns.ist.util.QuickMenuActionManager;
import jp.ac.kyutech.mns.ist.util.SingleSelector;

public class ConfigPanel_PImageFinder extends ConfigPanel implements Runnable {
	private static final long serialVersionUID = 3082367152537393670L;
	Thread t;
	final SimpleATN satn;
	File basedir;
	ArrayList<File> candidates;
	
	JLabel home, base, current;
	public ConfigPanel_PImageFinder(final SimpleATN satn, File _basedir, JFrame parent){
		super(parent);
		String os = System.getProperty("os.name");
		if (os.startsWith("Mac OS")){
			_basedir = new File(System.getProperty("user.dir")+"/Desktop");
		}
		basedir = _basedir;
		this.satn = satn;
		candidates = new ArrayList<File>();
//		t = new Thread(this);
//		t.start();
		run();
		
		//設定画面用の画面
		tabIcon = QuickMenuActionManager.createNavigationIcon("development/Applet"+"24");
		tabTitle = "背景画像";
		
//		setBorder(BorderFactory.createTitledBorder("背景画像"));
		setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

		
		JPanel currentP = new JPanel();
		currentP.setBorder(BorderFactory.createTitledBorder("背景画像の設定"));
		currentP.setLayout(new BoxLayout(currentP, BoxLayout.Y_AXIS));
		currentP.setAlignmentX(CENTER_ALIGNMENT);
		
		
		current = new JLabel(satn.pimagePath);
		current.setBorder(BorderFactory.createTitledBorder("現在の背景画像フォルダ"));
		currentP.add(current);
		
		JButton changeCurrentJB = new JButton("背景画像フォルダを変更");
		currentP.add(changeCurrentJB);
		changeCurrentJB.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				selectBGImagePath();
			}
		});

		currentP.add(new JLabel(" "));

		JButton openJB = new JButton("背景画像フォルダをエクスプローラで開く");
		currentP.add(openJB);
		openJB.addActionListener(new ActionListener(){
			@Override
			public void actionPerformed(ActionEvent arg0) {
				Runtime runtime = Runtime.getRuntime();
				try{
					runtime.exec("cmd.exe /c start " + satn.pimagePath);
				}catch(IOException ex){
					ex.printStackTrace();
				}
			}
		});
		currentP.add(openJB);

//		currentP.add(new JLabel(" "));
		currentP.add(new JLabel(" "));

		base = new JLabel(basedir.getAbsolutePath());
		base.setBorder(BorderFactory.createTitledBorder("検索起点フォルダ"));
		currentP.add(base);

		home = new JLabel(new File(System.getProperty("user.dir")).getAbsolutePath());
		home.setBorder(BorderFactory.createTitledBorder("カレントディレクトリ （jar / jnlp の起動場所）"));
		currentP.add(home);

		add(currentP);
}
	public JFrame findActiveParent(){
		if (frame.isShowing()) return frame;
		else return satn;
	}
	public void update(){
		current.setText(satn.pimagePath);
		base.setText(basedir.getAbsolutePath());
	}

	@Override
	public void run() {
		candidates.clear();
		find(basedir,1);
		if (candidates.size()==1){
			satn.setBGImagePath(candidates.get(0));
		} else if (candidates.size()>1){
			SingleSelector<File> sel = new SingleSelector<File>(candidates, findActiveParent(), "背景画像フォルダを選択してください");
			sel.setVisible(true);
			if (sel.selectedObj == null) return;
			satn.setBGImagePath(sel.selectedObj);
		} else if (candidates.size()==0){
			if (basedir.getAbsolutePath().equals(new File(System.getProperty("user.dir")).getAbsolutePath()))
				satn.showFadingMessage("背景画像がカレントディレクトリ以下にみつかりませんでした", SimpleATN.messageColor, Color.black, 2, 0.9f);
			else {
				satn.showFadingMessage("背景画像が指定されたディレクトリ以下にみつかりませんでした", SimpleATN.messageColor, Color.black, 2, 0.9f);
			}
		}
	}

	public void find(File f, int level){
		System.out.println(f.toString());
		File[] fs = f.listFiles();
		if (fs == null) return;
		if (level>2) return;
		for(File cf: fs){
			if (cf.isDirectory()) find(cf,level+1);
		}
		if (ConfigPanel_PImageFinder.containsBGImage(f)) candidates.add(f);
	}
//フォルダを設定する，もしくはカレントディレクトリから再度探す
	public void selectBGImagePath() {
		int res = JOptionPane.showConfirmDialog(this, "背景画像フォルダを手動設定するなら「はい」，カレントディレクトリから探す場合は「いいえ」をおしてください");
		if (res == JOptionPane.YES_OPTION){
			File f = openFolderChooser(satn.pimagePath);
			if (f != null) {
				if (containsBGImage(f)) satn.setBGImagePath(f);
				else {
					basedir = f;
					run();
				}
			}
		} else if (res == JOptionPane.NO_OPTION){
			basedir = new File(System.getProperty("user.dir"));
			run();
		}
	}
	public File openFolderChooser(String base){
		if (base == null) base = System.getProperty("user.dir");
		JFileChooser fd = new JFileChooser(base);
		fd.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);//ディレクトリのみ
		int returnval;
		returnval = fd.showOpenDialog(findActiveParent());
		if (returnval == JFileChooser.APPROVE_OPTION){
			// 拡張子がついていないとき，むりやりつける
			return fd.getSelectedFile();
		}else{
			return null;
		}
	}
	/**
	 * ディレクトリに背景画像が１つでも含まれていればTrue
	 * @param dir
	 * @return
	 */
	public static boolean containsBGImage(File dir){
		for(File cf: dir.listFiles()){
			String cfname = cf.getName();
			cfname = cfname.toUpperCase();
			if (cfname.endsWith(".PNG")){
				if (cfname.startsWith("スライド1.PNG")){
					return true;
				} else if (cfname.startsWith("スライド01.PNG")){
					return true;
				} else if (cfname.startsWith("スライド2.PNG")){
					return true;
				} else if (cfname.startsWith("スライド3.PNG")){
					return true;
				} else if (cfname.startsWith("スライド4.PNG")){
					return true;
				} else if (cfname.startsWith("スライド5.PNG")){
					return true;
				} else if (cfname.startsWith("スライド6.PNG")){
					return true;
				}
			}
		}
		return false;
	}
}
