#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# author: bt3gl

class Node():
    """Implementation of a Node for a binary tree"""

    def __init__(self, value=None):
        self.value = value
        self.left = None
        self.right = None

    def __repr__(self):
        """Prints the node"""
        return f'{self.value}'


class LinkedListFIFO:
    '''A Linked-List class with a first-in-first-out logic'''

    def __init__(self):
        self.head = None
        self.tail = None
        self.length = 0
    
    def add_first(self, value):
        self.length = 1
        node = Node(value)
        self.head = node
        self.tail = node
    
    def delete_first(self):
        self.length = 0
        self.head = None
        self.tail = None
  
    def add(self, value):
        self.length += 1
        node = Node(value)
        if self.tail:
            self.tail.right = node
        self.tail = node
    
    def _delete(self, node):
        if not self.head or not self.head.pointer:
            self.delete_first()
        else:
            node, prev, i = self._find(index)
            if i == index and node:
                self.length -= 1
                if i == 0 or not prev:
                    self.head = node.pointer
                else:
                    prev.pointer = node.pointer
                if not self.tail == node:
                    self.tail = prev
    
    def find(self, index):
        prev = None
        node = self.head
        i = 0
        while node and i < index:
            prev = node
            node = node.right
            i += 1
        return node, prev, i


if __name__ == '__main__':

    print('Linked List FIFO')
    ll = LinkedListFIFO()
    print(f'Add 1: {ll.add(1)}')
    print(f'Add 2: {ll.add(2)}')
    print(f'Add 3: {ll.add(3)}')

    print(f'Length: {ll.length}')
    print(f'Find 1: {ll.find(1)}')

    print(f'Delete 1: {ll._delete(1)}')
    print(f'Length: {ll.length}')
    print(f'Find 1: {ll.find(1)}')