class ResourceMetaData(object):
    def __init__(self, checksum, virtual_size, size):
        self.size = size
        self.virtual_size = virtual_size
        self.checksum = checksum

    def as_dict(self):
        return self.__dict__


class ResourceStatusModel(object):
    def __init__(self,
                 timestamp,
                 region,
                 status,
                 transaction_id,
                 resource_id,
                 ord_notifier,
                 err_msg,
                 err_code,
                 operation,
                 resource_extra_metadata=None):
        self.timestamp = timestamp
        self.region = region
        self.status = status
        self.ord_transaction_id = transaction_id
        self.resource_id = resource_id
        self.ord_notifier_id = ord_notifier
        self.error_msg = err_msg
        self.error_code = err_code
        self.operation = operation

        if resource_extra_metadata:
            self.resource_extra_metadata = ResourceMetaData(
                checksum=resource_extra_metadata[0].checksum,
                virtual_size=resource_extra_metadata[0].virtual_size,
                size=resource_extra_metadata[0].size)
        else:
            self.resource_extra_metadata = None

    def as_dict(self):
        return self.__dict__


class StatusModel(object):
    def __init__(self, status):
        self.regions = status
        self.status = self._get_aggregated_status()

    def _get_aggregated_status(self):
        is_pending = False
        for region in self.regions:
            if (region.status == 'Error'
                    and region.operation.strip() != 'delete'):
                # If a region had an error, the aggregated status is 'Error'
                return 'Error'
            elif region.status == 'Submitted':
                # Just set the flag but don't return, because there might be
                # an error in any of the next iterations
                is_pending = True

        if is_pending:
            return 'Pending'
        else:
            # If self.regions is empty, the result will still be
            # 'Success' but the server returns 404 Not Found
            return 'Success'