# SQS Queue for file upload events
resource "aws_sqs_queue" "files_uploaded_queue" {
  name = "humand-files-uploaded-queue-${var.env}"

  visibility_timeout_seconds = 60
  message_retention_seconds  = 1209600 # 14 days
  receive_wait_time_seconds  = 1

  redrive_policy = jsonencode({
    deadLetterTargetArn = aws_sqs_queue.files_uploaded_dlq.arn
    maxReceiveCount     = 3
  })

  tags = {
    Environment = var.env
    Service     = "transcoding"
    QueueType   = "files-uploaded"
  }
}

# Dead Letter Queue for files uploaded queue
resource "aws_sqs_queue" "files_uploaded_dlq" {
  name = "humand-files-uploaded-dlq-${var.env}"

  message_retention_seconds = 1209600 # 14 days

  tags = {
    Environment = var.env
    Service     = "transcoding"
    QueueType   = "files-uploaded-dlq"
  }
}

# SQS Queue for transcode jobs (separate from worker queue for faster processing)
resource "aws_sqs_queue" "transcode_jobs_queue" {
  name = "humand-transcode-jobs-queue-${var.env}.fifo"

  visibility_timeout_seconds = 60
  message_retention_seconds  = 1209600 # 14 days
  receive_wait_time_seconds  = 20      # Long polling for cost efficiency

  # FIFO queue configuration
  fifo_queue                  = true
  content_based_deduplication = true

  redrive_policy = jsonencode({
    deadLetterTargetArn = aws_sqs_queue.transcode_jobs_dlq.arn
    maxReceiveCount     = 3
  })

  tags = {
    Environment = var.env
    Service     = "transcoding"
    QueueType   = "transcode-jobs"
  }
}

# Dead Letter Queue for transcode jobs
resource "aws_sqs_queue" "transcode_jobs_dlq" {
  name = "humand-transcode-jobs-dlq-${var.env}.fifo"

  message_retention_seconds = 1209600 # 14 days

  # FIFO queue configuration
  fifo_queue                  = true
  content_based_deduplication = true

  tags = {
    Environment = var.env
    Service     = "transcoding"
    QueueType   = "transcode-jobs-dlq"
  }
}

# SQS Queue for transcode notifications (MediaConvert webhooks)
resource "aws_sqs_queue" "transcode_notifications_queue" {
  name = "humand-transcode-notifications-queue-${var.env}"

  visibility_timeout_seconds = 60
  message_retention_seconds  = 1209600 # 14 days
  receive_wait_time_seconds  = 1

  redrive_policy = jsonencode({
    deadLetterTargetArn = aws_sqs_queue.transcode_notifications_dlq.arn
    maxReceiveCount     = 3
  })

  tags = {
    Environment = var.env
    Service     = "transcoding"
    QueueType   = "transcode-notifications"
  }
}

# Dead Letter Queue for transcode notifications
resource "aws_sqs_queue" "transcode_notifications_dlq" {
  name = "humand-transcode-notifications-dlq-${var.env}"

  message_retention_seconds = 1209600 # 14 days

  tags = {
    Environment = var.env
    Service     = "transcoding"
    QueueType   = "transcode-notifications-dlq"
  }
}

# SSM Parameters for queue URLs
resource "aws_ssm_parameter" "files_uploaded_queue_url" {
  name  = "/common/sqs/files-uploaded/queue-url"
  type  = "SecureString"
  value = aws_sqs_queue.files_uploaded_queue.url
}

resource "aws_ssm_parameter" "files_uploaded_dlq_url" {
  name  = "/common/sqs/files-uploaded/dlq-url"
  type  = "SecureString"
  value = aws_sqs_queue.files_uploaded_dlq.url
}

resource "aws_ssm_parameter" "transcode_jobs_queue_url" {
  name  = "/common/sqs/transcode-jobs/queue-url"
  type  = "SecureString"
  value = aws_sqs_queue.transcode_jobs_queue.url
}

resource "aws_ssm_parameter" "transcode_jobs_dlq_url" {
  name  = "/common/sqs/transcode-jobs/dlq-url"
  type  = "SecureString"
  value = aws_sqs_queue.transcode_jobs_dlq.url
}

resource "aws_ssm_parameter" "transcode_notifications_queue_url" {
  name  = "/common/sqs/transcode-notifications/queue-url"
  type  = "SecureString"
  value = aws_sqs_queue.transcode_notifications_queue.url
}

resource "aws_ssm_parameter" "transcode_notifications_dlq_url" {
  name  = "/common/sqs/transcode-notifications/dlq-url"
  type  = "SecureString"
  value = aws_sqs_queue.transcode_notifications_dlq.url
}

# EventBridge Rule to capture MediaConvert job status changes
resource "aws_cloudwatch_event_rule" "mediaconvert_job_status" {
  name        = "humand-mediaconvert-job-status-${var.env}"
  description = "Capture MediaConvert job status changes"
  # Default event bus

  event_pattern = jsonencode({
    source      = ["aws.mediaconvert"]
    detail-type = ["MediaConvert Job State Change"]
    detail = {
      status = ["COMPLETE", "ERROR", "CANCELED", "PROGRESSING"]
    }
  })

  tags = {
    Environment = var.env
    Service     = "transcoding"
    RuleType    = "mediaconvert-status"
  }
}

# EventBridge Target to send events to SQS queue
resource "aws_cloudwatch_event_target" "mediaconvert_to_sqs" {
  rule      = aws_cloudwatch_event_rule.mediaconvert_job_status.name
  target_id = "MediaConvertToSQS"
  arn       = aws_sqs_queue.transcode_notifications_queue.arn
}

# SQS Queue Policy to allow EventBridge to send messages
resource "aws_sqs_queue_policy" "transcode_notifications_queue_policy" {
  queue_url = aws_sqs_queue.transcode_notifications_queue.id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect = "Allow"
        Principal = {
          Service = "events.amazonaws.com"
        }
        Action   = "sqs:SendMessage"
        Resource = aws_sqs_queue.transcode_notifications_queue.arn
        Condition = {
          ArnEquals = {
            "aws:SourceArn" = aws_cloudwatch_event_rule.mediaconvert_job_status.arn
          }
        }
      }
    ]
  })
}
