module "chartmetric_process_cfg_role" {
  source = "../../../modules/iam/roles/lambda_role"

  name_prefix = local.name_prefix
  name        = "chartmetric_process_cfg_role"

  policies_list = [
    data.aws_iam_policy.secrets-services-rw.arn,
    data.aws_iam_policy.logging.arn,
    module.iam_map.chartmetric_db_rw.arn,
  ]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetric",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_CHMT_LMB"
    }
  )

  allow_execution_inside_vpc = true
}

module "chartmetric_kinesis_firehose" {
  source = "../../../modules/kinesis_firehose/extended_s3_destination_parquet"

  bucket_arn                = "arn:aws:s3:::${local.name_prefix}-quarantine-sme-data-decompressed"
  backup_bucket_arn         = "arn:aws:s3:::${local.name_prefix}-firehose-streams-backup"
  enable_s3_backup_mode     = true
  env_prefix                = local.env_prefix
  project                   = "chartmetric"
  project_group             = local.project_group
  region                    = var.aws_region_id
  s3_error_output_prefix    = "chartmetric_error/v1/"
  s3_prefix                 = "chartmetric/v1/"
  s3_path                   = "report_date=!{timestamp:yyyy}-!{timestamp:MM}-!{timestamp:dd}/report_licensor=sme/"
  backup_compression_format = "Snappy"
  buffer_interval           = 900
  buffer_size               = 25
  enable_processing         = true
  lambda_process_arn        = "arn:aws:lambda:us-east-1:475275892927:function:${local.name_prefix}-chartmetric-process-cfg-${local.env_prefix}"
  aggregated_tag            = local.aggregated_tag
  common_tags               = local.common_tags
}

module "chartmetric_manager_role" {
  source = "../../../modules/iam/roles/lambda_role"

  name_prefix = local.name_prefix
  name        = "chartmetric_manager_role"

  policies_list = [
    data.aws_iam_policy.logging.arn,
    module.iam_map.run_ecs_task.arn,
  ]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetric",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_CHMT_LMB"
    }
  )

  allow_execution_inside_vpc = true
}

module "chartmetric_fargate_role" {
  source              = "../../../modules/iam/roles/ecs_task_role"
  enable_default_role = false
  name_prefix         = local.name_prefix
  name                = "chartmetric_fargate_role"
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetric",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_CHMT_ECS"
    }
  )
  policies_list = [
    module.iam_map.s3_env_rw.arn,
    module.iam_map.s3_sme_data_rw.arn,
    data.aws_iam_policy.secrets-services-rw.arn,
    data.aws_iam_policy.logging.arn,
    module.iam_map.firehose.arn,
    module.iam_map.chartmetric_db_rw.arn,
  ]
}

module "chartmetric_retrieval" {
  # Standard parameters which could be included into the template
  source             = "../../../modules/ecs/tasks/fargate"
  env_prefix         = local.env_prefix
  project_group      = local.project_group
  task_family        = "${local.env_prefix}-${local.project_group}-chartmetric_retrieval"
  region             = var.aws_region_id
  task_exec_role_arn = data.aws_iam_role.standard_exec.arn
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetric",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_CHMT_ECS"
    }
  )

  # Parameters that should be customized for each service
  project       = "chartmetric_retrieval"
  task_role_arn = module.chartmetric_fargate_role.role.arn
  cpu           = 2048
  memory        = 4096
  image         = "475275892927.dkr.ecr.us-east-1.amazonaws.com/delphi/chartmetric:${local.docker_image_env_tag[var.platform.prefix]}"
  #dd_api_key_secret       = "arn:aws:secretsmanager:us-east-1:${local.account_id}:secret:${lower(var.platform.name)}/${lower(var.platform.prefix)}/common/DD_API_KEY"
  #dd_docker_image         = "public.ecr.aws/datadog/agent:latest"
  #dd_log_group_name       = aws_cloudwatch_log_group.datadog-agent.name
  #dd_apm_enabled          = "false"
  env_vars = [
    {
      name  = "ENDPOINT",
      value = "endpoints/fan_metrics.py"
    },
    {
      name  = "ENVIRONMENT",
      value = var.platform.prefix
    },
  ]
}

module "chartmetric_data_writer" {
  # Standard parameters which could be included into the template
  source             = "../../../modules/ecs/tasks/fargate"
  env_prefix         = local.env_prefix
  project_group      = local.project_group
  task_family        = "${local.env_prefix}-${local.project_group}-chartmetric_data_writer"
  region             = var.aws_region_id
  task_exec_role_arn = data.aws_iam_role.standard_exec.arn
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetric",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_CHMT_ECS"
    }
  )

  # Parameters that should be customized for each service
  project       = "chartmetric_data_writer"
  task_role_arn = module.chartmetric_fargate_role.role.arn
  cpu           = 2048
  memory        = 4096
  image         = "475275892927.dkr.ecr.us-east-1.amazonaws.com/delphi/chartmetric:${local.docker_image_env_tag[var.platform.prefix]}"
  #dd_api_key_secret       = "arn:aws:secretsmanager:us-east-1:${local.account_id}:secret:${lower(var.platform.name)}/${lower(var.platform.prefix)}/common/DD_API_KEY"
  #dd_docker_image         = "public.ecr.aws/datadog/agent:latest"
  #dd_log_group_name       = aws_cloudwatch_log_group.datadog-agent.name
  #dd_apm_enabled          = "false"
  env_vars = [
    {
      name  = "ENDPOINT",
      value = "endpoints/s3_to_big_table.py"
    },
    {
      name  = "ENVIRONMENT",
      value = var.platform.prefix
    },
  ]
}

module "chartmetric_data_checker_role" {
  source = "../../../modules/iam/roles/lambda_role"

  name_prefix = local.name_prefix
  name        = "chartmetric_data_checker_role"

  policies_list = [
    module.iam_map.s3_env_rw.arn,
    module.iam_map.s3_sme_data_rw.arn,
    data.aws_iam_policy.secrets-services-rw.arn,
    data.aws_iam_policy.logging.arn,
    module.iam_map.chartmetric_db_rw.arn,
  ]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetric",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_CHMT_LMB"
    }
  )

  allow_execution_inside_vpc = true
}

module "chartmetric_historical_stream" {
  source = "../../../modules/kinesis_firehose/extended_s3_destination_parquet"

  bucket_arn                = "arn:aws:s3:::${local.name_prefix}-chartmetric-hist-data-decompressed"
  backup_bucket_arn         = "arn:aws:s3:::${local.name_prefix}-firehose-streams-backup"
  enable_s3_backup_mode     = true
  env_prefix                = local.env_prefix
  project                   = "chartmetric_historical"
  project_group             = local.project_group
  region                    = var.aws_region_id
  s3_error_output_prefix    = "chartmetric_error/v1/"
  s3_prefix                 = "chartmetric/v1/"
  s3_path                   = "report_date=!{timestamp:yyyy}-!{timestamp:MM}-!{timestamp:dd}/report_licensor=sme/"
  backup_compression_format = "Snappy"
  buffer_interval           = 900
  buffer_size               = 25
  enable_processing         = true
  lambda_process_arn        = "arn:aws:lambda:us-east-1:475275892927:function:${local.name_prefix}-chartmetric-process-cfg-${local.env_prefix}"
  aggregated_tag            = local.aggregated_tag
  common_tags               = local.common_tags
}

module "chartmetric_fan_metrics_historical" {
  # Standard parameters which could be included into the template
  source             = "../../../modules/ecs/tasks/fargate"
  env_prefix         = local.env_prefix
  project_group      = local.project_group
  task_family        = "${local.env_prefix}-${local.project_group}-chartmetric_fan_metrics_historical"
  region             = var.aws_region_id
  task_exec_role_arn = data.aws_iam_role.standard_exec.arn
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetric",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_CHMT_ECS"
    }
  )

  # Parameters that should be customized for each service
  project       = "chartmetric_fan_metrics_historical"
  task_role_arn = module.chartmetric_fargate_role.role.arn
  cpu           = 2048
  memory        = 4096
  image         = "475275892927.dkr.ecr.us-east-1.amazonaws.com/delphi/chartmetric:${local.docker_image_env_tag[var.platform.prefix]}"
  #dd_api_key_secret       = "arn:aws:secretsmanager:us-east-1:${local.account_id}:secret:${lower(var.platform.name)}/${lower(var.platform.prefix)}/common/DD_API_KEY"
  #dd_docker_image         = "public.ecr.aws/datadog/agent:latest"
  #dd_log_group_name       = aws_cloudwatch_log_group.datadog-agent.name
  #dd_apm_enabled          = "false"
  env_vars = [
    {
      name  = "ENDPOINT",
      value = "endpoints/fan_metrics_historical.py"
    },
    {
      name  = "ENVIRONMENT",
      value = var.platform.prefix
    },
  ]
}

module "chartmetric_get_chartmetric_id" {
  # Standard parameters which could be included into the template
  source             = "../../../modules/ecs/tasks/fargate"
  env_prefix         = local.env_prefix
  project_group      = local.project_group
  task_family        = "${local.env_prefix}-${local.project_group}-chartmetric_get_chartmetric_id"
  region             = var.aws_region_id
  task_exec_role_arn = data.aws_iam_role.standard_exec.arn
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetric",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_CHMT_ECS"
    }
  )

  # Parameters that should be customized for each service
  project       = "chartmetric_get_chartmetric_id"
  task_role_arn = module.chartmetric_fargate_role.role.arn
  cpu           = 2048
  memory        = 4096
  image         = "475275892927.dkr.ecr.us-east-1.amazonaws.com/delphi/chartmetric:${local.docker_image_env_tag[var.platform.prefix]}"
  #dd_api_key_secret       = "arn:aws:secretsmanager:us-east-1:${local.account_id}:secret:${lower(var.platform.name)}/${lower(var.platform.prefix)}/common/DD_API_KEY"
  #dd_docker_image         = "public.ecr.aws/datadog/agent:latest"
  #dd_log_group_name       = aws_cloudwatch_log_group.datadog-agent.name
  #dd_apm_enabled          = "false"
  env_vars = [
    {
      name  = "ENDPOINT",
      value = "endpoints/get_chartmetric_id.py"
    },
    {
      name  = "ENVIRONMENT",
      value = var.platform.prefix
    },
  ]
}

module "chartmetric_historical_file_split" {
  # Standard parameters which could be included into the template
  source             = "../../../modules/ecs/tasks/fargate"
  env_prefix         = local.env_prefix
  project_group      = local.project_group
  task_family        = "${local.env_prefix}-${local.project_group}-chartmetric_historical_file_split"
  region             = var.aws_region_id
  task_exec_role_arn = data.aws_iam_role.standard_exec.arn
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetric",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_CHMT_ECS"
    }
  )

  # Parameters that should be customized for each service
  project       = "chartmetric_historical_file_split"
  task_role_arn = module.chartmetric_fargate_role.role.arn
  cpu           = 2048
  memory        = 4096
  image         = "475275892927.dkr.ecr.us-east-1.amazonaws.com/delphi/chartmetric:${local.docker_image_env_tag[var.platform.prefix]}"
  #dd_api_key_secret       = "arn:aws:secretsmanager:us-east-1:${local.account_id}:secret:${lower(var.platform.name)}/${lower(var.platform.prefix)}/common/DD_API_KEY"
  #dd_docker_image         = "public.ecr.aws/datadog/agent:latest"
  #dd_log_group_name       = aws_cloudwatch_log_group.datadog-agent.name
  #dd_apm_enabled          = "false"
  env_vars = [
    {
      name  = "ENDPOINT",
      value = "endpoints/historical_file_split.py"
    },
    {
      name  = "ENVIRONMENT",
      value = var.platform.prefix
    },
  ]
}
module "chartmetric_s3_to_postgres" {
  # Standard parameters which could be included into the template
  source             = "../../../modules/ecs/tasks/fargate"
  env_prefix         = local.env_prefix
  project_group      = local.project_group
  task_family        = "${local.env_prefix}-${local.project_group}-chartmetric_s3_to_postgres"
  region             = var.aws_region_id
  task_exec_role_arn = data.aws_iam_role.standard_exec.arn
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetric",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_CHMT_ECS"
    }
  )

  # Parameters that should be customized for each service
  project       = "chartmetric_s3_to_postgres"
  task_role_arn = module.chartmetric_fargate_role.role.arn
  cpu           = 2048
  memory        = 4096
  image         = "475275892927.dkr.ecr.us-east-1.amazonaws.com/delphi/chartmetric:${local.docker_image_env_tag[var.platform.prefix]}"
  #dd_api_key_secret       = "arn:aws:secretsmanager:us-east-1:${local.account_id}:secret:${lower(var.platform.name)}/${lower(var.platform.prefix)}/common/DD_API_KEY"
  #dd_docker_image         = "public.ecr.aws/datadog/agent:latest"
  #dd_log_group_name       = aws_cloudwatch_log_group.datadog-agent.name
  #dd_apm_enabled          = "false"
  env_vars = [
    {
      name  = "ENDPOINT",
      value = "endpoints/s3_to_postgres.py"
    },
    {
      name  = "ENVIRONMENT",
      value = var.platform.prefix
    },
  ]
}

module "chartmetric_snowflake_to_bigtable" {
  # Standard parameters which could be included into the template
  source             = "../../../modules/ecs/tasks/fargate"
  env_prefix         = local.env_prefix
  project_group      = local.project_group
  task_family        = "${local.env_prefix}-${local.project_group}-chartmetric_snowflake_to_bigtable"
  region             = var.aws_region_id
  task_exec_role_arn = data.aws_iam_role.standard_exec.arn
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetric",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_CHMT_ECS"
    }
  )

  # Parameters that should be customized for each service
  project       = "chartmetric_snowflake_to_bigtable"
  task_role_arn = module.chartmetric_fargate_role.role.arn
  cpu           = 2048
  memory        = 4096
  image         = "475275892927.dkr.ecr.us-east-1.amazonaws.com/delphi/chartmetric:${local.docker_image_env_tag[var.platform.prefix]}"
  #dd_api_key_secret       = "arn:aws:secretsmanager:us-east-1:${local.account_id}:secret:${lower(var.platform.name)}/${lower(var.platform.prefix)}/common/DD_API_KEY"
  #dd_docker_image         = "public.ecr.aws/datadog/agent:latest"
  #dd_log_group_name       = aws_cloudwatch_log_group.datadog-agent.name
  #dd_apm_enabled          = "false"
  env_vars = [
    {
      name  = "ENDPOINT",
      value = "endpoints/snowflake_to_bigtable.py"
    },
    {
      name  = "ENVIRONMENT",
      value = var.platform.prefix
    },
  ]
}

# Chartmetric manager scheduler
data "aws_lambda_function" "chartmetric_manager" {
  function_name = "${local.name_prefix}-chartmetric-manager-${local.env_prefix}"
}

module "chartmetric_manager_scheduler" {
  source              = "../../../modules/lambda/schedule_trigger"
  function_arn        = data.aws_lambda_function.chartmetric_manager.arn
  schedule_expression = "cron(0 0/8 ? * TUE,THU,FRI,SUN *)"
}

module "chartmetric_invoker_role" {
  source = "../../../modules/iam/roles/lambda_role"

  name_prefix = local.name_prefix
  name        = "chartmetric_invoker_role"

  policies_list = [
    data.aws_iam_policy.secrets-services-rw.arn,
    data.aws_iam_policy.logging.arn,
    module.iam_map.db_rw.arn,
    module.iam_map.lambda_invoke.arn,
    module.iam_map.s3_env_ro.arn,
  ]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetric",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_CHMT_LMB"
    }
  )

  allow_execution_inside_vpc = true
}

module "chartmetric_status_role" {
  source = "../../../modules/iam/roles/lambda_role"

  name_prefix = local.name_prefix
  name        = "chartmetric_status_role"

  policies_list = [
    data.aws_iam_policy.secrets-services-rw.arn,
    data.aws_iam_policy.logging.arn,
    module.iam_map.db_ro.arn,
  ]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetric",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_CHMT_LMB"
    }
  )

  allow_execution_inside_vpc = true
}

module "chartmetric_migrate_role" {
  source = "../../../modules/iam/roles/lambda_role"

  name_prefix = local.name_prefix
  name        = "chartmetric_migrate_role"

  policies_list = [
    data.aws_iam_policy.secrets-services-rw.arn,
    data.aws_iam_policy.logging.arn,
    module.iam_map.db_ro.arn,
    module.iam_map.lambda_invoke.arn,
    module.iam_map.s3_env_ro.arn,
  ]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetric",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_CHMT_LMB"
    }
  )

  allow_execution_inside_vpc = true
}

module "chartmetric_api_alerts_role" {
  source = "../../../modules/iam/roles/lambda_role"

  name_prefix = local.name_prefix
  name        = "chartmetric_api_alerts_role"

  policies_list = [
    data.aws_iam_policy.secrets-services-rw.arn,
    data.aws_iam_policy.logging.arn,
    module.iam_map.chartmetric_db_rw.arn,
  ]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetric",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_CHMT_LMB"
    }
  )

  allow_execution_inside_vpc = true
}

module "chartmetric_artist_alerts_role" {
  source = "../../../modules/iam/roles/lambda_role"

  name_prefix = local.name_prefix
  name        = "chartmetric_artist_alerts_role"

  policies_list = [
    data.aws_iam_policy.secrets-services-rw.arn,
    data.aws_iam_policy.logging.arn,
    module.iam_map.chartmetric_db_rw.arn,
    module.iam_map.db_rw.arn,
  ]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetric",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_CHMT_LMB"
    }
  )

  allow_execution_inside_vpc = true
}


module "chartmetric_artist_mapping_role" {
  source = "../../../modules/iam/roles/lambda_role"

  name_prefix = local.name_prefix
  name        = "chartmetric_artist_mapping_role"

  policies_list = [
    data.aws_iam_policy.secrets-services-rw.arn,
    data.aws_iam_policy.logging.arn,
    module.iam_map.chartmetric_db_rw.arn,
    module.iam_map.db_rw.arn,
  ]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetric",
      service                  = "Lambda",
      plat_env_project_service = "${local.aggregated_tag}_CHMT_LMB"
    }
  )

  allow_execution_inside_vpc = true
}

module "chartmetric_snowflake_role" {
  source      = "../../../modules/iam/roles/stepfunction_role"
  name_prefix = local.name_prefix
  name        = "chartmetric_snowflake_role"
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetric",
      service                  = "Step Functions",
      plat_env_project_service = "${local.aggregated_tag}_CHMT_SFU"
    }
  )
  policies_list = [
    module.iam_map.s3_env_ro.arn,
    module.iam_map.lambda_invoke.arn,
    data.aws_iam_policy.logging.arn,
    module.iam_map.batch_jobs_sync.arn,
  ]
}

resource "aws_sfn_state_machine" "chartmetric_snowflake" {
  name       = "${local.name_prefix}-chartmetric_snowflake"
  role_arn   = module.chartmetric_snowflake_role.role.arn
  definition = <<EOF
{
  "StartAt": "Placeholder",
  "States": {
    "Placeholder": {
      "Type": "Pass",
      "End": true
    }
  }
}
EOF
  tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetric",
      service                  = "Step Functions",
      plat_env_project_service = "${local.aggregated_tag}_CHMT_SFU"
    }
  )
  lifecycle {
    ignore_changes = [definition]
  }
}

resource "aws_secretsmanager_secret" "tiktok_chartmetrics_secret" {
  name       = "${local.secrets_name_prefix}/snowflake/tiktok_chartmetric"
  kms_key_id = data.aws_kms_key.secrets_general_key.id

  tags = merge(
    local.common_tags,
    {
      project                  = "Infrastructure",
      service                  = "Secrets Manager",
      plat_env_project_service = "${local.aggregated_tag}_DECIBEL_SCRT"

    }
  )

  lifecycle {
    ignore_changes = [description]
  }
}

# New task and config for migrator
data "aws_ecr_repository" "chartmetric_migrator_task" {
  name = "delphi/chartmetric-migrator"
}

module "chartmetric_migrator_role" {
  source              = "../../../modules/iam/roles/ecs_task_role"
  enable_default_role = false
  name_prefix         = local.name_prefix
  name                = "chartmetric_migrator_role"
  common_tags = merge(
    local.common_tags,
    {
      project                  = "Chartmetric",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_CHMT_ECS"
    }
  )
  policies_list = [
    data.aws_iam_policy.secrets-services-rw.arn,
    data.aws_iam_policy.logging.arn,
    module.iam_map.db_ro.arn,
    module.iam_map.lambda_invoke.arn,
    module.iam_map.sf_worker.arn,
  ]
}

module "chartmetric_migrator_job_def" {
  source          = "../../../modules/batch/job_definition"
  env_prefix      = local.env_prefix
  project_group   = local.project_group
  project         = "chartmetric_migrator_job"
  job_role_arn    = module.chartmetric_migrator_role.role.arn
  image           = "${data.aws_ecr_repository.chartmetric_migrator_task.repository_url}:${local.docker_image_env_tag[var.platform.prefix]}"
  vcpus           = 2
  memory          = 7500
  timeout_seconds = 3600
  retry_attempts  = 1
  env_vars        = [{ "name" = "AWS_DEFAULT_REGION", "value" = var.aws_region_id }]
}

module "batch_run_config_chartmetric_migrator" {
  source                   = "../../modules/batch_run_config"
  env_prefix               = local.env_prefix
  delphi-configs           = data.aws_s3_bucket.delphi-configs.bucket
  template_name            = "batch_run_config_hasher.tmpl"
  run_config_filename      = "chartmetric/batch-standard-priority.json"
  batch_job_definition_arn = module.chartmetric_migrator_job_def.batch_job_definition.arn
  batch_job_queue_arn      = data.aws_batch_job_queue.slz_downloader_main.arn
}
