# SDK Pullenti Lingvo, version 4.33, fabruary 2026. Copyright (c) 2013-2026, Pullenti. All rights reserved.
# Non-Commercial Freeware and Commercial Software.
# This class is generated using the converter Unisharping (www.unisharping.ru) from Pullenti C# project.
# The latest version of the code is available on the site www.pullenti.ru

import io
from pullenti.unisharp.Utils import Utils

from pullenti.ner.core.ReferentsEqualType import ReferentsEqualType
from pullenti.ner.metadata.ReferentClass import ReferentClass
from pullenti.ner.date.DateReferent import DateReferent
from pullenti.ner.link.LinkType import LinkType
from pullenti.ner.link.MetaLink import MetaLink
from pullenti.ner.Referent import Referent

class LinkReferent(Referent):
    """ Связь сущностей """
    
    def __init__(self) -> None:
        super().__init__(LinkReferent.OBJ_TYPENAME)
        self.instance_of = MetaLink.GLOBAL_META
    
    OBJ_TYPENAME = "LINK"
    """ Имя типа сущности TypeName ("LINK") """
    
    ATTR_TYPE = "TYPE"
    """ Имя атрибута - тип связи """
    
    ATTR_PARAM = "PARAM"
    """ Имя атрибута - параметр связи (если есть) """
    
    ATTR_OBJECT1 = "OBJECT1"
    """ Имя атрибута - ссылка на первую сущность связи """
    
    ATTR_OBJECT2 = "OBJECT2"
    """ Имя атрибута - ссылка на вторую сущность связи """
    
    ATTR_DATEFROM = "DATEFROM"
    """ Имя атрибута - дата начала """
    
    ATTR_DATETO = "DATETO"
    """ Имя атрибута - дата окончания """
    
    @property
    def typ(self) -> 'LinkType':
        """ Тип связи """
        str0_ = self.get_string_value(LinkReferent.ATTR_TYPE)
        if (str0_ is None): 
            return LinkType.UNDEFINED
        try: 
            return Utils.valToEnum(str0_, LinkType)
        except Exception as ex2310: 
            pass
        return LinkType.UNDEFINED
    @typ.setter
    def typ(self, value) -> 'LinkType':
        self.add_slot(LinkReferent.ATTR_TYPE, Utils.enumToString(value).lower(), True, 0)
        return value
    
    @property
    def typ_string(self) -> str:
        """ Тип связи (расшифровка) """
        val = self.get_string_value(LinkReferent.ATTR_TYPE)
        if (val is None): 
            return None
        res = Utils.ifNotNull(MetaLink.TYPES.convert_inner_value_to_outer_value(val, None), val)
        return res.lower()
    
    @property
    def param(self) -> str:
        """ Дополнительный параметр связи (например, для работы это должность) """
        return self.get_string_value(LinkReferent.ATTR_PARAM)
    @param.setter
    def param(self, value) -> str:
        self.add_slot(LinkReferent.ATTR_PARAM, value, True, 0)
        return value
    
    @property
    def parent_referent(self) -> 'Referent':
        return self.object1
    
    @property
    def object1(self) -> 'Referent':
        """ Ссылка на первую сущность """
        return Utils.asObjectOrNull(self.get_slot_value(LinkReferent.ATTR_OBJECT1), Referent)
    @object1.setter
    def object1(self, value) -> 'Referent':
        self.add_slot(LinkReferent.ATTR_OBJECT1, value, True, 0)
        return value
    
    @property
    def object2(self) -> 'Referent':
        """ Ссылка на вторую сущность """
        return Utils.asObjectOrNull(self.get_slot_value(LinkReferent.ATTR_OBJECT2), Referent)
    @object2.setter
    def object2(self, value) -> 'Referent':
        self.add_slot(LinkReferent.ATTR_OBJECT2, value, True, 0)
        return value
    
    @property
    def date_from(self) -> 'DateReferent':
        """ Дата начала связи """
        return Utils.asObjectOrNull(self.get_slot_value(LinkReferent.ATTR_DATEFROM), DateReferent)
    @date_from.setter
    def date_from(self, value) -> 'DateReferent':
        self.add_slot(LinkReferent.ATTR_DATEFROM, value, True, 0)
        return value
    
    @property
    def date_to(self) -> 'DateReferent':
        """ Дата окончания связи """
        return Utils.asObjectOrNull(self.get_slot_value(LinkReferent.ATTR_DATETO), DateReferent)
    @date_to.setter
    def date_to(self, value) -> 'DateReferent':
        self.add_slot(LinkReferent.ATTR_DATETO, value, True, 0)
        return value
    
    def to_string_ex(self, short_variant : bool, lang : 'MorphLang'=None, lev : int=0) -> str:
        tmp = io.StringIO()
        if (self.typ != LinkType.UNDEFINED): 
            print("{0}".format(MetaLink.TYPES.convert_inner_value_to_outer_value(self.get_string_value(LinkReferent.ATTR_TYPE), None)), end="", file=tmp, flush=True)
        if (self.param is not None): 
            if (tmp.tell() > 0): 
                print(", ", end="", file=tmp)
            print(self.param, end="", file=tmp)
        if (self.date_from is not None and self.date_to is not None): 
            if (tmp.tell() > 0): 
                print(", ", end="", file=tmp)
            if (self.date_from == self.date_to): 
                print(self.date_from.to_string_ex(True, None, 0), end="", file=tmp)
            else: 
                print("с {0} по {1}".format(self.date_from.to_string_ex(True, None, 0), self.date_to.to_string_ex(True, None, 0)), end="", file=tmp, flush=True)
        elif (self.date_from is not None): 
            if (tmp.tell() > 0): 
                print(", ", end="", file=tmp)
            print("с {0}".format(self.date_from.to_string_ex(True, None, 0)), end="", file=tmp, flush=True)
        elif (self.date_to is not None): 
            if (tmp.tell() > 0): 
                print(", ", end="", file=tmp)
            print("по {0}".format(self.date_to.to_string_ex(True, None, 0)), end="", file=tmp, flush=True)
        if (self.object2 is not None and not short_variant): 
            if (tmp.tell() > 0): 
                print(", ", end="", file=tmp)
            print(self.object2.to_string_ex(True, None, 0), end="", file=tmp)
        return Utils.toStringStringIO(tmp)
    
    def can_be_equals(self, obj : 'Referent', typ_ : 'ReferentsEqualType'=ReferentsEqualType.WITHINONETEXT) -> bool:
        lr = Utils.asObjectOrNull(obj, LinkReferent)
        if (lr is None): 
            return False
        if (lr.object1 != self.object1 or lr.object2 != self.object2): 
            return False
        return True
    
    @staticmethod
    def _new2298(_arg1 : 'Referent', _arg2 : 'Referent') -> 'LinkReferent':
        res = LinkReferent()
        res.object1 = _arg1
        res.object2 = _arg2
        return res
    
    @staticmethod
    def _new2299(_arg1 : 'LinkType', _arg2 : 'Referent', _arg3 : 'Referent') -> 'LinkReferent':
        res = LinkReferent()
        res.typ = _arg1
        res.object1 = _arg2
        res.object2 = _arg3
        return res
    
    @staticmethod
    def _new2300(_arg1 : 'LinkType', _arg2 : 'Referent') -> 'LinkReferent':
        res = LinkReferent()
        res.typ = _arg1
        res.object2 = _arg2
        return res
    
    @staticmethod
    def _new2306(_arg1 : 'Referent', _arg2 : 'Referent', _arg3 : 'LinkType') -> 'LinkReferent':
        res = LinkReferent()
        res.object1 = _arg1
        res.object2 = _arg2
        res.typ = _arg3
        return res
    
    @staticmethod
    def _new2307(_arg1 : 'Referent') -> 'LinkReferent':
        res = LinkReferent()
        res.object1 = _arg1
        return res