# -*- coding: utf-8 -*-
import test_engine


class TestGridRules(test_engine.EngineTestCase):
  # Helper for rules action
  def add_empty(self):
    return self.apply_user_action(['AddEmptyRule', "Table1", 0, 0])


  def set_rule(self, rule_index, formula):
    rules = self.engine.docmodel.tables.lookupOne(tableId='Table1').rawViewSectionRef.rules
    rule = list(rules)[rule_index]
    return self.apply_user_action(['UpdateRecord', '_grist_Tables_column',
                                   rule.id, {"formula": formula}])


  def remove_rule(self, rule_index):
    rules = self.engine.docmodel.tables.lookupOne(tableId='Table1').rawViewSectionRef.rules
    rule = list(rules)[rule_index]
    return self.apply_user_action(['RemoveColumn', 'Table1', rule.colId])


  def test_simple_rules(self):
    self.apply_user_action(['AddEmptyTable', None])
    self.apply_user_action(['AddRecord', "Table1", None, {"A": 1}])
    self.apply_user_action(['AddRecord', "Table1", None, {"A": 2}])
    self.apply_user_action(['AddRecord', "Table1", None, {"A": 3}])
    out_actions = self.add_empty()
    self.assertPartialOutActions(out_actions, {"stored": [
      ["AddColumn", "Table1", "gristHelper_RowConditionalRule",
       {"formula": "", "isFormula": True, "type": "Any"}],
      ["AddRecord", "_grist_Tables_column", 5,
       {"colId": "gristHelper_RowConditionalRule", "formula": "", "isFormula": True,
        "label": "gristHelper_RowConditionalRule", "parentId": 1, "parentPos": 5.0,
        "type": "Any",
        "widgetOptions": ""}],
      ["UpdateRecord", "_grist_Views_section", 2, {"rules": ["L", 5]}],
    ]})
    out_actions = self.set_rule(0, "$A == 1")
    self.assertPartialOutActions(out_actions, {"stored": [
      ["ModifyColumn", "Table1", "gristHelper_RowConditionalRule",
       {"formula": "$A == 1"}],
      ["UpdateRecord", "_grist_Tables_column", 5, {"formula": "$A == 1"}],
      ["BulkUpdateRecord", "Table1", [1, 2, 3],
       {"gristHelper_RowConditionalRule": [True, False, False]}],
    ]})

    # Replace this rule with another rule to mark A = 2
    out_actions = self.set_rule(0, "$A == 2")
    self.assertPartialOutActions(out_actions, {"stored": [
      ["ModifyColumn", "Table1", "gristHelper_RowConditionalRule",
       {"formula": "$A == 2"}],
      ["UpdateRecord", "_grist_Tables_column", 5, {"formula": "$A == 2"}],
      ["BulkUpdateRecord", "Table1", [1, 2],
       {"gristHelper_RowConditionalRule": [False, True]}],
    ]})

    # Add another rule A = 3
    self.add_empty()
    out_actions = self.set_rule(1, "$A == 3")
    self.assertPartialOutActions(out_actions, {"stored": [
      ["ModifyColumn", "Table1", "gristHelper_RowConditionalRule2",
       {"formula": "$A == 3"}],
      ["UpdateRecord", "_grist_Tables_column", 6, {"formula": "$A == 3"}],
      ["BulkUpdateRecord", "Table1", [1, 2, 3],
       {"gristHelper_RowConditionalRule2": [False, False, True]}],
    ]})

    # Remove the last rule
    out_actions = self.remove_rule(1)
    self.assertPartialOutActions(out_actions, {"stored": [
      ["RemoveRecord", "_grist_Tables_column", 6],
      ["UpdateRecord", "_grist_Views_section", 2, {"rules": ["L", 5]}],
      ["RemoveColumn", "Table1", "gristHelper_RowConditionalRule2"]
    ]})

    # Remove last rule
    out_actions = self.remove_rule(0)
    self.assertPartialOutActions(out_actions, {"stored": [
      ["RemoveRecord", "_grist_Tables_column", 5],
      ["UpdateRecord", "_grist_Views_section", 2, {"rules": None}],
      ["RemoveColumn", "Table1", "gristHelper_RowConditionalRule"]
    ]})