/*******************************************************************************
 *  How to run script:
 *  Run exe with following arguments in this order:
 *  1. encrypt or decrypt (keyword)
 *  2. file name (without extension)
 *  3. path to folder where file is located in
 *  4. file extension (e.g. ".TXT" - incl. dot!)
 *  Example Batch:
 *  ~dp0\SW01-XTEA-Cipher.exe encrypt test ~dp0 .TXT
 *  ~dp0\SW01-XTEA-Cipher.exe decrypt test_ENCR ~dp0 .CIP
 *******************************************************************************/

/*******************************************************************************
* Include Files
*******************************************************************************/
#include <stdint.h> /* Funktionsbibliothek: Integer */
#include <stdlib.h> /* Funktionsbibliothek: Hilfsfunktionen */
#include <stdio.h>  /* Funktionsbibliothek: Standard Ein- Ausgabe */
#include <string.h> /* Funktionen zur Stringbearbeitung */

#include "main.h"
#include "decrypt.h"
#include "encrypt.h"

// disable deprecated warning
#pragma warning(disable : 4996)

/*******************************************************************************
******************************* HAUPTPROGRAMM **********************************
*******************************************************************************/
main(argc, argv) /* Argumente an main-Funktion */
int argc;
char* argv[];
{
    int Error = NO_ERROR;                   /* Errorcode der Filezugriffe */
    char LoadFileName[NAMENSGROESSE + 1];   /* Variable fuer Originalfile */
    char SaveFileName[NAMENSGROESSE + 1];   /* Variable fuer Sicherungsfile */
    char key[4] = { 0 };
    uint32_t key_uint32[4] = { 0 };
    int mode = MODE_UNKNOWN;  // 0 = unknown, 1 = encrypt, 2 = decrypt

    if (strcmp(MODE, "encrypt") == 0) 
    {
        mode = MODE_ENCRYPT;
    }
    else if (strcmp(MODE, "decrypt") == 0)
    {
        mode = MODE_DECRYPT;
    }
    // mode not recognized
    else 
    {
        printf("Modus nicht erkannt. Bitte encrypt oder decrypt bei Aufruf der Software angeben.\n");
        return -1;
    }

    system("cls");
    puts("XTEA Cipher");
    puts("-----------------------\n");
    puts("Please type your key here: (ENTER key will start the process!)");

    fflush(stdin);        // Flush
    fgets(key, 4, stdin); // Text einlesen (max. 4 Zeichen)
    // convert array to uint32
    int i = 0;
    while (i < 4)
    {
        key_uint32[i] = (uint32_t)key[i++];
    }

    /* Original file zusammensetzen */
    strcpy(LoadFileName, PFAD);
    strcat(LoadFileName, DATEINAME);
    strcat(LoadFileName, DATEIENDUNG);

    /* Output file zusammensetzen */
    strcpy(SaveFileName, PFAD);
    strcat(SaveFileName, DATEINAME);
    if (mode == MODE_ENCRYPT) 
    {
        strcat(SaveFileName, ENCRYPTED_ADD);
        strcat(SaveFileName, ENCRYPTED_ENDING);
        printf("Encryption processing...");
        Error = encrypt(LoadFileName, SaveFileName, key_uint32);
    }
    else if (mode == MODE_DECRYPT)
    {
        strcat(SaveFileName, DECRYPTED_ADD);
        strcat(SaveFileName, DECRYPTED_ENDING);
        printf("Decryption processing...");
        Error = decrypt(LoadFileName, SaveFileName, key_uint32);
    }

    system("cls");

    /* Errors auswerten */
    if (Error == NO_ERROR)
    {
        printf("\n-> Ausgabefile konnte erstellt werden.\n");
    }
    else
    {
        printf("ACHTUNG: Der Sicherungsvorgang konnte nicht umgesetzt werden!\n");
        printf("-> Errorcode: %d\n", Error);
        switch (Error)
        {
        case ERROR_OPEN_LOAD_FILE:
        { /* Problem mit Originalfile */
            printf("-> Originalfile konnte nicht geoeffnet werden!\n");
            printf("   Lesezugriff fuer Originalfile nicht moeglich!\n");
            break;
        }
        case ERROR_OPEN_SAVE_FILE:
        { /* Problem mit Sicherungsfile */
            printf("-> Das Ausgabefile konnte nicht erstellt werden!\n");
            printf("   Schreibzugriff fuer Ausgabefile wurde verweigert!\n");
            break;
        }
        case ERROR_OPEN_VERSCHL_FILE:
        { /* Problem mit PW-File */
            printf("-> Das Passwort-File konnte nicht erstellt werden!\n");
            printf("   Schreibzugriff fuer Passwort-File wurde verweigert!\n");
            break;
        }
        }
    }

    system("pause");
    return (0);
}
