/*
 * Copyright (c) 2024, Sam Atkins <atkinssj@serenityos.org>
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#pragma once

#include <AK/FlyString.h>
#include <LibWeb/CSS/StyleValues/StyleValue.h>

namespace Web::CSS {

struct CounterDefinition {
    FlyString name;
    bool is_reversed;
    ValueComparingRefPtr<StyleValue const> value;
};

/**
 * Holds a list of CounterDefinitions.
 * Shared between counter-increment, counter-reset, and counter-set properties that have (almost) identical grammar.
 */
class CounterDefinitionsStyleValue : public StyleValueWithDefaultOperators<CounterDefinitionsStyleValue> {
public:
    static ValueComparingNonnullRefPtr<CounterDefinitionsStyleValue const> create(Vector<CounterDefinition> counter_definitions)
    {
        return adopt_ref(*new (nothrow) CounterDefinitionsStyleValue(move(counter_definitions)));
    }
    virtual ~CounterDefinitionsStyleValue() override = default;

    auto const& counter_definitions() const { return m_counter_definitions; }
    virtual void serialize(StringBuilder&, SerializationMode) const override;
    virtual ValueComparingNonnullRefPtr<StyleValue const> absolutized(ComputationContext const&) const override;

    bool properties_equal(CounterDefinitionsStyleValue const& other) const;

    virtual bool is_computationally_independent() const override
    {
        return all_of(m_counter_definitions, [](auto const& definition) { return !definition.value || definition.value->is_computationally_independent(); });
    }

private:
    explicit CounterDefinitionsStyleValue(Vector<CounterDefinition> counter_definitions)
        : StyleValueWithDefaultOperators(Type::CounterDefinitions)
        , m_counter_definitions(move(counter_definitions))
    {
    }

    Vector<CounterDefinition> m_counter_definitions;
};

}
