'''
File: print_util.py
Created Time: 2021-12-11
Author: Krahets (krahets@163.com)
'''

import copy
import queue
from .binary_tree import TreeNode, tree_to_list
from .linked_list import ListNode, linked_list_to_list

def print_matrix(mat):
    """Print a matrix

    Args:
        mat ([type]): [description]
    """    
    pstr = []
    for arr in mat:
        pstr.append('  ' + str(arr))

    print('[\n' + ',\n'.join(pstr) + '\n]')

def print_linked_list(head):
    """Print a linked list

    Args:
        head ([type]): [description]
    """    
    arr = linked_list_to_list(head)
    print(' -> '.join([str(a) for a in arr]))

class Trunk:
    def __init__(self, prev=None, str=None):
        self.prev = prev
        self.str = str
 
def showTrunks(p):
    if p is None:
        return
    showTrunks(p.prev)
    print(p.str, end='')
 
def print_tree(root, prev=None, isLeft=False):
    """Print a binary tree
       This tree printer is borrowed from TECHIE DELIGHT
       https://www.techiedelight.com/c-program-print-binary-tree/
    Args:
        root ([type]): [description]
        prev ([type], optional): [description]. Defaults to None.
        isLeft (bool, optional): [description]. Defaults to False.
    """
    if root is None:
        return
 
    prev_str = '    '
    trunk = Trunk(prev, prev_str)
    print_tree(root.right, trunk, True)
 
    if prev is None:
        trunk.str = '———'
    elif isLeft:
        trunk.str = '/———'
        prev_str = '   |'
    else:
        trunk.str = '\———'
        prev.str = prev_str
 
    showTrunks(trunk)
    print(' ' + str(root.val))
    if prev:
        prev.str = prev_str
    trunk.str = '   |'
    print_tree(root.left, trunk, False)
