/*************************************************
* ADS Praktikum 1.1
* Ring.cpp
* Erweiterung um Hilfsfunktionen gestattet.
*************************************************/
// Ring .cpp
#include "Ring.h"
#include <iostream>

Ring::Ring() {
    m_anker = nullptr;
    m_countNodes = 0;
};

void Ring::addNewNode(std::string Beschreibung, std::string Data) {
    RingNode* newNode = new RingNode(0, Beschreibung, Data);

    // Fall 1 Ring ist leer
    if (m_countNodes == 0) {
        m_anker = newNode;
        newNode->setNext(m_anker);
        m_anker->setNext(newNode);
        m_countNodes++;
    }

    // Fall 2 Ring ist nut teilweise voll
    else if (m_countNodes != 6) {
        RingNode* ptr = m_anker->getNext();

        newNode->setNext(m_anker->getNext());
        m_anker->setNext(newNode);
        m_anker = newNode;
        m_countNodes++;

        if (m_countNodes == 1)
            m_anker->setOldAge(m_anker->getOldAge() + 1);
        else {
            while (ptr != m_anker) {
                ptr->setOldAge(ptr->getOldAge() + 1);
                ptr = ptr->getNext();
            }
        }
    }

    // Fall 3 Ring ist voll
    else if (m_countNodes == 6) {
        RingNode* nodeAge5 = m_anker->getNext();
        newNode->setNext(nodeAge5->getNext());
        m_anker->setNext(newNode);
        delete nodeAge5;
        m_anker = newNode;

        RingNode* ptr = m_anker->getNext();
        while (ptr != m_anker) {
            ptr->setOldAge(ptr->getOldAge() + 1);
            ptr = ptr->getNext();
        }
    }
};

bool Ring::search(std::string Data) {
    if (m_anker != nullptr) {
        // Fängt beim letzten/ältesten Knoten in der Liste an
        RingNode* ptr = m_anker->getNext();

        while (ptr->getNext() != m_anker->getNext() && ptr->getSymbolicData() != Data)
            ptr = ptr->getNext();

        if (ptr->getSymbolicData() == Data)
            return true;
        else
            return false;
    }
    else return false;
}

void Ring::printNode(std::string Data) {
    if (search(Data)) {
        // Fangen beim ältesten Knoten an
        RingNode* ptr = m_anker->getNext();

        //       kein doppeltes Durchlaufen       und   Data stimmt nicht überein
        while (ptr->getNext() != m_anker->getNext() && ptr->getSymbolicData() != Data)
            ptr = ptr->getNext();

        // die while Schleife wird abgebrochen werden, da Data übereinstimmt. Data muss vorhanden sein da if(search(data) == true)
        std::cout << "+ Gefunden in Backup: ";
        std::cout << "Alter " << ptr->getOldAge() << ", Beschreibung: " << ptr->getDescription() << ", Daten: " << ptr->getSymbolicData() << std::endl;
    }
    else
        std::cout << "+ Datensatz konnte nicht gefunden werden." << std::endl;
}

void Ring::print() {
    std::cout << std::endl;
    // Zählt den Knoten der ausgegeben werden soll
    for (int i = 0; i < m_countNodes; i++) {
        RingNode* tempNode = m_anker;
        // geht bis zu diesem
        for (int j = 0; j < m_countNodes - i; j++) {
            tempNode = tempNode->getNext();
        }
        std::cout << "Alter " << tempNode->getOldAge() << ", Beschreibung: " << tempNode->getDescription() << ", Daten: " << tempNode->getSymbolicData() << std::endl
            << "-------------------------------" << std::endl;
    }
    std::cout << std::endl;
};