#  Copyright 2016-2026. Couchbase, Inc.
#  All Rights Reserved.
#
#  Licensed under the Apache License, Version 2.0 (the "License")
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

from abc import ABC, abstractmethod
from typing import Any, Mapping


class ValueRecorder(ABC):
    """
    This is an abstract base class intended to wrap an external recorder implementation, to use withing the
    python client.  You will want to create a class deriving from this, which implements the :meth:`record_value`
    method.
    """

    @abstractmethod
    def record_value(self, value: int) -> None:
        """
        This method will need to be implemented in derived classes.

        Args:
            value (int): The value to record.

        """
        pass


class Meter(ABC):
    """
    This is an abstract base class intended to wrap an external meter implementation, to use withing the
    python client.  You will want to create a class deriving from this, which implements the :meth:`value_recorder`
    method.
    """

    @abstractmethod
    def value_recorder(self, name: str, tags: Mapping[str, Any]) -> ValueRecorder:
        """
        This method will need to be implemented in derived classes.

        Args:
            name (int): The name of the recorder.
            tags (Mapping[str, str]): The tags associated with the recorder.

        Returns:
            :class:`~couchbase.observability.metrics.ValueRecorder`:
        """
        pass
