#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;

int main(int argc, char *argv[]) {
	int rot;
	int current_char = 0;
	char data[65536] = "";
	char line[32768];
	int letter;
	int new_letter;
	ifstream inputfile;
	ofstream outputfile;

	if (argc != 3 && argc != 2) {
		cout << "Usage: " << argv[0] << " <infile> <rotation>" << endl;
		return 0;
	}

	// This is how much to rotate each char by
	if (argc == 2) {
		rot = 13;
	} else {
		rot = atoi(argv[2]);
	}
	
	// Change numbers greater than 25 to numbers less than or equal to 25
	if (rot > 25) { rot -= rot/26*26; }
	if (rot < -25) { rot -= rot/26*26; }
	
	inputfile.open(argv[1]);
	if (inputfile.is_open()) {
		while (!inputfile.eof()) {
			inputfile.getline(line, 32768);
			strcat(data, line);
			strcat(data, "\n");
		}
		inputfile.close();
	} else {
		cout << "Input file could not be opened." << endl;
		return 0;
	}

	do {
		if (data[current_char] >= 'a' & data[current_char] <= 'z') {
			letter = data[current_char]-97;
			new_letter = letter+rot;
			if (new_letter > 25) { new_letter -= new_letter/26*26; }
			if (new_letter < 0) { new_letter -= new_letter/26*26; }
			data[current_char] = new_letter+97;
		} else if (data[current_char] >= 'A' && data[current_char] <= 'Z') {
			letter = data[current_char]-65;
			new_letter = letter+rot;
			if (new_letter > 25) { new_letter -= new_letter/26*26; }
			if (new_letter < 0) { new_letter -= new_letter/26*26; }
			data[current_char] = new_letter+65;
		}
		
		current_char++;
	} while (data[current_char] != '\0');

	data[current_char-1] = '\0';

	outputfile.open(argv[1]);
	outputfile << data;
	outputfile.close();

	return 0;
}

