package org.eclipse.epf.toolbox.utils;

import java.io.File;

public class RenameFiles {

	//Given strings
		
	private static String lang = "_ar";
	private static String pkg = ".nlBidi";
	private static String fpkg = ".nlsBidi";
	private static String rootPath = "E:/Root/a_Rmc7.5.0.1/Tvt/Returns/1stReturns/renamed/ARA/RmcTool";

	private final static boolean runAll = true;	
	private static String rootPathPrefix = "E:\\Root\\a_Rmc7.5.1\\TVT\\Returns\\2nd-Return\\Renamed\\";
	private static String lastFoler = "RmcTool";
	private static String langFolerList[] = {"DEU", "ESP", "FRA", "ITA", "JPN", "KOR", "PTB", "CHS", "CHT", "PLK", "RUS", "DAN", "ARA"};
	
	private static String langList[] = {"_de", "_es", "_fr", "_it", "_ja", "_ko", "_pt_BR", "_zh", "_zh_TW", "_pl", "_ru", "_da", "_ar"};
	private static String[] pkgList = null;
	private static String[] fpkgList = null;
	private static String[] rootPathList = null; 
	
	static {
		int sz = 13;
		pkgList = new String[sz];
		fpkgList = new String[sz];
		rootPathList =  new String[sz];
		for (int i = 0; i < sz; i ++) {
			if (i < 9) {
				pkgList[i] = ".nl1";
				fpkgList[i] = ".nls1";
			} else if (i < 11) {
				pkgList[i] = ".nl2";
				fpkgList[i] = ".nls2";
			} else if (i < 12) {
				pkgList[i] = ".nl2a";
				fpkgList[i] = ".nls2a";
			} else {
				pkgList[i] = ".nlBidi";
				fpkgList[i] = ".nlsBidi";	
			}
			rootPathList[i] = rootPathPrefix + langFolerList[i] + "\\" + lastFoler;
		}
	}
	
	private static final String[] props = {
		".properties",
		".htm",
		".html",
		".js",
	};
	
	private static final String epf = "org.eclipse.epf.";
	private static final String rmc = "com.ibm.rmc.";
	
	private static RenameFiles instance = new RenameFiles(rootPath);
	private File rootFolder;
	private int renamedFileCount = 0;
		
	public RenameFiles(String rootPath) {
		rootFolder = new File(rootPath);
	}
	
	public void execute() {
		File[] pluginFolders = rootFolder.listFiles();
		if (pluginFolders == null) {
			return;
		}
		
		System.out.println("LD> rename folders -> ");
		for (int i = 0; i < pluginFolders.length; i++) {
			File folderFile = pluginFolders[i];
			renameFolder(folderFile);
		}
		System.out.println("LD> rename folders <- \n");	
		
		pluginFolders = rootFolder.listFiles();
		renamedFileCount = 0;
		System.out.println("LD> rename files -> ");
		for (int i = 0; i < pluginFolders.length; i++) {
			File folderFile = pluginFolders[i];
			renameFiles(folderFile);
		}
		System.out.println("LD> rename files <- " + renamedFileCount);
		
	}
	
	private void renameFolder(File folderFile) {
		if (! folderFile.isDirectory()) {
			return;
		}
		String folderName = folderFile.getName();
		if ((folderName.startsWith(epf) || folderName.startsWith(rmc))
				&& !folderName.endsWith(pkg)) {
			boolean isFeature = folderName.endsWith(".feature");
			String lastStr = isFeature ? fpkg : pkg;
			
			File renamedFile = new File(folderFile.getAbsolutePath() + lastStr);

			folderFile.renameTo(renamedFile);
			System.out.println("LD> renamedFile: " + renamedFile);
		} else {
			System.out.println("LD> folderFile: " + folderFile);
		}
	}
	
	private void renameFiles(File folderFile) {
		if (! folderFile.isDirectory()) {
			return;
		}
		File[] children = folderFile.listFiles();
		if (children == null) {
			return;
		}
		for (int i = 0; i < children.length; i++) {
			File child = children[i];
			if (child.isDirectory()) {
				renameFiles(child);
			} else {
				String childName = child.getName();
				for (int j = 0; j < props.length; j++) {
					String prop = props[j];
					String newProp = lang + prop;
					if (childName.endsWith(prop) && !childName.endsWith(newProp)) {
						String oldPath = child.getAbsolutePath();
						int ix = oldPath.lastIndexOf(prop);
						String newPath = oldPath.substring(0, ix) + newProp;
						System.out.println("LD> oldPath: " + oldPath);
						System.out.println("LD> newPath: " + newPath + "\n");
						child.renameTo(new File(newPath));
						renamedFileCount++;
						break;
					}
				}
			}
		}
		
				
	}
	
	
	public static void main(String[] args) {
		if (runAll) {
			for (int i = 0; i < langList.length; i++) {
				lang = langList[i];
				pkg =  pkgList[i];
				fpkg = fpkgList[i];
				rootPath = rootPathList[i];
				instance = new RenameFiles(rootPath);
				instance.execute();
			}
		} else {
			instance.execute();
		}
	}	

}
