#ifndef SDCARD_H_
#define SDCARD_H_

#include "utils.h"
#ifndef EZ_APPLICATION_LICENCE_DISABLE

#define CID_LENGTH 32
#define CSD_LENGTH 32

using namespace std;

typedef uint32_t DWORD;
typedef uint16_t WORD;
typedef uint8_t BYTE;
typedef uint32_t UDINT;
typedef uint32_t DATE;
typedef uint8_t USINT;
typedef int32_t DINT;
typedef uint16_t UINT;
typedef int16_t INT;

const BYTE cnibblescount = 32;

const string cidFilePath = "";

struct SDCardInfo
{
  uint32_t cardSize{};
  uint32_t serialNumber{};
  string date = "";
  string oemID = "";
  string name = "";
  bool isLoaded = false;
};

class SDCard
{
  struct SDCardData
  {
    uint8_t isCorrectLoad = 0;    // SD karta je korektne nactena //bool vs byte ?
    uint8_t CID_nibble[32] = {0}; // surova data CID ze souboru
    uint8_t CID[16] = {0};        //  prekodovane CID informace
    uint8_t manufacturerID = 0;   // ID vyrobce 1B -> Byte 15
    char oemID[2] = {};           // ID aplikace/oem 2B -> Byte 13-14  // oemID: !!STRING(3);
    char name[5] = {};            // jmeno produktu 5B -> Byte 8-12 !!STRING(6);
    uint8_t productRevision_hw = 0;
    uint8_t productRevision_sw = 0;
    float productRevision = 0; // revize produktu 1B [bcd sh] -> Byte 7, bity 0-3 = revize HW, bity 4-7 = revize SW
    uint32_t serialNumber = 0; // seriove cislo karty 4B -> Byte 3-6
    uint16_t manufacturerDate_year = 0;
    uint8_t manufacturerDate_month = 0;
    string date = "";
    char manufacturerDate[10] = {}; //: STRING(10); // datum vyroby 2B [bcd -yym] -> Byte 1-2, bity 0-3 = mesic, bity 4-11 = posledni cislice roku or roku 2000, bity 12-15 nepouzito
    uint8_t CRCOK = 0;              // CRC 1B -> Byte 0, bity 1-7, bit 0 je vzdy = 1
    uint8_t CSD_nibble[32] = {};    //: ARRAY [0..31] OF BYTE;	// surova data CSD ze souboru
    uint8_t CSD[16] = {};           //: ARRAY [0..15] OF BYTE;			// prekodovane CSD informace
    uint32_t cardSize = 0;          //: UDINT;							// velikost SD karty
    uint8_t cardGSize = 0;          // prepocitana velikost na GB
    bool crcCorrect = false;
  };

  bool readSDCard();
  bool getCIDFromFile();
  bool getCSDFromFile();

public:
  SDCardData cardData;
  bool isLoaded = false;
  char cid[32] = {};
  char csd[32] = {};
  string filePath = "";
  string cidString = ""; // pro předání pro starý generátor
  string csdString = ""; // pro předání pro starý generátor

  SDCard();
  SDCard(string cid, string csd);
  SDCard(const string filesPath);
};

#endif
#endif