# FSx for Windows File Server =================================================

# Security Group ---------------------------------------------------------------

resource "aws_security_group" "fsx" {
  name        = "${var.name}-sg"
  description = "Controls SMB access to FSx for Windows File Server: ${var.name}."
  vpc_id      = var.vpc_id

  tags = merge(local.tags, { Name = "${var.name}-sg" })
}

resource "aws_vpc_security_group_ingress_rule" "smb_sg" {
  for_each = toset(var.allowed_security_group_ids)

  security_group_id            = aws_security_group.fsx.id
  description                  = "SMB from ${each.value}."
  from_port                    = 445
  to_port                      = 445
  ip_protocol                  = "tcp"
  referenced_security_group_id = each.value

  tags = local.tags
}

resource "aws_vpc_security_group_ingress_rule" "smb_cidr" {
  for_each = toset(var.allowed_cidr_blocks)

  security_group_id = aws_security_group.fsx.id
  description       = "SMB from ${each.value}."
  from_port         = 445
  to_port           = 445
  ip_protocol       = "tcp"
  cidr_ipv4         = each.value

  tags = local.tags
}

resource "aws_vpc_security_group_egress_rule" "all" {
  security_group_id = aws_security_group.fsx.id
  description       = "Allow all egress."
  ip_protocol       = "-1"
  cidr_ipv4         = "0.0.0.0/0"

  tags = local.tags
}

# Filesystem -------------------------------------------------------------------

resource "aws_fsx_windows_file_system" "this" {
  storage_capacity                  = var.storage_capacity_gb
  storage_type                      = var.storage_type
  throughput_capacity               = var.throughput_capacity_mbps
  subnet_ids                        = var.subnet_ids
  preferred_subnet_id               = local.preferred_subnet_id
  deployment_type                   = var.deployment_type
  security_group_ids                = [aws_security_group.fsx.id]
  kms_key_id                        = var.kms_key_id
  automatic_backup_retention_days   = var.automatic_backup_retention_days
  daily_automatic_backup_start_time = var.automatic_backup_retention_days > 0 ? var.daily_automatic_backup_start_time : null
  weekly_maintenance_start_time     = var.weekly_maintenance_start_time
  copy_tags_to_backups              = var.copy_tags_to_backups
  aliases                           = var.dns_aliases

  # FSx for Windows requires AD for authentication. Managed AD is not supported
  # in this module — use self-managed AD (on-prem or EC2-hosted).
  self_managed_active_directory {
    domain_name                            = var.active_directory.domain_name
    dns_ips                                = var.active_directory.dns_ips
    username                               = var.active_directory.username
    password                               = var.active_directory.password
    organizational_unit_distinguished_name = var.active_directory.organizational_unit_distinguished_name
    file_system_administrators_group       = var.active_directory.file_system_administrators_group
  }

  dynamic "audit_log_configuration" {
    for_each = local.audit_log_enabled ? [1] : []
    content {
      audit_log_destination             = var.audit_log_destination_arn
      file_access_audit_log_level       = var.file_access_audit_log_level
      file_share_access_audit_log_level = var.file_share_access_audit_log_level
    }
  }

  tags = merge(local.tags, { Name = var.name })

  lifecycle {
    # FSx filesystems contain live data — prevent accidental destroy.
    # Remove this lifecycle block only when decommissioning intentionally.
    prevent_destroy = true
  }
}

