/*
    Program:		"MINI-LEMINGI"

    Modul:		Wejscie/Wyjscie

    Autor:		Damian Wojtowicz
    Weryfikator:	Michal Zmijewski
    Tester:		Anna Doros

    Krotki opis:	Plik zawiera deklaracje klasy: WejscieWyjscie
			oraz definicje typu wyliczeniowego: Wynik.
			Poza tym definicje pomocniczych typow:
			WczytanieNazwy, Formula.
*/

#ifndef __WEJSCIEWYJSCIE_H
#define __WEJSCIEWYJSCIE_H

#include <fstream.h>
#include <istream.h>
#include <ctype.h>
#include <string.h>

#include "parametry.h"
#include "stale_ElementySwiata.h"
#include "stale_WejscieWyjscie.h"
#include "typy.h"

#define DL_NAZWA	256		/* dlugosc nazwy pliku */
#define DL_FORMULY	32		/* dlugosc formuly */

/* stale logiczne */
#define TAK		1
#define NIE		0

/*============================================================================*/
    			    /* TYPY WYLICZENIOWE */
/*============================================================================*/

enum WczytanieNazwy		/* typ pomocniczy (wewnetrzny) */
{
    _poprawne		=  0,		// nazwa poprawnie wczytana
    _brak_nazwy		=  1,		// juz nie ma zadnych nie wczytanych 
					// nazw w pliku
    _dluga_nazwa	=  2,		// zbyt dluga nazwa wczytana z pliku
}; //WczytanieNazwy


/*----------------------------------------------------------------------------*/

enum Formula 			/* typ pomocniczy (wewnetrzny) */
{
    // rozne typy formul
    _brak		=  0,
    _komentarz		=  1,
    _rozmiar		=  2,
    _czas		=  3,
    _leming		=  4,
    _przeprowadz	=  5,
    _bloker		=  6,
    _kopacz_poziomy	=  7,
    _kopacz_pionowy	=  8,
    _kopacz_gorny	=  9,
    _kopacz_dolny	= 10,
    _schodkarz_poziomy	= 11,
    _schodkarz_gorny	= 12,
    _schodkarz_dolny	= 13,
    _bomba		= 14,
    _pijus		= 15,
    _wejscie		= 16,
    _wyjscie		= 17,
    _wiersz 		= 18,
    _tlo		= 19,
    _maska		= 20,
    _rysunek		= 21,
    _przesuniecie	= 22

}; //Formula

/*----------------------------------------------------------------------------*/

enum Wynik			/* na zewnatrz */
{
    _poprawny		=  0,		// wynik poprawny
    _brak_etapow	=  1,		// nie ma juz zadnych nowych etapow
    _blad_otwarcia	=  2,		// blad przy otwieraniu pliku z parametrami
					// lub niepoprawna nazwa pliku
    _blad_w_pliku	=  4,		// blad w pliku z parametrami
    _brak_pamieci	=  5		// brak wystarczajacej ilosci pamieci

}; //Wynik

/*============================================================================*/
			/* KLASA: WejscieWyjscie  */
/*============================================================================*/

class WejscieWyjscie		/* na zewnatrz */
/* deklaracja klasy WejscieWyjscie */
{
 private:
    /* prywatne atrybuty */
    ifstream	plik_z_planszami;	// plik zawierajacy nazy kolejnych plikow
					// z parametrami etapow
    int		otwarty;		// czy plik zostal otwarty

    /* prywatne funkcje skladowe klasy - opis przy definicji */
    char podajKod(typ_teren teren);
    WczytanieNazwy wczytajNazwePlikuZParametrami(char *nazwa);
    void pominCiagZnakow(const char znak, ifstream &plik);
    Formula wczytajFormule(ifstream &plik);
    void pominKomentarz(ifstream &plik);
    Para wczytajWspolrzedne(ifstream &plik);
    int wczytajWartosc(ifstream &plik);
    int wczytajNumerWiersza(ifstream &plik);
    void wczytajDefinicjeWiersza(int nr,typ_teren **tab, const Para rozm,
				 ifstream &plik);
    void wczytajNazwePliku(ifstream &plik, char *nazwa);
    void inicjalizujParametry(Param_etap &parametry);

    /* prywatny wyjatek */
    class BladFormuly{};		// bledna formula
    
 public:
    /* konstruktory */
    WejscieWyjscie();
    WejscieWyjscie(const char *nazwa_pliku);

    /* destruktor */
    ~WejscieWyjscie();
    
    /* wyjatek */
    class BladOtwarcia{};		//blad podczas otwierania pliku

    /* publiczne funkcje skladowe klasy */
    void otworzPlik(const char *nazwa_pliku);
    void zamknijPlik();
    Wynik wczytajParametryKolejnegoEtapuZPliku(Param_etap &parametry, const char* nazwa);
    Wynik podajParametryKolejnegoEtapu(Param_etap &parametry);
    int zapiszParametryEtapu(Param_etap param, const char* nazwa);
    
};//WejscieWyjscie

#endif /* __WEJSCIEWYJSCIE_H */