class PhoneBookViewController(object):
    def __init__(self):

        config = ConfigParameters()
        self.phone_book_file_db = config.get_phone_book_file_db()
        dict = self.phone_book_file_db.load_phone_book_from_file()
        self.book = PhoneBook()
        self.book.load_phone_book_from_dict(dict)

        self.controller = {
            1: self._create_phone_number,
            2: self._get_phone_by_name,
            3: self._get_customer_by_phone,
            4: self._delete_by_name,
            5: self._show_all
        }

    def print_text(self, text):
        print text

    def print_to_socket(self, socket, text):
        socket.sendall(text)

    @staticmethod
    def print_menu():
        CRUD_DICT = {
            1: 'Create phone number',
            2: 'Get phone number by name',
            3: 'Get customer name by phone',
            4: 'Delete phone number by name',
            5: 'Show all phones on a book',
            0: 'Exit'
        }

        for i, text in CRUD_DICT.items():
            print str(i) + " : " + text

        try:
            choice = int(raw_input('Input your choice:'))
        except ValueError:
            print 'Wrong input!'
            choice = settings.DEFAULT_CHOICE

        return choice

    def catch_name_error(func):
        def wrapper(self, *args):
            try:
                return func(self, *args)
            except NameError as e:
                print e
            # except:
            #      print 'ERROR!'

        return wrapper

    @catch_name_error
    def start_action(self, choice):
        self.controller.get(choice, self._default_choice)()
        self.phone_book_file_db.save_phone_book_to_file(self.book)

    @staticmethod
    def _input_phone_number():
        phone_number = str(raw_input())

        while not phone_number.isdigit():
            print 'WARN Inocrrect msisdn. Please retry.'
            phone_number = str(raw_input())
        return phone_number

    def _default_choice(self):
        pass

    def _create_phone_number(self):
        print '1. Please input phone number: '
        phone_number = self._input_phone_number()
        print '2. Please input customer name: '
        customer = raw_input()
        phone_number_unicode = phone_number.decode('utf-8')
        customer_unicode = customer.decode('utf-8')
        self.book.add_new_subscriber(phone_number_unicode, customer_unicode)
        print "OK."

    def _get_phone_by_name(self):
        print '1. Please input customer name: '
        customer = raw_input()
        customer_unicode = customer.decode('utf-8')
        subscriber_item = self.book.get_phone_by_subscriber(customer_unicode)
        item_0_u = subscriber_item[0].center(
            settings.CENTER_WIDTH).encode('utf-8')
        item_1_u = subscriber_item[1].center(
            settings.CENTER_WIDTH).encode('utf-8')
        try:
            print '|------Subscriber------|-----Phone number-----|'
            print '| {}|{} |'.format(item_0_u, item_1_u)
            print '|----------------------|----------------------|'
        except TypeError:
            pass

    def _get_customer_by_phone(self):
        print '1. Please input msisdn: '
        phone_number = self._input_phone_number()
        phone_number_u = phone_number.decode('utf-8')
        try:
            subscriber = self.book.get_subscriber_by_phone(phone_number_u)
            phone_number_unicode = phone_number.center(
                settings.CENTER_WIDTH).decode('utf-8')
            subscriber_unicode = subscriber.center(
                settings.CENTER_WIDTH).decode('utf-8')
            print '|------Subscriber------|-----Phone number-----|'
            print '| {}|{} |'.format(subscriber_unicode, phone_number_unicode)
            print '|----------------------|----------------------|'
        except NameError:
            pass

    def _delete_by_name(self):
        print '1. Please input customer name to delete: '
        subscriber = raw_input()
        self.book.delete_customer_by_name(subscriber.decode('utf-8'))
        print 'Subscribers {} phone deleted'.format(subscriber)

    def _show_all(self):
        dic = self.book.get_phone_book_dict()
        print '|------Subscriber------|-----Phone number-----|'

        for phone, name in dic.items():
            name_pre_utf = name.center(settings.CENTER_WIDTH).encode('utf-8')
            phone_pre_utf = phone.center(settings.CENTER_WIDTH).encode('utf-8')
            print '| {}|{} |'.format(name_pre_utf, phone_pre_utf)
        print '|----------------------|----------------------|'