"""
Grid Case Group statistics module
"""

from rips.pdmobject import PdmObject
from rips.view import View
from rips.case import Case

import rips.generated.Commands_pb2 as Cmd


class GridCaseGroup(PdmObject):
    """ResInsight Grid Case Group class

    Operate on a ResInsight case group specified by a Case Group Id integer.

    Attributes:
        group_id (int): Grid Case Group Id corresponding to case group Id in ResInsight project.
    """
    def __init__(self, pdm_object):
        self.group_id = pdm_object.get_value("GroupId")
        PdmObject.__init__(self, pdm_object._pb2_object, pdm_object._channel, pdm_object._project)

    def create_statistics_case(self):
        """Create a Statistics case in the Grid Case Group

        Returns:
            A new Case
        """
        command_reply = self._execute_command(
            createStatisticsCase=Cmd.CreateStatisticsCaseRequest(
                caseGroupId=self.group_id))
        return Case(self.channel,
                    command_reply.createStatisticsCaseResult.caseId)

    def statistics_cases(self):
        """Get a list of all statistics cases in the Grid Case Group"""
        stat_case_collection = self.children("StatisticsCaseCollection")[0]
        return stat_case_collection.children("Reservoirs")

    def views(self):
        """Get a list of views belonging to a grid case group"""
        pdm_objects = self.descendants("ReservoirView")
        view_list = []
        for pdm_object in pdm_objects:
            view_list.append(View(pdm_object))
        return view_list

    def view(self, view_id):
        """Get a particular view belonging to a case group by providing view id
        Arguments:
            id(int): view id

        Returns: a view object

        """
        views = self.views()
        for view_object in views:
            if view_object.id == view_id:
                return view_object
        return None

    def compute_statistics(self, case_ids=None):
        """ Compute statistics for the given case ids

        Arguments:
            case_ids(list of integers): list of case ids.
            If this is None all cases in group are included

        """
        if case_ids is None:
            case_ids = []
        return self._execute_command(
            computeCaseGroupStatistics=Cmd.ComputeCaseGroupStatRequest(
                caseIds=case_ids, caseGroupId=self.group_id))
