"""
Validation for Chemistry
Q=9/10
"""

class ValidationChemistry:
    def __init__(self):
        self.accepted_elements = ['H', 'O', 'C', 'N']
        self.element_counts = {}

    @staticmethod
    def is_valid_formula(formula):
        if not formula:
            return False
        elements = set()
        for char in formula:
            if char.isupper():
                element_name = char
                elements.add(element_name)
            elif char.isdigit() or char == '(' or char == ')' or char.islower():
                pass  # Allow digits, lower case letters and brackets as part of the formula structure.
            else:
                return False
        for element in elements:
            if element not in ValidationChemistry.accepted_elements:
                return False
        return True

    def add_formula(self, formula):
        if self.is_valid_formula(formula):
            self._update_element_counts(formula)
        else:
            raise ValueError(f"Invalid formula: {formula}")

    def _update_element_counts(self, formula):
        stack = []
        current_multiplier = 1
        i = 0

        while i < len(formula):
            if formula[i].isalpha():
                element_name = formula[i]
                if element_name not in self.element_counts:
                    self.element_counts[element_name] = 0
                self.element_counts[element_name] += current_multiplier * (formula[i:i+2] == "H2" and 2 or 1)