package edu.caltech.cs2.project01;

import java.io.FileNotFoundException;
import java.util.Scanner;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class SubstitutionCipherSolver {
    public static void main(String[] args) throws FileNotFoundException {
        Scanner scan = new Scanner(System.in);
        System.out.print("Type a sentence to decrypt: ");
        String ciphertext = scan.nextLine();

        QuadGramLikelihoods likelihoods = new QuadGramLikelihoods();
        SubstitutionCipher best = new SubstitutionCipher(ciphertext);
        for (int i = 0; i < 20; i ++) {
            SubstitutionCipher cipher = best.getSolution(likelihoods);
            if (cipher.getScore(likelihoods) > best.getScore(likelihoods)) {
                best = cipher;
            }
        }
        System.out.println(best.getPlainText());

        try {
            File file = new File("cryptogram.txt");
            scan = new Scanner(file);
            FileWriter writer = new FileWriter("plaintext.txt");
            String line;
            SubstitutionCipher solver;
            SubstitutionCipher answer;
            String decrypt;
            String ugly;
            while (scan.hasNextLine()) {
                ugly = scan.nextLine();
                line = "";
                for (int i = 0; i < ugly.length(); i++) {
                    char c = ugly.charAt(i);
                    if (c >= 65 && c <= 90) {
                        line += c;
                    }
                }
                solver = new SubstitutionCipher(line);
                for (int i = 0; i < 20; i ++) {
                    answer = solver.getSolution(likelihoods);
                    if (answer.getScore(likelihoods) > solver.getScore(likelihoods)) {
                        solver = answer;
                    }
                }
                decrypt = solver.getPlainText();
                writer.write(decrypt);

            }
            writer.close();
        }
        catch (IOException e) {
            System.out.println("An error occured.");
            e.printStackTrace();
        }
    }
}