#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

#include "type_image.h"

void CharToBit(const string&, vector<bool>&);
void BitToChar(const vector<bool>&, string&);



void LireChaine(string& Chaine, char Fin = '\n')
{
	char Carac;

	cin.get(Carac);

	while (Carac != Fin)
	{
		Chaine += Carac;
		cin.get(Carac);
	}
}


bool FichierExiste(const char* NomFichier)
{
	ifstream Fic;
	bool Existe;

	Fic.open(NomFichier);
	Existe = !(Fic.fail());
	Fic.close();

	return(Existe);
}


void EntrerMessage()
{
	string FicIn, Message, FicOut;

	system("cls");
	cout << "Entrez le nom du fichier dans lequel le message sera code" << endl;
	LireChaine(FicIn);


	/////
	if (!FichierExiste(FicIn.c_str()))
	{
		cout << "Ce fichier n'existe pas" << endl;
		exit(1);
	}

	
	type_image Image;


	/////
	if (!Image.ChargeBMP(FicIn))
	{
		cout << "Erreur lors de la lecture de l'image" << endl;
		exit(1);
	}


	long NbCarac = Image.Height * Image.Width * 3 - 1;

	cout << "Vous pouvez ecrire un message d'au plus " << NbCarac
		 << " caracteres" << endl << endl
		 << "Entrez le message" << endl;
	LireChaine(Message);


	/////
	if (Message.length() > NbCarac)
	{
		cout << "Le message est trop long";
		exit(1);
	}


	vector<bool> LesBits;
	CharToBit(Message, LesBits);
	Image.BitToImage(LesBits);

	cout << "Fichier dans lequel vous desirez sauver l'image" << endl;
	LireChaine(FicOut);

	if (!Image.SauveBMP(FicOut))
	{
		cout << "Erreur lors de l'ecriture de l'image" << endl;
		exit(1);
	}

	cout << "Codage reussi" << endl << endl;
}




void LireMessage()
{
	string Reponse;

	system("cls");
	cout << "Entrez le nom du fichier dans lequel le message est code" << endl;
	LireChaine(Reponse);


	/////
	if (!FichierExiste(Reponse.c_str()))
	{
		cout << "Ce fichier n'existe pas" << endl;
		exit(1);
	}

	
	type_image Image;


	/////
	if (!Image.ChargeBMP(Reponse))
	{
		cout << "Erreur lors de la lecture de l'image" << endl;
		exit(1);
	}


	vector<bool> LesBits;
	Image.ImageToBit(LesBits);
	string Message;
	BitToChar(LesBits, Message);


	cout << "Le message contenu dans l'image est:" << endl << endl << Message << endl << endl;
}
