package osm.jp.gpx;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FilenameFilter;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

public class GpxFolder extends ArrayList<GpxFile> {
	private static final long serialVersionUID = 6178901459948163548L;
    AppParameters params;
	
	public GpxFolder(AppParameters params) throws ParserConfigurationException, SAXException, IOException, ParseException {
		this.params = params;

		File[] gpxfiles;
		File gpxDir = params.getGpxSourceFolder();
    	if (gpxDir == null) {
        	// GPXファイルまたはディレクトリが存在しません。('%s')
    		throw new FileNotFoundException(String.format(ImportPicture.i18n.getString("msg.100"), "null"));
    	}
        if (!gpxDir.exists()) {
        	// GPXファイルまたはディレクトリが存在しません。('%s')
    		throw new FileNotFoundException(String.format(ImportPicture.i18n.getString("msg.100"), gpxDir.getAbsolutePath()));
        }

        if (gpxDir.isFile()) {
        	if (accept(params, gpxDir.getName())) {
            	List<File> fileList = new ArrayList<>();
            	fileList.add(gpxDir);
            	gpxfiles = fileList.toArray(new File[fileList.size()]);
        	}
        	else {
            	// GPXファイルまたはディレクトリが存在しません。('%s')
        		throw new FileNotFoundException(String.format(ImportPicture.i18n.getString("msg.100"), gpxDir.getAbsolutePath()));
        	}
        }
        else if (gpxDir.isDirectory()) {
        	// 指定されたディレクトリ内のGPXファイルすべてを対象とする
            gpxfiles = gpxDir.listFiles(new GpxFileFilter());
            if (gpxfiles == null) {
            	// 対象となるGPXファイルがありませんでした。('%s')
            	throw new FileNotFoundException(
                    String.format(ImportPicture.i18n.getString("msg.110"), gpxDir.getAbsolutePath())
                );
            }
            if (params.isImgOutputAll() && (gpxfiles.length > 1)) {
                // "複数のGPXファイルがあるときには、'IMG.OUTPUT_ALL'オプションは指定できません。"
            	throw new FileNotFoundException(
                    String.format(ImportPicture.i18n.getString("msg.120"))
                );
            }
        }
        else {
        	// GPXファイルまたはディレクトリが存在しません。('%s')
    		throw new FileNotFoundException(String.format(ImportPicture.i18n.getString("msg.100"), gpxDir.getAbsolutePath()));
        }

        Arrays.sort(gpxfiles, new FileSort());
        for (File file : gpxfiles) {
        	this.add(new GpxFile(params, file));
        }
	}
	
	/**
	 * 対象は '*.GPX' のみ対象とする
	 */
	public static boolean accept(AppParameters params, String name) {
		String filename = name.toUpperCase();
        if (filename.endsWith(".GPX")) {
            if (!filename.endsWith("_.GPX") || params.isGpxReuse()) {
            	return true;
            }
        }
        return false;
	}
    
    /**
     * ファイル名の順序に並び替えるためのソートクラス
     * 
     */
    static class FileSort implements Comparator<File> {
        @Override
        public int compare(File src, File target){
            int diff = src.getName().compareTo(target.getName());
            return diff;
        }
    }

    /**
     * GPXファイルフィルター
     */
    class GpxFileFilter implements FilenameFilter {
    	@Override
        public boolean accept(File dir, String name) {
    		return GpxFolder.accept(params, name);
    	}
    }
}
