package charactermanaj.model.io;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Properties;

/**
 * ディレクトリをアーカイブと見立てる
 * @author seraphy
 */
public class CharacterDataDirectoryFile extends AbstractCharacterDataArchiveFile {

	protected File baseDir;
	
	protected class DirFileContent implements FileContent {

		private String entryName;
		
		private File entry;
		
		protected DirFileContent(File entry, String entryName) {
			this.entry = entry;
			this.entryName = entryName;
		}
		
		public String getEntryName() {
			return entryName;
		}
		
		public long lastModified() {
			return entry.lastModified();
		}
		
		public InputStream openStream() throws IOException {
			return new FileInputStream(entry);
		}
		
	}
	
	/**
	 * アーカイブファイルをベースとしたURLを返す.<br>
	 * @param name コンテンツ名
	 * @return URL
	 * @throws IOException URLを生成できない場合
	 */
	protected URL getContentURL(String name) throws IOException {
		return new File(baseDir, name).toURL();
	}
	
	/**
	 * エクスポートプロパティを見立てる
	 */
	@Override
	public Properties readExportProp() throws IOException {
		Properties exportInfoProp = new Properties();
		exportInfoProp.setProperty(ExportInfoKeys.EXPORT_SUBSET, "false");
		exportInfoProp.setProperty(ExportInfoKeys.EXPORT_PRESETS, "true");
		exportInfoProp.setProperty(ExportInfoKeys.EXPORT_PARTS_IMAGES, "true");
		return exportInfoProp;
	}

	public void close() throws IOException {
		// ディレクトリなのでクローズ処理は必要ない.
	}
	
	public CharacterDataDirectoryFile(File file) throws IOException {
		super(file);
		baseDir = file;
		load(baseDir, "");
		searchRootPrefix();
	}
	
	private void load(File dir, String prefix) {
		if (!dir.exists() || !dir.isDirectory()) {
			// ディレクトリでなければ何もせず戻る
			return;
		}
		
		for (File file : dir.listFiles()) {
			String name = file.getName();
			String entryName = prefix + name;
			if (file.isDirectory()) {
				load(file, entryName + "/");
			} else {
				addEntry(new DirFileContent(file, entryName));
			}
		}
	}

}
