#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdbool.h>
#include<stdlib.h>

#define MAX_ADRESS_LENGTH 103 // 0->99 + \n + \0 + check for wrong input 
#define ASCII_LENGTH 129 // 0->127 + \0

int findPrefix(char *prefix, char *found, char *enabled) //funkcia, ktora prudovo prejde po riadku zoznam miest a robi s nimi 3
							 //hlavne operacie, zapisuje pocet zhod prefixu s adresou, zapisuje
							 //poslednu zhodnu adresu s prefixom do premennej found a zapisuje
							 //povolene klavesy
{

	char adress [MAX_ADRESS_LENGTH];
	bool preocc = false; // prefix occurence, vyskyt prefixu v jednej adrese
	int prenum = 0; //prefix number(pocet vsetkych zhod prefixu s adresami)	
	while(fgets(adress, sizeof(adress), stdin) != NULL) //cyklus, ktory prechadza riadok po riadku adresy, konci na konci suboru
	{
		if(strlen(adress) == MAX_ADRESS_LENGTH - 1)
		{
			fprintf(stderr, "Wrong input(too long adress)\n");
			exit(1);
		}

		for(size_t i = 0; i < strlen(prefix); i++) 
		{
			if(toupper(prefix[i]) == toupper(adress[i])) 
				preocc = true; // ak sa kazdy znak v prefixe zhoduje so znakmi adresy, do vyskytu prefixu dame hodnotu true
		
			else 
			{
				preocc = false; //ak sa aspon jedno pismeno nezhoduje
				break;
			}
			
		}
		if(preocc == true) // ak sa vsetky pismena v prefixe zhodovali
		{
			prenum++;
			strcpy(found, adress);
			int enable = toupper(adress[strlen(prefix)]); // do enable zapiseme poradie v ascii nasledujuceho znaku v adrese po 
								      // zhodnom prefixe
			enabled[enable] = 1; // do pola povolenych znakov zaznacime povoleny znak na pozicii enable
			preocc = false;
		}
		else if(strlen(prefix) == 0) // specialny pripad, ak je program spusteny bez 2. argumentu(prazdny retazec)
		{
			int enable = toupper(adress[0]);// povolime vsetky zaciatocne pismena adries
			enabled[enable] = 1;
			prenum = 42; // nemozeme dat hodntou 1, pretoze najst zhodu nemozeme
				     // nemozeme dat ani 0, pretoze ak bol zadany spravny vstup,musime vypisat aspon jednu povolenu klavesu
		}

	}

	return prenum;

}
void printFound(char *found)
{
	printf ("FOUND: ");
	for(size_t i = 0; i < strlen(found); i++)
	{
		printf ("%c", toupper(found[i]));
	}
}
void printNotFound()
{
	printf ("NOT FOUND\n");
}

void printEnabled(char *enabled)
{
	printf("ENABLE: ");
        for (int i = 0; i < ASCII_LENGTH - 1; i++)  
       	{
        	if (enabled[i]) printf("%c", i); // prechadzame ascii tabulku a vypisujeme znaky, ktore sme si do nej zaznacili ako povolene
        }
        printf ("\n");
}

int main(int argc, char** argv){
	char prefix [MAX_ADRESS_LENGTH];//max prefix == max adress

	if (argc == 1)
	{
		strcpy(prefix, "\0"); //zaciatocny stav(prefix) berieme ako prazdny retazec
	}
	else if (argc == 2)
	{
		strcpy(prefix, argv[1]);
		if(strlen(prefix) > MAX_ADRESS_LENGTH - 3) 
		{
			fprintf(stderr, "Wrong argument\n");
		       	return 1;
		}	
	}
	else 
	{
		fprintf(stderr,"Wrong argument\n");
		return 1;
	}

	char found[MAX_ADRESS_LENGTH]; // najdene mesto
	char enabled[ASCII_LENGTH] = {0}; // pole povolenych znakov, znaci, ci za znak z ascii tabulky nachadza v povolenych znakoch
	int prenum = findPrefix(prefix, found, enabled);
	
	if(prenum == 1)
	{
		printFound(found); // ak je pocet zhodnych prefixov len jeden, vypiseme najdenu adresu
	}
	else if (prenum == 0) // ziadna zhoda
	{
		printNotFound(); 
	}
	else 
	{
		printEnabled(enabled);
	}

	return 0;
}
