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

from tools import trace, timer


class Section(object):
    def __init__(self, name:str = "", status = None):
        super(Section, self).__init__()

        self._status = status

        self._name = name
        self._edge = None
        self._begin_kp = 0.0
        self._end_kp = 0.0
        self._begin_strickler = None
        self._end_strickler = None

    @property
    def name(self):
        return self._name

    @name.setter
    def name(self, name):
        self._name = name
        self._status.modified()

    @property
    def edge(self):
        return self._edge

    @edge.setter
    def edge(self, edge):
        self._edge = edge
        if (edge is not None and
            self._begin_kp == 0.0 and
            self._end_kp == 0.0):
            self._begin_kp = self._edge.reach.get_kp_min()
            self._end_kp = self._edge.reach.get_kp_max()
        self._status.modified()

    def has_edge(self):
        return self._edge is not None

    @property
    def begin_kp(self):
        return self._begin_kp

    @begin_kp.setter
    def begin_kp(self, begin_kp):
        if self._edge is None:
            self._begin_kp = begin_kp
        else:
            _min = self._edge.reach.get_kp_min()
            _max = self._edge.reach.get_kp_max()

            if _min <= begin_kp <= _max:
                self._begin_kp = begin_kp

        self._status.modified()

    @property
    def end_kp(self):
        return self._end_kp

    @end_kp.setter
    def end_kp(self, end_kp):
        if self._edge is None:
            self._end_kp = end_kp
        else:
            _min = self._edge.reach.get_kp_min()
            _max = self._edge.reach.get_kp_max()

            if _min <= end_kp <= _max:
                self._end_kp = end_kp

        self._status.modified()

    @property
    def begin_strickler(self):
        return self._begin_strickler

    @begin_strickler.setter
    def begin_strickler(self, strickler):
        self._begin_strickler = strickler
        self._status.modified()

    @property
    def end_strickler(self):
        return self._end_strickler

    @end_strickler.setter
    def end_strickler(self, strickler):
        self._end_strickler = strickler
        self._status.modified()