/*
 * $Id$
 * 
 * created by Werum Software & Systems AG on 13.06.2016
 * 
 * $Revision$
 * 
 * $Date$
 * 
 * Copyright:
 * Werum Software & Systems AG
 * Wulf-Werum-Strasse 3, 
 * 21337 Lueneburg
 */
#ifndef _UV_KP_H_
#define _UV_KP_H_

#ifndef UVKP_API
#define UVKP_API __declspec(dllexport)
#endif

/**
 * \mainpage UV-KP C++-Bibliothek
 * Diese Bibliothek bietet Funktionen für die Ausführung der UV-KP spezifischen Plausibilitätsprüfungen.
 * <P>
 * Beispiel für die Ausführung der DSLN-Prüfung:
 * \code
 *
 * #include <iostream>
 * #include <UV_KP.h>
 * 
 * using namespace std;
 * using namespace uvkp;
 * 
 * int main(int argc, char* argv[])
 * {
 *    // Pruefung ausführen
 *    KernpruefungDSLN kernpruefung; // DSLN-Prüfung
 *    Rueckgabe* rueckgabe = kernpruefung.pruefe(argv[1]);
 *
 *    // Alle Meldungen einzeln ausgeben
 *    cout << rueckgabe->getAnzahlRueckgabeMeldungen() << " Meldungen:" << endl;
 *    for (unsigned int i = 0; i < rueckgabe->getAnzahlRueckgabeMeldungen(); i++)
 *    {
 *       Meldung* meldung = rueckgabe->getRueckgabeMeldung(i);
 *       cout << meldung->toString() << endl;
 *    }
 *    
 *    // Alle Meldungen als DBFE-Bausteine ausgeben
 *    char* rueckgabeString = rueckgabe->toString();
 *    cout << rueckgabeString << endl;
 *    delete[] rueckgabeString; // rueckgabeString löschen und den Speicher freigeben
 *
 *    delete rueckgabe; // rueckgabe löschen und den Speicher freigeben
 * }
 *
 * \endcode
 */

/**
 * Beinhaltet C++-Klassen und -Funktionen für die Durchführung von Plausibilitätsprüfungen
 * im Rahmen des Prüfverfahrens UV-KP (Kernprüfungen).
 */
namespace uvkp
{
   /**
    * Schweregrad einer Meldung.
    */
   enum Schweregrad
   {
      /**
       * Es handelt sich um einen Hinweis.
       */
      HINWEIS = 1,

      /**
       * Es handelt sich um einen Fehler.
       */
      FEHLER = 2,

      /**
       * Es handelt sich um einen Abbruch.
       */
      ABBRUCH = 4
   };

   /**
    * Meldung mit {@link Schweregrad} und Beschreibung.
    */
   class UVKP_API Meldung
   {
   public:
      /**
       * Gibt den Schweregrad der Meldung zurück.
       * @return Schweregrad der Meldung.
       */
      virtual Schweregrad getSchweregrad() = 0;

      /**
       * Gibt den Fehlerkode zurück.
       * @return Fehlerkode.
       */
      virtual char* getFehlerkode() = 0;

      /**
       * Gibt den Fehlertext der Meldung zurück.
       * @return Fehlertext.
       */
      virtual char* getFehlertext() = 0;

      /**
       * Gibt den Feldnamen zurück.
       * @return Feldname.
       */
      virtual char* getFeld() = 0;

      /**
       * Gibt die gesamte Meldung als String zurück.
       * @return Gesamte Meldung als String.
       */
      char* toString();
   };

   /**
    * Das Interface Rueckgabe enthält alle Methoden, die für die Abfrage des
    * Ergebnisses der Kernprüfung notwendig sind.
    */
   class UVKP_API Rueckgabe
   {
   public:
     /**
      * Gibt den Return-Code der Kernprüfung zurück.
      * <p>
      * Es werden folgende Return-Code festgelegt:
      * <ul>
      * 	<li>0 = Kernprüfung fehlerfrei Ausgabe von getAnzahlRueckgabeMeldungen() ist 0
      * 	<li>1 = Kernprüfung enthält Hinweise
      * 	<li>2 = Kernprüfung enthält Fehler
      * 	<li>3 = Kernprüfung enthält Fehler und Hinweise
      * 	<li>4 = Kernprüfung ist abgebrochen
      * </ul>
      * @return Return-Code
      */
      virtual unsigned int getReturnCode() = 0;

      /**
       * Gibt den vierstelliegen Typ der verwendeten Kernprüfung zurück.
       * @return Vierstellieger Typ der verwendeten Kernprüfung.
       */
      virtual char* getType() = 0;

      /**
       * Gibt die Version der verwendeten Kernprüfung zurück.
       * @return Version der verwendeten Kernprüfung.
       */
      virtual char* getVersion() = 0;

     /**
      * Gibt die Anzahl der Rückgabemeldungen zurück.
      * <p>
      * Es sind maximal neun Einträge möglich.
      * @return Anzahl der Rückgabemeldungen
      */
     virtual unsigned int getAnzahlRueckgabeMeldungen() = 0;

     /**
      * Gibt die Rückgabemeldung mit dem vorgegebenem Index zurück.
      * @return {@link Meldung} mit dem vorgegebenem Index.
      */
     virtual Meldung* getRueckgabeMeldung(unsigned int i) = 0;

     /**
      * Gibt die String-Darstellung eines Rückgabeobjektes zurück.
      * <p>
      * <table border="1" frame="box" cellspacing="0">
      *   <caption>Aufbau des String's</caption>
      *   <tr bgcolor="#A8B8D9"><th colspan="2">Stelle</th><th rowspan="2">Inhalt</th></tr>
      *   <tr bgcolor="#A8B8D9"><th width="60">von</th><th width="60">bis</th></tr>
      *   <tr><td align="right">  1</td><td align="right">  1</td><td>Return-Code</td></tr>
      *   <tr><td align="right">  2</td><td align="right">  2</td><td>Anzahl der DBFE-Bausteine (max. 9)</td></tr>
      *   <tr><td align="right">  3</td><td align="right"> 75</td><td>DBFE-Baustein 1 (falls vorhanden)</td></tr>
      *   <tr><td align="right"> 76</td><td align="right">148</td><td>DBFE-Baustein 2 (falls vorhanden)</td></tr>
      *   <tr><td align="right">149</td><td align="right">221</td><td>DBFE-Baustein 3 (falls vorhanden)</td></tr>
      *   <tr><td align="right">222</td><td align="right">294</td><td>DBFE-Baustein 4 (falls vorhanden)</td></tr>
      *   <tr><td align="right">295</td><td align="right">367</td><td>DBFE-Baustein 5 (falls vorhanden)</td></tr>
      *   <tr><td align="right">368</td><td align="right">440</td><td>DBFE-Baustein 6 (falls vorhanden)</td></tr>
      *   <tr><td align="right">441</td><td align="right">513</td><td>DBFE-Baustein 7 (falls vorhanden)</td></tr>
      *   <tr><td align="right">514</td><td align="right">586</td><td>DBFE-Baustein 8 (falls vorhanden)</td></tr>
      *   <tr><td align="right">587</td><td align="right">659</td><td>DBFE-Baustein 9 (falls vorhanden)</td></tr>
      * </table>
      * @return String-Darstellung des Rückgabeobjektes
      */
      char* toString();
   };

   /**
    * Das Interface Kernpruefung enthält die Methode zur Kernprüfung eines Datensatzes.
    */
   class UVKP_API Kernpruefung
   {
   public:
      /**
       * Gibt den vierstelliegen Typ der Kernprüfung zurück.
       * @return Vierstellieger Typ der Kernprüfung.
       */
      virtual char* getType() = 0;

      /**
       * Der eingegebene Datensatz wird kerngeprüft.
       * @param datensatz Datensatz als Zeichenkette.
       * @return {@link Rueckgabe}-Objekt.
       */
      Rueckgabe* pruefe(const char* datensatz);

   private:
      virtual char* getTypeErrorCode() = 0;
      virtual char* getTypeErrorText() = 0;
      virtual char* getFormatErrorCode() = 0;
      virtual char* getFormatErrorText() = 0;
      virtual void checkVersion(const char* version) = 0;
      virtual void checkMMDBAP(const char* datensatz) = 0;
   };

   /**
    * Implementierung des Interfaces {@link Kernpruefung} für die Prüfung von DSLN-Datensätzen.
    */
   class UVKP_API KernpruefungDSLN : public Kernpruefung
   {
   public:
      char* getType();
   private:
      char* getTypeErrorCode();
      char* getTypeErrorText();
      char* getFormatErrorCode();
      char* getFormatErrorText();
      void checkVersion(const char* version);
      void checkMMDBAP(const char* datensatz);
   };

   /**
    * Implementierung des Interfaces {@link Kernpruefung} für die Prüfung von DSAS-Datensätzen.
    */
   class UVKP_API KernpruefungDSAS : public Kernpruefung
   {
   public:
      char* getType();
   private:
      char* getTypeErrorCode();
      char* getTypeErrorText();
      char* getFormatErrorCode();
      char* getFormatErrorText();
      void checkVersion(const char* version);
      void checkMMDBAP(const char* datensatz);
   };

   /**
    * Implementierung des Interfaces {@link Kernpruefung} für die Prüfung von DSKO-Datensätzen.
    */
   class UVKP_API KernpruefungDSKO : public Kernpruefung
   {
   public:
      char* getType();
   private:
      char* getTypeErrorCode();
      char* getTypeErrorText();
      char* getFormatErrorCode();
      char* getFormatErrorText();
      void checkVersion(const char* version);
      void checkMMDBAP(const char* datensatz);
   };
}

#endif