# #
# #

#
# Method for performing a DAF time query where all parameter/level/location
# combinations must be available at the same time.
#
#
#
#     SOFTWARE HISTORY
#
#    Date            Ticket#       Engineer       Description
#    ------------    ----------    -----------    --------------------------
#    06/22/16         #5591        bsteffen       Initial Creation.
#

from awips.dataaccess import DataAccessLayer

def getAvailableTimes(request, refTimeOnly=False):
    return __getAvailableTimesForEachParameter(request, refTimeOnly)

def __getAvailableTimesForEachParameter(request, refTimeOnly=False):
    parameters = request.getParameters()
    if parameters:
        times = None
        for parameter in parameters:
            specificRequest = __cloneRequest(request)
            specificRequest.setParameters(parameter)
            specificTimes = __getAvailableTimesForEachLevel(specificRequest, refTimeOnly)
            if times is None:
                times = specificTimes
            else:
                times.intersection_update(specificTimes)
            if not times:
                break
        return times
    else:
        return __getAvailableTimesForEachLevel(request, refTimeOnly)

def __getAvailableTimesForEachLevel(request, refTimeOnly=False):
    levels = request.getLevels()
    if levels:
        times = None
        for level in levels:
            specificRequest = __cloneRequest(request)
            specificRequest.setLevels(level)
            specificTimes = __getAvailableTimesForEachLocation(specificRequest, refTimeOnly)
            if times is None:
                times = specificTimes
            else:
                times.intersection_update(specificTimes)
            if not times:
                break
        return times
    else:
        return __getAvailableTimesForEachLocation(request, refTimeOnly)

def __getAvailableTimesForEachLocation(request, refTimeOnly=False):
    locations = request.getLocationNames()
    if locations:
        times = None
        for location in locations:
            specificRequest = __cloneRequest(request)
            specificRequest.setLocationNames(location)
            specificTimes = DataAccessLayer.getAvailableTimes(specificRequest, refTimeOnly)
            if times is None:
                times = set(specificTimes)
            else:
                times.intersection_update(specificTimes)
            if not times:
                break
        return times
    else:
        return DataAccessLayer.getAvailableTimes(request, refTimeOnly)


def __cloneRequest(request):
    return DataAccessLayer.newDataRequest(datatype      = request.getDatatype(),
                                          parameters    = request.getParameters(),
                                          levels        = request.getLevels(),
                                          locationNames = request.getLocationNames(),
                                          envelope      = request.getEnvelope(),
                                          **request.getIdentifiers())
