#! /usr/bin/env python
'''Libraries for moving objects, trajectories...'''

import utils;

__metaclass__ = type

#class MovingObject:

class TimeInterval:
    '''Temporal interval'''
    def __init__(self, first=0, last=-1):
        self.first=first
        self.last=last

    def __str__(self):
        return '%d %d'%(self.first, self.last)

    def empty(self):
        '''
        >>> TimeInterval().empty()
        True
        >>> TimeInterval(0,1).empty()
        False
        '''
        return self.first > self.last

    def length(self):
        '''Returns the length of the interval
        
        >>> TimeInterval(0,1).length()
        2
        >>> TimeInterval(10,8).length()
        0
        '''
        return max(0,self.last-self.first+1)

    def getList(self):
        return [self.first, self.last]

    def contains(self, instant):
        return (self.first<=instant and self.last>=instant)

    def inside(self, interval2):
        'indicates if the temporal interval of self is comprised in interval2'
        return (self.first >= interval2.first) and (self.last <= interval2.last)

    def union(self, interval2):
        '''Largest interval comprising self and interval2'''
        return TimeInterval(min(self.first, interval2.first), max(self.last, interval2.last))
        
    def intersection(self, interval2):
        '''Largest interval comprising self and interval2'''
        return TimeInterval(max(self.first, interval2.first), min(self.last, interval2.last))

class STObject:
    '''Class for spatio-temporal object
    i.e. with temporal and spatial existence 
    (time interval and bounding polygon for positions (e.g. rectangle)).
    It does not mean that the object is defined 
    for all time instants within the time interval'''

    def __init__(self, timeInterval = TimeInterval(), boundingPolygon = None, num = None):
        self.timeInterval = timeInterval
        self.boundingPolygon = boundingPolygon
        self.num = num

    def empty(self):
        return self.timeInterval.empty()

    def getFirstInstant(self):
        return self.timeInterval.first()

    def getLastInstant(self):
        return self.timeInterval.first()

    
        
# return bounding box, and generic polygon, that defaults to box

class Trajectory(STObject):
    '''Class for trajectories
    i.e. a temporal sequence of positions'''
    pass


class TemporalIndicator:
    '''Class for temporal indicators
    i.e. indicators that take a value at specific instants'''
    pass


if __name__ == "__main__":
    import doctest
    import unittest
    #suite = doctest.DocFileSuite('tests/ubc_utils.txt')
    suite = doctest.DocTestSuite()
    unittest.TextTestRunner().run(suite)
    #doctest.testmod()
    #doctest.testfile("example.txt")
