import java.util.*;
import java.util.Arrays;
import chn.util.*;
/**
 * Write a description of class RandomAlpha here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class RandomAlpha
{
    public static void main(String[] args){
        ConsoleIO sys = new ConsoleIO();
        RandomAlpha rnd = new RandomAlpha();
        System.out.print("Would you like to encode/decode (e/d)\n>");
        char choice = sys.readLine().charAt(0);
        System.out.print("Enter the name of the file\n>");
        String name = sys.readLine();
        FileInput inFile = new FileInput(name);
        String key = "";
        if(choice=='e'){
            
            key = rnd.arrToString(rnd.getAlphabet());
        }
        else if(choice=='d'){
            //System.out.println("1");
            key=inFile.readLine();
            //System.out.println("2");
        }
        inFile.close();
        inFile = new FileInput(name);
        ArrayList<String> file = rnd.readFile(inFile);
        
        System.out.println("\nKey is: "+key);
        String[] temp = rnd.listToArr(file);
        if(choice == 'e'){
            temp = rnd.encodeArr(key,temp);
        }
        else if(choice =='d')
            temp=rnd.decodeArr(key,temp);
        rnd.exportToFile(key,temp);

        //rnd.test();
    }

    public void test(){
        RandomAlpha rnd = new RandomAlpha();
        String[] arr = rnd.getAlphabet();
        String key = rnd.arrToString(arr);
        ConsoleIO sys = new ConsoleIO();
        System.out.println("Key is: "+rnd.arrToString(arr));
        System.out.println("        abcdefghijklmnopqrstuvwxyz");
        System.out.print("Enter the name of the file\n>");
        FileInput inFile = new FileInput(sys.readLine());
        ArrayList<String> file = rnd.readFile(inFile);
        file=rnd.toLower(file);
        System.out.println("Lower: "+file);
        String[] encoded = rnd.encodeArr(rnd.arrToString(arr),rnd.listToArr(file));
        for(int i = 0;i<encoded.length;i++)
            System.out.println("Encoded line "+(i+1)+": "+encoded[i]);
        String[] decoded = rnd.decodeArr(rnd.arrToString(arr),encoded);

        for(int i = 0;i<decoded.length;i++)
            System.out.println("Decoded line "+(i+1)+": "+decoded[i]);

        exportToFile(key,encoded);
    }

    public void exportToFile(String key, String[] arr){
        FileOutput outFile = new FileOutput("output.txt");
        outFile.println(key);
        for(int i = 0;i<arr.length;i++){
            outFile.println(arr[i]);
        }
        outFile.close();
    }

    public String[] encodeArr(String inp, String[] file){
        String[] out = new String[file.length];
        for(int i = 0; i<file.length;i++){
            out[i]=encode(inp,file[i]);
        }
        return out;
    }

    public String[] decodeArr(String inp, String[] file){
        String[] out = new String[file.length];
        for(int i = 0; i<file.length;i++){
            out[i]=decode(inp,file[i]);
        }
        return out;
    }

    public String encode(String inp,String txt){
        char[] key = new char[26];
        for(int i = 0;i<26;i++){
            key[i]=inp.charAt(i);
        }
        String temp = "";
        for(int i =0;i<txt.length();i++){
            char cur = txt.charAt(i);
            if(cur>96&&cur<123){
                temp+=""+key[cur-'a'];
            }
            else{
                temp+=""+cur;
            }
        }
        return temp;
    }

    public String decode(String inp,String txt){
        char[] key = new char[26];
        for(int i = 0;i<26;i++){
            key[i]=inp.charAt(i);
        }
        String temp = "";
        for(int i =0;i<txt.length();i++){
            char cur = txt.charAt(i);
            if(cur>96&&cur<123){
                temp+=""+(char)('a'+indexOfArr(key,cur));
                //System.out.println("Decoding "+cur+" to "+(char)('a'+indexOfArr(key,cur))+" because index is "+indexOfArr(key,cur));
            }
            else{
                temp+=""+cur;
            }
        }
        //System.out.println("\n");
        return temp;
    }

    public static int indexOfArr(char[] arr, char inp){
        int ret = -1;
        for(int i =0;i<arr.length;i++){
            if(arr[i]==inp){
                return i;
            }
        }
        return ret;
    }

    public ArrayList<String> toLower (ArrayList<String> inp){
        ArrayList<String> temp = new ArrayList<String>();
        for(int i = 0;i<inp.size();i++){
            temp.add(inp.get(i).toLowerCase());
            //System.out.println(temp);
        }
        return temp;
    }

    public ArrayList<String> readFile(FileInput inFile){
        ArrayList<String> out = new ArrayList<String>();
        while(inFile.hasMoreLines()){
            //System.out.println("hit");
            out.add(inFile.readLine());
            //System.out.println("err");
        }
        return out;
    }

    public String arrToString(String[] inp){
        String temp="";
        for(int i = 0;i<inp.length;i++){
            temp+=inp[i];
        }
        return temp;
    }

    public String[] getAlphabet(){
        ArrayList<Character> all = new ArrayList<Character>();
        ArrayList<String> alpha = new ArrayList<String>();
        for(int i = 97;i<123;i++){
            all.add((char)i);
        }
        //System.out.println(all);
        while(all.size()>0){
            alpha.add(""+all.remove((int)(Math.random()*all.size())));
            //System.out.println(all.size());
        }
        //System.out.println("Returning "+alpha);
        //System.out.println(alpha.size());
        return listToArr(alpha);
    }

    public String[] listToArr(ArrayList<String> inp){
        String[] ret = new String[inp.size()];
        for(int i = 0;i<ret.length;i++){
            ret[i]=inp.get(i);
            //System.out.println(inp.get(i));
        }
        //System.out.println(Arrays.toString(ret));
        return ret;
    }
}