#include <iostream>
#include <stdlib.h>

struct customer {
	void random_customer() {}
};

class Node
{
    private:
        customer data;
        Node *next;
    public:
        /*Nodes constructors*/
        Node(){next=nullptr;}
        Node(customer X)
        {
            data=X;
            next=nullptr;
        }
        /*Data setters and getters*/
        void set_Data(customer X)
        {data = X;}
        customer get_Data()
        {return data;}
        /*next setters and getters*/
        void set_next(Node * X){next=X;}
        Node* get_next(){return next;}


};

class List
{
    private:
        Node * head;
        Node * tail;
        int counter;
    public:
        /*Constructors*/
        List(){head=nullptr;tail=head;counter=0;}
        /*Copy constructor*/
        List(const List& rhs) { *this = rhs; }
        /*copy operator*/
        List& operator=(const List& rhs)
        {
        	Clear();
        	Node* temp = rhs.head;
        	while (temp) {
        		add_End(temp->get_Data());
        		temp = temp->get_next();
        	}
        	return *this;
        }
        /*Checks if the list is empty*/
        bool isEmpty()
        {
            if (head==nullptr)
                return true;
            return false;
        }
        /*front manipulation*/
        void add_Front(customer item)
        {
            if (isEmpty())
            {
                head = new Node(item);
                tail = head;
                counter++;
            }
            else{
            Node * nw= new Node(item);
            nw ->set_next(head);
            head=nw;
            counter++;
            }
        }
        void pop_Front()
        {
            if (isEmpty())
                return;
            if (head==tail)
            {
                delete head;
                head = tail = nullptr;
                counter--;
                return;
            }
            Node * temphead=head;
            head=head->get_next();
            delete temphead;
            counter--;
        }
        /*End Manipulation*/
        void add_End(customer X)
        {
            if(isEmpty()){
                add_Front(X);
                counter++;}
            else
            {
                Node * temp=new Node(X);
                tail->set_next(temp);
                tail=temp;
                counter++;
            }
        }

        /*freeing the whole list*/
        void Clear()
        {
            while (!isEmpty())
                pop_Front();
        }

        /*Destructor*/
        ~List(){Clear();}

        /*Extras*/
        int get_Size(){return counter;}
        customer get_Front(){return head->get_Data();}
        customer get_End(){return tail->get_Data();}

};

using namespace std;

int main()
{
    List Data;
    int numberofelements;
    cout<<"How many customers you wanna randomly generate? : ";
    cin >> numberofelements;
    srand(time(NULL));
    for (int i=0; i<numberofelements; i++)
    {
        customer temp;
        temp.random_customer();
        Data.add_Front(temp);

    }
    {
	    List Data2;
	    Data2 = Data;
    }
    List Data3 { Data };

    std::cout << "here goes the destructor\n";
    return 0;
}

