#!/usr/bin/env python3


def procedures(Model):
    prods = []

    proc_start = Model.productionstring(
        name="proc_start",
        string="""
        =g>
        isa         math_goal
        proc        =proc
        op          None
        nextop      None
        ?retrieval>
        state       free
        ?imaginal>
        state       free
        ==>
        =g>
        isa         math_goal
        op          retrieve_task
        +retrieval>
        isa         procedure
        proc        =proc

    """,
    )
    prods.append(proc_start)

    proc_start_task1 = Model.productionstring(
        name="proc_start_task1",
        string="""
        =g>
        isa         math_goal
        proc        =proc
        op          retrieve_task
        nextop      None
        result1     None
        =retrieval>
        isa         procedure
        proc        =proc
        op1         =op
        arg1_1      =arg1
        arg1_2      =arg2
        arg1_1_idx      =arg1_idx
        arg1_2_idx      =arg2_idx
        ==>
        =g>
        isa         math_goal
        proc        =proc
        task        1
        op          check_if_number_arg1_start
        nextop      =op
        arg1        =arg1
        arg2        =arg2
        arg1_idx      =arg1_idx
        arg2_idx      =arg2_idx
        result      None
        expand_slot None
        hundreds1   None
        tens1       None
        ones1       None
        hundreds2   None
        tens2       None
        ones2       None
        hundreds_ans    None
        tens_ans    None
        ones_ans    None
        mul_counter None
        ones_carry  None
        tens_carry  None
    """,
    )
    prods.append(proc_start_task1)

    proc_check_substitute_var1 = Model.productionstring(
        name="proc_substitute_var1",
        string="""
        =g>
        isa         math_goal
        arg1        ~None
        arg1        =arg1
        op          check_if_number_arg1_start
        ==>
        +retrieval>
        isa         number
        number      =arg1
        =g>
        isa         math_goal
        op          check_if_number_arg1
        """
    )

    proc_check_substitute_var1_number = Model.productionstring(
        name="proc_substitute_var1_number",
        string="""
        =g>
        isa         math_goal
        arg1        =arg1
        op          check_if_number_arg1
        =retrieval>
        isa         number
        number      =arg1
        ==>
        =g>
        isa         math_goal
        op          check_if_number_arg2_start
        ~retrieval>
        """
    )

    proc_check_substitute_var1_error = Model.productionstring(
        name="proc_substitute_var1_error",
        string="""
        =g>
        isa         math_goal
        arg1        =arg1
        op          check_if_number_arg1
        nextop      =op
        ?retrieval>
        state       error
        ==>
        =g>
        isa         math_goal
        op          vis_find_arg1
        """
    )

    # direct cont from chech var1
    proc_check_substitute_var2_alt = Model.productionstring(
        name="proc_substitute_var2_alt",
        string="""
        =g>
        isa         math_goal
        arg2        ~None
        arg2        =arg2
        op          check_if_number_arg2_start
        ==>
        +retrieval>
        isa         number
        number      =arg2
        =g>
        isa         math_goal
        op          check_if_number_arg2
        """
    )

    # proc_check_substitute_var2 = Model.productionstring(
    #     name="proc_substitute_var2",
    #     string="""
    #     =g>
    #     isa         math_goal
    #     arg2        ~None
    #     arg2        =arg2
    #     op          =op
    #     nextop      None
    #     ==>
    #     +retrieval>
    #     isa         number
    #     number      =arg2
    #     =g>
    #     isa         math_goal
    #     op          check_if_number_arg2
    #     nextop      =op
    #     """
    # )

    proc_check_substitute_var2_number = Model.productionstring(
        name="proc_substitute_var2_number",
        string="""
        =g>
        isa         math_goal
        arg2        =arg2
        op          check_if_number_arg2
        nextop      =op
        =retrieval>
        isa         number
        number      =arg2
        ==>
        =g>
        isa         math_goal
        op          =op
        nextop      None
        ~retrieval>
        """
    )

    proc_check_substitute_var2_error = Model.productionstring(
        name="proc_substitute_var2_error",
        string="""
        =g>
        isa         math_goal
        arg2        =arg2
        op          check_if_number_arg2
        nextop      =op
        ?retrieval>
        state       error
        ==>
        =g>
        isa         math_goal
        op          vis_find_arg2
        ~retrieval>
        """
    )

    proc_harvest_task1 = Model.productionstring(
        name="proc_harvest_task1",
        string="""
        =g>
        isa         math_goal
        proc        =proc
        task        1
        op          done
        nextop      None
        =imaginal>
        isa         math_op
        ?retrieval>
        state       free
        ==>
        =g>
        isa         math_goal
        op          harvest1
        +retrieval>
        isa         procedure
        proc        =proc
    """,
    )

    proc_harvest_task1_done = Model.productionstring(
        name="proc_harvest_task1_done",
        string="""
        =g>
        isa         math_goal
        proc        =proc
        task        1
        op          harvest1
        nextop      None
        result2     =result2
        =imaginal>
        isa         math_op
        result      =result1
        =retrieval>
        isa         procedure
        proc        =proc
        op1         =op1
        op2         =op2
        ==>
        =g>
        isa         math_goal
        proc        =proc
        op          None
        nextop      None
        result1     =result1
        result2     =result2
        ~retrieval>
    """,
    )

    proc_substitute_result1_left = Model.productionstring(
        name="proc_substitute_result1_left",
        string="""
        =g>
        isa         math_goal
        arg1        result1
        result1     ~None
        result1     =result1
        ==>
        =g>
        isa         math_goal
        arg1        =result1
        """
    )

    proc_substitute_result1_right = Model.productionstring(
        name="proc_substitute_result1_right",
        string="""
        =g>
        isa         math_goal
        arg2        result1
        result1     ~None
        result1     =result1
        ==>
        =g>
        isa         math_goal
        arg2        =result1
        """
    )

    proc_start_task2 = Model.productionstring(
        name="proc_start_task2",
        string="""
        =g>
        isa         math_goal
        proc        =proc
        op          retrieve_task
        nextop      None
        result1     ~None
        result2     None
        =retrieval>
        isa         procedure
        proc        =proc
        op2         =op
        arg2_1      =arg1
        arg2_2      =arg2
        arg2_1_idx      =arg1_idx
        arg2_2_idx      =arg2_idx
        ==>
        =g>
        isa         math_goal
        proc        =proc
        task        2
        nextop          =op
        op          check_if_number_arg2_start
        arg1        =arg1
        arg2        =arg2
        arg1_idx      =arg1_idx
        arg2_idx      =arg2_idx
        result      None
        expand_slot None
        hundreds1   None
        tens1       None
        ones1       None
        hundreds2   None
        tens2       None
        ones2       None
        hundreds_ans    None
        tens_ans    None
        ones_ans    None
        mul_counter None
        ones_carry  None
        tens_carry  None
    """,
    )
    prods.append(proc_start_task2)

    proc_harvest_task2 = Model.productionstring(
        name="proc_harvest_task2",
        string="""
        =g>
        isa         math_goal
        proc        =proc
        task        2
        op          done
        nextop      None
        =imaginal>
        isa         math_op
        ?retrieval>
        state       free
        ==>
        =g>
        isa         math_goal
        op          harvest2
        +retrieval>
        isa         procedure
        proc        =proc
    """,
    )

    proc_harvest_task2_done = Model.productionstring(
        name="proc_harvest_task2_done",
        string="""
        =g>
        isa         math_goal
        proc        =proc
        task        2
        op          harvest2
        nextop      None
        result1     =result1
        =imaginal>
        isa         math_op
        result      =result2
        =retrieval>
        isa         procedure
        proc        =proc
        op1         =op1
        arg1_1      =arg1_1
        arg1_2      =arg1_2
        op2         =op2
        arg2_1      =arg2_1
        arg2_2      =arg2_2
        ==>
        =g>
        isa         math_goal
        proc        =proc
        op          type_ans
        nextop      None
        result1     =result1
        result2     =result2
        ~retrieval>
    """,
    )