#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""\
Predictive text for mobile phones
jill-jenn vie et christoph durr and louis abraham - 2014-2019
"""

__all__ = ["predictive_text", "propose"]

# snip{
t9 = "22233344455566677778889999"
#     abcdefghijklmnopqrstuvwxyz   mapping on the phone


def letter_to_digit(x):
    """:returns: the digit correspondence for letter x"""
    assert 'a' <= x <= 'z'
    return t9[ord(x) - ord('a')]


def code_word(word):
    """:returns: the digit correspondence for given word"""
    return ''.join(map(letter_to_digit, word))


def predictive_text(dic):
    """Predictive text for mobile phones

    :param dic: associates weights to words from [a-z]*
    :returns: a dictionary associating to words from [2-9]*
             a corresponding word from the dictionary with highest weight
    :complexity: linear in total word length
    """
    # total_weight[p] = total weight of words having prefix p
    total_weight = {}
    for word, weight in dic:
        prefix = ""
        for x in word:
            prefix += x
            if prefix in total_weight:
                total_weight[prefix] += weight
            else:
                total_weight[prefix] = weight
    #   prop[s] = prefix to display for s
    prop = {}
    for prefix in total_weight:
        code = code_word(prefix)
        if (code not in prop
                or total_weight[prop[code]] < total_weight[prefix]):
            prop[code] = prefix
    return prop


def propose(prop, seq):
    """wrapper to access a dictionary even for non-present keys"""
    if seq in prop:
        return prop[seq]
    return None
# snip}
