from samtranslator.model import PropertyType, Resource
from samtranslator.model.types import is_type, is_str, any_type
from samtranslator.model.intrinsics import ref, fnGetAtt


class S3Bucket(Resource):
    resource_type = 'AWS::S3::Bucket'
    property_types = {
            'AccessControl': PropertyType(False, any_type()),
            'AccelerateConfiguration': PropertyType(False, any_type()),
            'AnalyticsConfigurations': PropertyType(False, any_type()),
            'BucketEncryption': PropertyType(False, any_type()),
            'BucketName': PropertyType(False, is_str()),
            'CorsConfiguration': PropertyType(False, any_type()),
            'InventoryConfigurations': PropertyType(False, any_type()),
            'LifecycleConfiguration': PropertyType(False, any_type()),
            'LoggingConfiguration': PropertyType(False, any_type()),
            'MetricsConfigurations': PropertyType(False, any_type()),
            'NotificationConfiguration': PropertyType(False, is_type(dict)),
            'PublicAccessBlockConfiguration': PropertyType(False, is_type(dict)),
            'ReplicationConfiguration': PropertyType(False, any_type()),
            'Tags': PropertyType(False, is_type(list)),
            'VersioningConfiguration': PropertyType(False, any_type()),
            'WebsiteConfiguration': PropertyType(False, any_type()),
    }

    runtime_attrs = {
        "name": lambda self: ref(self.logical_id),
        "arn": lambda self: fnGetAtt(self.logical_id, "Arn")
    }
