"""
This file is automatically generated.
Do not modify.
"""

try:
    from typing import Any, Optional, Union, List
except ImportError:
    pass

from .._helper import _omit, CrdObject, CrdObjectList, CrdClass

class Endpoint(CrdObject):
    _properties = [
        ('bucketHost', 'bucketHost', str, False, False),
        ('bucketPort', 'bucketPort', int, False, False),
        ('bucketName', 'bucketName', str, False, False),
        ('region', 'region', str, False, False),
        ('subRegion', 'subRegion', str, False, False),
        ('additionalConfig', 'additionalConfig', object, False, True)
    ]        

    def __init__(self,
                 bucketHost=_omit,  # type: Optional[str]
                 bucketPort=_omit,  # type: Optional[int]
                 bucketName=_omit,  # type: Optional[str]
                 region=_omit,  # type: Optional[str]
                 subRegion=_omit,  # type: Optional[str]
                 additionalConfig=_omit,  # type: Optional[Any]
                 ):
        super(Endpoint, self).__init__(
            bucketHost=bucketHost,
            bucketPort=bucketPort,
            bucketName=bucketName,
            region=region,
            subRegion=subRegion,
            additionalConfig=additionalConfig,
        )

    @property
    def bucketHost(self):
        # type: () -> str
        return self._property_impl('bucketHost')
    
    @bucketHost.setter
    def bucketHost(self, new_val):
        # type: (Optional[str]) -> None
        self._bucketHost = new_val
    
    @property
    def bucketPort(self):
        # type: () -> int
        return self._property_impl('bucketPort')
    
    @bucketPort.setter
    def bucketPort(self, new_val):
        # type: (Optional[int]) -> None
        self._bucketPort = new_val
    
    @property
    def bucketName(self):
        # type: () -> str
        return self._property_impl('bucketName')
    
    @bucketName.setter
    def bucketName(self, new_val):
        # type: (Optional[str]) -> None
        self._bucketName = new_val
    
    @property
    def region(self):
        # type: () -> str
        return self._property_impl('region')
    
    @region.setter
    def region(self, new_val):
        # type: (Optional[str]) -> None
        self._region = new_val
    
    @property
    def subRegion(self):
        # type: () -> str
        return self._property_impl('subRegion')
    
    @subRegion.setter
    def subRegion(self, new_val):
        # type: (Optional[str]) -> None
        self._subRegion = new_val
    
    @property
    def additionalConfig(self):
        # type: () -> Optional[Any]
        return self._property_impl('additionalConfig')
    
    @additionalConfig.setter
    def additionalConfig(self, new_val):
        # type: (Optional[Any]) -> None
        self._additionalConfig = new_val


class AuthenticationList(CrdObjectList):
    _items_type = None


class Spec(CrdObject):
    _properties = [
        ('storageClassName', 'storageClassName', str, False, False),
        ('endpoint', 'endpoint', 'Endpoint', False, True),
        ('authentication', 'authentication', 'AuthenticationList', False, True),
        ('additionalState', 'additionalState', object, False, True),
        ('reclaimPolicy', 'reclaimPolicy', str, False, False),
        ('claimRef', 'claimRef', object, False, True)
    ]        

    def __init__(self,
                 storageClassName=_omit,  # type: Optional[str]
                 endpoint=_omit,  # type: Optional[Endpoint]
                 authentication=_omit,  # type: Optional[Union[List[Any], CrdObjectList]]
                 additionalState=_omit,  # type: Optional[Any]
                 reclaimPolicy=_omit,  # type: Optional[str]
                 claimRef=_omit,  # type: Optional[Any]
                 ):
        super(Spec, self).__init__(
            storageClassName=storageClassName,
            endpoint=endpoint,
            authentication=authentication,
            additionalState=additionalState,
            reclaimPolicy=reclaimPolicy,
            claimRef=claimRef,
        )

    @property
    def storageClassName(self):
        # type: () -> str
        return self._property_impl('storageClassName')
    
    @storageClassName.setter
    def storageClassName(self, new_val):
        # type: (Optional[str]) -> None
        self._storageClassName = new_val
    
    @property
    def endpoint(self):
        # type: () -> Optional[Endpoint]
        return self._property_impl('endpoint')
    
    @endpoint.setter
    def endpoint(self, new_val):
        # type: (Optional[Endpoint]) -> None
        self._endpoint = new_val
    
    @property
    def authentication(self):
        # type: () -> Optional[Union[List[Any], CrdObjectList]]
        return self._property_impl('authentication')
    
    @authentication.setter
    def authentication(self, new_val):
        # type: (Optional[Union[List[Any], CrdObjectList]]) -> None
        self._authentication = new_val
    
    @property
    def additionalState(self):
        # type: () -> Optional[Any]
        return self._property_impl('additionalState')
    
    @additionalState.setter
    def additionalState(self, new_val):
        # type: (Optional[Any]) -> None
        self._additionalState = new_val
    
    @property
    def reclaimPolicy(self):
        # type: () -> str
        return self._property_impl('reclaimPolicy')
    
    @reclaimPolicy.setter
    def reclaimPolicy(self, new_val):
        # type: (Optional[str]) -> None
        self._reclaimPolicy = new_val
    
    @property
    def claimRef(self):
        # type: () -> Optional[Any]
        return self._property_impl('claimRef')
    
    @claimRef.setter
    def claimRef(self, new_val):
        # type: (Optional[Any]) -> None
        self._claimRef = new_val


class ObjectBucket(CrdClass):
    _properties = [
        ('spec', 'spec', 'Spec', True, False),
        ('status', 'status', object, False, False),
        ('apiVersion', 'apiVersion', str, True, False),
        ('metadata', 'metadata', object, True, False)
    ]        

    def __init__(self,
                 spec,  # type: Spec
                 apiVersion,  # type: str
                 metadata,  # type: Any
                 status=_omit,  # type: Optional[Any]
                 ):
        super(ObjectBucket, self).__init__(
            spec=spec,
            apiVersion=apiVersion,
            metadata=metadata,
            status=status,
        )

    @property
    def spec(self):
        # type: () -> Spec
        return self._property_impl('spec')
    
    @spec.setter
    def spec(self, new_val):
        # type: (Spec) -> None
        self._spec = new_val
    
    @property
    def status(self):
        # type: () -> Any
        return self._property_impl('status')
    
    @status.setter
    def status(self, new_val):
        # type: (Optional[Any]) -> None
        self._status = new_val
    
    @property
    def apiVersion(self):
        # type: () -> str
        return self._property_impl('apiVersion')
    
    @apiVersion.setter
    def apiVersion(self, new_val):
        # type: (str) -> None
        self._apiVersion = new_val
    
    @property
    def metadata(self):
        # type: () -> Any
        return self._property_impl('metadata')
    
    @metadata.setter
    def metadata(self, new_val):
        # type: (Any) -> None
        self._metadata = new_val
