# -*- coding: utf-8 -*-
"""
@author: Laura C. Kühle

"""
import numpy.polynomial.legendre as leg


class Quadrature:
    """Class for quadrature.

    A quadrature is used to determine the approximation of a definite integral
    of a function.

    Attributes
    ----------
    num_eval_points : int
        Number of evaluation points per cell used for approximation.
    eval_points : ndarray
        Evaluation points per cell used for approximation.
    weights : ndarray
        Weights used for approximation calculation.

    Methods
    -------
    get_name()
        Returns string of class name.
    get_num_points()
        Returns number of evaluation points.
    get_eval_points()
        Returns evaluation points.
    get_weights()
        Returns evaluation weights.

    """
    def __init__(self, config):
        """Initializes Quadrature.

        Parameters
        ----------
        config : dict
            Additional parameters for quadrature.

        """
        self._reset(config)

    def _reset(self, config):
        """Resets instance variables.

        Parameters
        ----------
        config : dict
            Additional parameters for quadrature.

        """
        self._num_eval_points = None
        self._eval_points = None
        self._weights = None

    def get_name(self):
        """Returns string of class name."""
        return self.__class__.__name__

    def get_num_points(self):
        """Returns number of evaluation points."""
        return self._num_eval_points

    def get_eval_points(self):
        """Returns evaluation points."""
        return self._eval_points

    def get_weights(self):
        """Returns evaluation weights."""
        return self._weights


class Gauss(Quadrature):
    """Class for Gaussian quadrature.

    Attributes
    ----------
    num_eval_points : int
        Number of evaluation points per cell used for approximation.
    eval_points : ndarray
        Evaluation points per cell used for approximation.
    weights : ndarray
        Weights used for approximation calculation.

    Methods
    -------
    get_name()
        Returns string of class name.

    """
    def _reset(self, config):
        """Resets instance variables.

        Parameters
        ----------
        config : dict
            Additional parameters for quadrature.

        """
        super()._reset(config)

        # Unpack necessary configurations
        self._num_eval_points = config.pop('num_eval_points', 6)

        self._eval_points, self._weights = leg.leggauss(self._num_eval_points)

    def get_name(self):
        """Returns string of class name."""
        return self.__class__.__name__ + str(self._num_eval_points)