from ..session.org_mode import global_session as session
from ..knowledge_base import KnowledgeBase
from ..utils.visuals import show_progbar
from ..visualization import show_knowledge
from ..utils.tokenization import train_basic_tokenization

def _assert(args):
    assert(args)

def _assert_msg(args, msg):
    assert args, msg

examples = [
    ('full_example',
     {
         "text": "is icecream cold?",
         "affirmation": "icecream is cold",
         "parsed": ("question",
                    ("exists-property-with-value", 'icecream', 'cold')),
         "answer": True,
         "after_execution": [(
             lambda knowledge: _assert('cold' in knowledge.knowledge['icecream']['property'])
         ),],
     }),
    ('full_example',
     {
         "text": "is earth a planet?",
         "affirmation": "earth is a planet",
         "parsed": ("question",
                    ("pertenence-to-group", 'earth', 'planet')),
         "answer": True,
         "after_execution": [(
             lambda knowledge: _assert('planet' in knowledge.knowledge['earth']['groups'])
         ),],
     }),
    ('full_example',
     {
         "text": "Is green a color?",
         "affirmation": "green is a color",
         "parsed": ("question",
                    ("pertenence-to-group", 'green', 'color')),
         "answer": True,
         "after_execution": [(
             lambda knowledge: _assert('color' in knowledge.knowledge['green']['groups'])
         ),],
     }),
    ('full_example',
     {
         "text": "do airplanes fly?",
         "affirmation": "airplanes fly",
         "parsed": ("question",
                    ("has-capacity", 'plane', 'fly')),
         "answer": True,
         "after_execution": [(
             lambda knowledge: _assert('fly' in knowledge.knowledge['plane']['capacities'])
         ),],
     }),
    ('full_example',
     {
         "text": "Is it hot during the summer?",
         "affirmation": "it is hot during summer",
         "parsed": ("question",
                    ("implies", 'summer', 'hot')),
         "answer": True,
         "after_execution": [(
             lambda knowledge: _assert('hot' in knowledge.knowledge['summer']['implications'])
         ),],
     }),
    ('full_example',
     {
         "text": "is chile in south america ?",
         "affirmation": "chile is in south america",
         "parsed": ("question",
                    ("property-has-value", 'chile', 'location', 'south america')),
         "answer": True,
         "after_execution": [(
             lambda knowledge: _assert('south america' in knowledge.knowledge['chile']['location'])
         ),],
     }),
    ('full_example',
     {
         "text": "Was Socrates a man?",
         "affirmation": "Socrates was a man",
         "parsed": ("question",
                    ("pertenence-to-group", 'socrates', 'man')),
         "answer": True,
         "after_execution": [(
             lambda knowledge: _assert('man' in knowledge.knowledge['socrates']['groups'])
         ),],
     }),
    ('full_example',
     {
         "text": "Computers use electricity?",
         "affirmation": "Computers use electricity",
         "parsed": ("question",
                    ('perform-verb-over-object', 'computers', 'use', 'electricity')),
         "answer": True,
         "after_execution": [(
             lambda knowledge: _assert('electricity' in knowledge.knowledge['computers']['performs-over']['use'])
         ),],
     }),
    # ('full_example',
    #  {
    #      "text": "The dominant language in france is french?",
    #      "affirmation": "The dominant language in france is french",
    #      "parsed": ("question",
    #                 ("property-has-value", "france", "dominant-language", "french")),
    #      "answer": True,
    #  }),
    # {
    #     "text": "was abraham lincoln once president of the united states?",
    #     "affirmation": "was abraham lincoln once president of the united states?",
    #     "parsed": (),
    #     "answer": None,
    # },
    ('text_example',
     {
         "question": "is milk white?",
         "affirmation": "milk is white",
         "answer": True,
     }),
    # {
    #     "text": "do people have emotions?",
    #     "affirmation": "do people have emotions?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "do objects appear smaller as they move away from you?",
    #     "affirmation": "do objects appear smaller as they move away from you?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Does the human species have a male and female gender?",
    #     "affirmation": "Does the human species have a male and female gender?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Is a mountain mostly made of rock?",
    #     "affirmation": "Is a mountain mostly made of rock?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "is sun microsystems a computer company?",
    #     "affirmation": "is sun microsystems a computer company?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Do you see with your eyes and smell with your nose?",
    #     "affirmation": "Do you see with your eyes and smell with your nose?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Is smoking bad for your health?",
    #     "affirmation": "Is smoking bad for your health?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Does a dog have four legs?",
    #     "affirmation": "Does a dog have four legs?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Do mammals have hearts?",
    #     "affirmation": "Do mammals have hearts?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "is the Earth a planet?",
    #     "affirmation": "is the Earth a planet?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # ('text_example',
    #  {
    #      "question": "is water a liquid?",
    #      "affirmation": "water is a liquid",
    #      "answer": True,
    #  }),
    # {
    #     "text": "Is Bugs Bunny a cartoon character?",
    #     "affirmation": "Is Bugs Bunny a cartoon character?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Do Humans communicate by Telephone?",
    #     "affirmation": "Do Humans communicate by Telephone?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "is beer a drink ?",
    #     "affirmation": "is beer a drink ?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "are there 12 months in a year?",
    #     "affirmation": "are there 12 months in a year?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "does the sun hurt your eyes when you look at it?",
    #     "affirmation": "does the sun hurt your eyes when you look at it?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Do most cars have doors?",
    #     "affirmation": "Do most cars have doors?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "is orange both a fruit and a colour?",
    #     "affirmation": "is orange both a fruit and a colour?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Is water a necessity?",
    #     "affirmation": "Is water a necessity?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Do CDs have better quality sound than Cassettes?",
    #     "affirmation": "Do CDs have better quality sound than Cassettes?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "do animals die?",
    #     "affirmation": "do animals die?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Is the arctic cold?",
    #     "affirmation": "Is the arctic cold?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Do people have 2 eyes?",
    #     "affirmation": "Do people have 2 eyes?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "does a person have a brain?",
    #     "affirmation": "does a person have a brain?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Is the rain wet?",
    #     "affirmation": "Is the rain wet?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Is division a mathematical operation?",
    #     "affirmation": "Is division a mathematical operation?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "is 400 greater than 399?",
    #     "affirmation": "is 400 greater than 399?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "is magenta a color?",
    #     "affirmation": "is magenta a color?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Are books educational?",
    #     "affirmation": "Are books educational?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Was the Great Wall of China built by humans?",
    #     "affirmation": "Was the Great Wall of China built by humans?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Are pianos musical instruments?",
    #     "affirmation": "Are pianos musical instruments?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Has Bill Clinton been President of the United States?",
    #     "affirmation": "Has Bill Clinton been President of the United States?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Is a whale a mammal?",
    #     "affirmation": "Is a whale a mammal?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Are lemons yellow?",
    #     "affirmation": "Are lemons yellow?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Is the South Pole cold?",
    #     "affirmation": "Is the South Pole cold?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Is Africa warm?",
    #     "affirmation": "Is Africa warm?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Is Antarctica cold?",
    #     "affirmation": "Is Antarctica cold?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Is rock is generally harder than wood?",
    #     "affirmation": "Is rock is generally harder than wood?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Do dogs chase cats?",
    #     "affirmation": "Do dogs chase cats?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "can humans die from cold temperatures?",
    #     "affirmation": "can humans die from cold temperatures?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "do people enjoy conversation?",
    #     "affirmation": "do people enjoy conversation?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Is Bill Clinton the President of the United States?",
    #     "affirmation": "Is Bill Clinton the President of the United States?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Are books a good source of information?",
    #     "affirmation": "Are books a good source of information?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "are friends different than enemies?",
    #     "affirmation": "are friends different than enemies?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "are people alive?",
    #     "affirmation": "are people alive?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Do triangles have 3 sides?",
    #     "affirmation": "Do triangles have 3 sides?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Is Ice cream cold?",
    #     "affirmation": "Is Ice cream cold?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Are all sides of a square the same length?",
    #     "affirmation": "Are all sides of a square the same length?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Do all people eat food?",
    #     "affirmation": "Do all people eat food?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "do dentists repair teeth?",
    #     "affirmation": "do dentists repair teeth?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Is America bigger than Japan?",
    #     "affirmation": "Is America bigger than Japan?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Do all triangles have three sides?",
    #     "affirmation": "Do all triangles have three sides?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "A grocery store sales food?",
    #     "affirmation": "A grocery store sales food?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Does a sunburn cause pain?",
    #     "affirmation": "Does a sunburn cause pain?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Is a computer an invention?",
    #     "affirmation": "Is a computer an invention?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "have humans visited the moon?",
    #     "affirmation": "have humans visited the moon?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Are there people in India?",
    #     "affirmation": "Are there people in India?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Was Einstein a genius?",
    #     "affirmation": "Was Einstein a genius?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Are we on the planet earth?",
    #     "affirmation": "Are we on the planet earth?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "do people comb their hair in the morning?",
    #     "affirmation": "do people comb their hair in the morning?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Does it hurt to lose a friend?",
    #     "affirmation": "Does it hurt to lose a friend?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Are there people on the earth?",
    #     "affirmation": "Are there people on the earth?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Was George Washington a president of the United States of America?",
    #     "affirmation": "Was George Washington a president of the United States of America?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Does an ocean have salt water in it?",
    #     "affirmation": "Does an ocean have salt water in it?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Is night darker than day?",
    #     "affirmation": "Is night darker than day?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Does a triangle have three sides?",
    #     "affirmation": "Does a triangle have three sides?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Are peaches fruit?",
    #     "affirmation": "Are peaches fruit?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Do people urinate?",
    #     "affirmation": "Do people urinate?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Is Germany located in Europe?",
    #     "affirmation": "Is Germany located in Europe?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Do mirrors reflect light?",
    #     "affirmation": "Do mirrors reflect light?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Are people born naked?",
    #     "affirmation": "Are people born naked?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Is it hot near the equator?",
    #     "affirmation": "Is it hot near the equator?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "is paper made from trees?",
    #     "affirmation": "is paper made from trees?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Can a female have children?",
    #     "affirmation": "Can a female have children?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Are people born every day?",
    #     "affirmation": "Are people born every day?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Are shoes worn on the feet?",
    #     "affirmation": "Are shoes worn on the feet?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "does it get wet when it rains?",
    #     "affirmation": "does it get wet when it rains?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Are there plants and insects in the rainforest which have no names?",
    #     "affirmation": "Are there plants and insects in the rainforest which have no names?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Do people eat pigs?",
    #     "affirmation": "Do people eat pigs?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Do businessmen wear ties?",
    #     "affirmation": "Do businessmen wear ties?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Is New York in the United States?",
    #     "affirmation": "Is New York in the United States?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Are humans more intelligent than ants?",
    #     "affirmation": "Are humans more intelligent than ants?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Are ravens black?",
    #     "affirmation": "Are ravens black?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Are there rats on ships?",
    #     "affirmation": "Are there rats on ships?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "are lions animals?",
    #     "affirmation": "are lions animals?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "6 is greater than 5?",
    #     "affirmation": "6 is greater than 5?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Is water made of hydrogen and oxygen?",
    #     "affirmation": "Is water made of hydrogen and oxygen?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "is the sky blue on a clear day?",
    #     "affirmation": "is the sky blue on a clear day?",
    #     "parsed": (),
    #     "answer": None,
    # },
    # {
    #     "text": "Do most people work during the day?",
    #     "affirmation": "Do most people work during the day?",
    #     "parsed": (),
    #     "answer": None,
    # },
]

base_knowledge = {
    'summer': {
        "groups": {'epoch'},
    },
    'fly': {
        "groups": {'verb'},
    },
    'use': {
        "groups": {'verb'},
    },
    'electricity': {
        "groups": {'power'},
    },
    'airplanes': {},
    'white': {
        'groups': {'property'},
    }
}

def main():
    knowledge = KnowledgeBase(
        knowledge=base_knowledge,
    )

    train_basic_tokenization(knowledge)

    total = len(examples)

    for i, (example_type, data) in enumerate(examples):
        if example_type == 'full_example':
            affirmation = {
                'text': data['affirmation'],
                'parsed': data['parsed'][1],
            }
            question = data

            with session().log(data['affirmation']):
                show_progbar(i, total, data['affirmation'])
                differences = knowledge.train([affirmation])

            with session().log(data['text']):
                show_progbar(i, total, data['text'])
                differences = knowledge.train([question])
                session().annotate(differences())

                result, _, _ = knowledge.process(data['text'])

            if "after_execution" in data:
                for f in data["after_execution"]:
                    f(knowledge)

            if result != data['answer']:
                raise AssertionError('{} is not {}'.format(result, data['answer']))

        elif example_type == 'text_example':
            with session().log(data['affirmation']):
                show_progbar(i, total, data['affirmation'])
                affirmation = data['affirmation']
                session().annotate("Processing affirmation: {}".format(affirmation))
                _, _, _ = knowledge.process(affirmation)

            with session().log(data['question']):
                show_progbar(i, total, data['question'])
                question = data['question']
                session().annotate("Processing question : {}".format(question))
                result, _, _ = knowledge.process(question)

                if result != data['answer']:
                    raise AssertionError('{} is not {}'.format(result, data['answer']))

        else:
            raise NotImplementedError('Example type: {}'.format(example_type))

        print("\r\x1b[K", end='')
    return knowledge


if __name__ == '__main__':
    show_knowledge(main())