# -*- coding: utf-8 -*-

from Model.Except import NotImplementedMethodeError

class Profile(object):
    def __init__(self, num: int = 0,
                 kp:float = 0.0, name:str = "",
                 code1: int = 0, code2: int = 0,
                 _type:str = "", reach = None):
        super(Profile, self).__init__()

        self._num = int(num)
        self._code1 = int(code1)
        self._code2 = int(code2)
        self._kp = float(kp)
        self._name = str(name)
        self._reach = reach

        self._points: List[Point] = []

        self._profile_type = _type

    @property
    def reach(self):
        return self._reach

    @property
    def num(self):
        """
        Returns:
            Number of profile.
        """
        return self._num

    @num.setter
    def num(self, value: int):
        self._num = int(value)

    @property
    def code1(self):
        """
        Returns:
            Interpolation code 1.
        """
        return self._code1

    @code1.setter
    def code1(self, value: int):
        self._code1 = int(value)

    @property
    def code2(self):
        """
        Returns:
            Interpolation code 2.
        """
        return self._code2

    @code2.setter
    def code2(self, value: int):
        self._code2 = int(value)

    @property
    def nb_points(self):
        return len(self._points)

    @property
    def kp(self):
        """
        Returns:
            Kilometer point.
        """
        return self._kp

    @kp.setter
    def kp(self, value: float):
        self._kp = float(value)

    @property
    def name(self):
        """
        Returns:
            Profile name.
        """
        return self._name

    @name.setter
    def name(self, value: str):
        self._name = value.strip()

    @property
    def profile_type(self):
        """
        Returns:
            Profile type.
        """
        return self._profile_type

    @profile_type.setter
    def profile_type(self, value: str):
        self._profile_type = value


    def named_points(self):
        """List of named point

        Returns:
            The list of named point
        """
        return [point for point in self._points
                if point.point_is_named()]

    # Abstract method, must be implemented for in non abstract class
    def get_station(self):
        raise NotImplementedMethodeError(self, self.get_station)