from semanticscholar.Paper import Paper
from semanticscholar.SemanticScholarObject import SemanticScholarObject


class BaseReference(SemanticScholarObject):
    '''
    Base class for both Citation and Reference classes.
    '''

    FIELDS = [
        'contexts',
        'intents',
        'contextsWithIntent',
        'isInfluential'
    ]

    def __init__(self, data: dict) -> None:
        super().__init__()
        self._contexts = None
        self._intents = None
        self._contextsWithIntent = None
        self._isInfluential = None
        self._paper = None
        self._init_attributes(data)

    @property
    def contexts(self) -> list:
        '''
        :type: :class:`list`
        '''
        return self._contexts

    @property
    def intents(self) -> list:
        '''
        :type: :class:`list`
        '''
        return self._intents

    @property
    def contextsWithIntent(self) -> list:
        '''
        :type: :class:`list`
        '''
        return self._contextsWithIntent

    @property
    def isInfluential(self) -> bool:
        '''
        :type: :class:`bool`
        '''
        return self._isInfluential

    @property
    def paper(self) -> Paper:
        '''
        :type: :class:`semanticscholar.Paper.Paper`
        '''
        return self._paper

    def _init_attributes(self, data: dict) -> None:
        self._data = data
        if 'contexts' in data:
            self._contexts = data['contexts']
        if 'intents' in data:
            self._intents = data['intents']
        if 'contextsWithIntent' in data:
            self._contextsWithIntent = data['contextsWithIntent']
        if 'isInfluential' in data:
            self._isInfluential = data['isInfluential']