locals {
  etl_task_secrets = [
    "MYSQL_DB_PASS",
    "MYSQL_DB_USER",
  ]

  etl_task_common_secrets = {
    DD_API_KEY = aws_secretsmanager_secret.common_secret["DD_API_KEY"]
  }

  etl_task_secrets_list = [
    for k, v in merge(aws_secretsmanager_secret.dotnet_etl_secret, local.etl_task_common_secrets) :
    {
      name      = k,
      valueFrom = "arn:aws:secretsmanager:${var.aws_region_id}:${local.account_id}:secret:${v["name"]}"
    }
  ]

  etl_task_env_vars = [
    {
      name  = "MYSQL_DB_RW_HOST"
      value = module.domains[local.env_prefix]["main-db-rw"]
    },
    {
      name  = "MYSQL_DB_RO_HOST"
      value = module.domains[local.env_prefix]["main-db-ro"]
    },
    {
      name  = "MYSQL_MAIN_DB_NAME"
      value = "dbSony_dbo"
    },
    {
      name  = "MYSQL_ERR_DB_NAME"
      value = "elmah"
    },
    {
      name  = "ENVIRONMENT",
      value = local.environment
    },
    {
      name  = "ECS_CLUSTER"
      value = data.aws_ecs_cluster.etl.cluster_name
    },
    {
      name  = "PROJECT",
      value = local.project_group
    },
  ]

  etl_tasks = {
    test = {
      command = [""]
      cpu     = 2048
      memory  = 4096
      schedule_expression = {
        a = {
          expression = "cron(0 0 ? 1 1 2199)",
          enabled    = false
        }
      }
    },
    playlist_stats = {
      command = ["playlistStats"]
      cpu     = 2048
      memory  = 4096
      schedule_expression = {
        a = {
          expression = "rate(4 hours)",
          enabled    = true
        }
      }
    },
    playlist_stats_selected = {
      command = ["playlistStatsSelected"]
      cpu     = 2048
      memory  = 4096
      schedule_expression = {
        a = {
          expression = "rate(4 hours)",
          enabled    = false
        }
      }
    },
    analytics_playlist_import = {
      command       = ["analyticsPlaylistImport"]
      task_role_arn = module.etl_s3_ro_ecs_role.role.arn
      cpu           = 4096
      memory        = 8192
      schedule_expression = {
        a = {
          expression = "rate(15 minutes)",
          enabled    = true
        }
      }
      ephemeral_storage = 200
    },
    analytics_pllst_impt_backf = {
      command       = ["analyticsPlaylistImportBackfill", "true", "1970-01-01", "1970-01-02"]
      task_role_arn = module.etl_s3_ro_ecs_role.role.arn
      cpu           = 4096
      memory        = 8192
      schedule_expression = {
        a = {
          expression = "cron(0 0 ? 1 1 2199)",
          enabled    = false
        }
      }
      ephemeral_storage = 200
    },
    exp_spotify_pllst_trklst_hist = {
      command       = ["exportSpotifyPlaylistTracklistHistory"]
      task_role_arn = module.etl_s3_rw_ecs_role.role.arn
      cpu           = 4096
      memory        = 18432 // 18 GB
      schedule_expression = {
        a = {
          expression = "cron(30 10 * * ? *)",
          enabled    = false
        }
      }
    },
    exp_apl_muz_pllst_trklst_hist = {
      command       = ["exportAppleMusicPlaylistTracklistHistory"]
      task_role_arn = module.etl_s3_rw_ecs_role.role.arn
      schedule_expression = {
        a = {
          expression = "cron(30 10 * * ? *)",
          enabled    = false
        }
      }
    }
    apple_music_charts = {
      command       = ["appleMusicCharts", "updateAppleMusicSongs"]
      task_role_arn = module.etl_s3_rw_ecs_role.role.arn
      cpu           = 512
      memory        = 4096
      schedule_expression = {
        a = {
          expression = "rate(4 hours)",
          enabled    = false
        }
      }
    }
    import_playlists = {
      command = ["importplaylists", "importbuzzplaylists", "accousticDetails", "adminsearchindex", "spotifyAlbumData", "setEditorialPlaylistGenres", "indexEditorialPlaylists"]
      schedule_expression = {
        a = {
          expression = "cron(00 01 * * ? *)",
          enabled    = false
        }
      }
    }
    most_playlisted_track = {
      command = ["mostPlaylistedTrack"]
      cpu     = 4096
      memory  = 24576
      schedule_expression = {
        a = {
          expression = "cron(00 22 * * ? *)",
          enabled    = true
        }
      }
    }
    playlist_sync = {
      command       = ["playlistsync"]
      cpu           = 256
      memory        = 512
      task_role_arn = module.etl_s3_rw_ecs_role.role.arn
      schedule_expression = {
        a = {
          expression = "cron(00 03 * * ? *)",
          enabled    = false
        }
      }
    }
    import_best_of_the_week = {
      command = ["importbestoftheweek"]
      schedule_expression = {
        a = {
          expression = "cron(0/30 * ? * THU-SAT *)",
          enabled    = true
        }
      }
    }
    ftch_apl_msc_chrt_pllst_trk = {
      command       = ["fetchapplemusicchartplaylisttracks"]
      memory        = 8192
      task_role_arn = module.etl_s3_rw_ecs_role.role.arn
      schedule_expression = {
        a = {
          expression = "cron(25 1/4 * * ? *)",
          enabled    = false
        }
      }
    }
    ftch_spotify_charts = {
      command       = ["fetchspotifycharts"]
      memory        = 8192
      task_role_arn = module.etl_s3_rw_ecs_role.role.arn
      schedule_expression = {
        a = {
          expression = "rate(1 hour)",
          enabled    = false
        }
      }
    }
    import_artist_followers = {
      command = ["importArtistFollowers"]
      memory  = 8192
      schedule_expression = {
        a = {
          expression = "cron(41 2 ? * TUE *)",
          enabled    = true
        }
        b = {
          expression = "cron(41 14 ? * TUE *)",
          enabled    = true
        }
      }
    }
    import_popular_artist_follow = {
      command = ["importPopularArtistFollowers"]
      memory  = 8192
      schedule_expression = {
        a = {
          expression = "cron(41 14-18 ? * SUN-MON,WED-SAT *)",
          enabled    = true
        }
      }
    }
    import_spotify_browse = {
      command       = ["importSpotifyBrowse"]
      cpu           = 2048
      memory        = 4096
      task_role_arn = module.etl_s3_rw_ecs_role.role.arn
      schedule_expression = {
        a = {
          expression = "cron(19 4-12 * * ? *)",
          enabled    = true
        }
      }
    }
    deezer_import_playlists = {
      command = ["deezerImportPlaylists"]
      schedule_expression = {
        a = {
          expression = "cron(0 0-4 * * ? *)",
          enabled    = false
        }
      }
    }
    deezer_fan_log_task = {
      command = ["deezerFanLogTask"]
      schedule_expression = {
        a = {
          expression = "cron(30 0-4 * * ? *)",
          enabled    = false
        }
      }
    }
    export_spotify_artist_follow = {
      command       = ["exportSpotifyArtistFollowers"]
      task_role_arn = module.etl_s3_rw_ecs_role.role.arn
      schedule_expression = {
        a = {
          expression = "cron(0 9,21 * * ? *)",
          enabled    = false
        }
      }
    }
    fetch_popular_artists = {
      command = ["fetchpopularartists"]
      schedule_expression = {
        a = {
          expression = "cron(10 14 * * ? *)",
          enabled    = false
        }
      }
    }
    apple_music_playlists = {
      command = ["applemusicplaylists", "updateAppleMusicSongs"]
      schedule_expression = {
        a = {
          expression = "cron(10 14 * * ? *)",
          enabled    = false
        }
      }
    }
    mood_agent_export = {
      command       = ["moodAgentExport"]
      task_role_arn = module.etl_s3_rw_ecs_role.role.arn
      schedule_expression = {
        a = {
          expression = "cron(0 21 * * ? *)",
          enabled    = false
        }
      }
    }
    promoted = {
      command = ["promoted"]
      schedule_expression = {
        a = {
          expression = "cron(58 15/4 * * ? *)",
          enabled    = false
        }
      }
    }
    scrape_spotify_artist_listen = {
      command = ["scrapeSpotifyArtistListeners"]
      schedule_expression = {
        a = {
          expression = "cron(59 8 * * ? *)",
          enabled    = false
        }
      }
    }
    import_sony_releases = {
      command       = ["importSonyReleases"]
      task_role_arn = module.etl_s3_rw_ecs_role.role.arn
      schedule_expression = {
        a = {
          expression = "cron(57 * * * ? *)",
          enabled    = true
        }
      }
    }
    spotify_weekly_top_list = {
      command       = ["spotifyWeeklyTopList"]
      task_role_arn = module.etl_s3_rw_ecs_role.role.arn
      schedule_expression = {
        a = {
          expression = "cron(28 15/4 * * ? *)",
          enabled    = true
        }
      }
    }
    apl_msc_playlists_most_stream = {
      command = ["applemusicplaylistsMostStreamed"]
      schedule_expression = {
        a = {
          expression = "cron(30 1/2 * * ? *)",
          enabled    = false
        }
      }
    }
    release = {
      command       = ["release", "deezerreleases"]
      task_role_arn = module.etl_s3_rw_ecs_role.role.arn
      schedule_expression = {
        a = {
          expression = "cron(57 * * * ? *)",
          enabled    = true
        }
      }
    }
    upload_playlists_and_users = {
      command       = ["uploadplaylistsandusers"]
      task_role_arn = module.etl_s3_rw_ecs_role.role.arn
      schedule_expression = {
        a = {
          expression = "cron(07 14 * * ? *)",
          enabled    = true
        }
      }
    }
    import_spotify_user_follow = {
      command       = ["importSpotifyUserFollowers"]
      task_role_arn = module.etl_s3_rw_ecs_role.role.arn
      schedule_expression = {
        a = {
          expression = "cron(59 9-14 * * ? *)",
          enabled    = false
        }
      }
    }
    update_playlists_vendor_api = {
      command       = ["updateplaylistsvendorapi"]
      task_role_arn = module.etl_s3_rw_ecs_role.role.arn
      cpu           = 4096
      memory        = 24576
      schedule_expression = {
        a = {
          expression = "cron(30 03 * * ? *)",
          enabled    = false
        }
      }
    }
    update_playlist_tracks = {
      command       = ["updateplaylisttracks"]
      task_role_arn = module.etl_s3_rw_ecs_role.role.arn
      memory        = 8192
      schedule_expression = {
        a = {
          expression = "cron(30 11-21 * * ? *)",
          enabled    = false
        }
      }
    }
    update_playlists = {
      command       = ["updateplaylists"]
      task_role_arn = module.etl_s3_rw_ecs_role.role.arn
      cpu           = 2048
      memory        = 16384
      schedule_expression = {
        a = {
          expression = "cron(30 11-21 * * ? *)",
          enabled    = false
        }
      }
    }
    analytics_import = {
      command       = ["analyticsImport"]
      task_role_arn = module.etl_s3_ro_ecs_role.role.arn
      schedule_expression = {
        a = {
          expression = "cron(54/15 07 * * ? *)",
          enabled    = true
        }
      }
    }
    playlist_aggr_data_import = {
      command = ["playlistAggregationDataImport"]
      cpu     = 2048
      memory  = 16384
      schedule_expression = {
        a = {
          expression = "cron(0 * * * ? *)",
          enabled    = true
        }
      }
    }
    upd_apl_music_analyt_aggr = {
      command = ["updateAppleMusicAnalyticsAggregatedTask"]
      schedule_expression = {
        a = {
          expression = "cron(19 * * * ? *)",
          enabled    = true
        }
      }
    }
    new_playlists_import = {
      command = ["newPlaylistsImport"]
      schedule_expression = {
        a = {
          expression = "cron(30 0 * * ? *)",
          enabled    = true
        }
      }
    }
  }
}

resource "aws_secretsmanager_secret" "dotnet_etl_secret" {
  for_each = toset(local.etl_task_secrets)

  name       = "${local.secrets_name_prefix}/dotnet/${each.value}"
  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}_INFRA_SCRT"
    }
  )
}

data "aws_ecr_repository" "scheduled_task_dotnet_ecr" {
  name = "${local.project_group}/scheduled-task-dotnet"

  provider = aws.gdb-apollo-dev
}

data "aws_iam_policy" "etl_ro_policy" {
  arn = "${local.policy_base_arn}-etl_ro"
}

data "aws_iam_policy" "etl_rw_policy" {
  arn = "${local.policy_base_arn}-etl_rw"
}

module "etl_s3_ro_ecs_role" {
  source = "../../../modules/iam/roles/ecs_task_role"

  enable_default_role = false
  name_prefix         = local.name_prefix
  name                = "etl_s3_ro_ecs_role"

  policies_list = [
    data.aws_iam_policy.secrets_services_ro.arn,
    data.aws_iam_policy.logging_policy.arn,
    data.aws_iam_policy.etl_ro_policy.arn,
  ]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "Portal",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_PRL_ECS"
    }
  )
}

module "etl_s3_rw_ecs_role" {
  source = "../../../modules/iam/roles/ecs_task_role"

  enable_default_role = false
  name_prefix         = local.name_prefix
  name                = "etl_s3_rw_ecs_role"

  policies_list = [
    data.aws_iam_policy.secrets_services_ro.arn,
    data.aws_iam_policy.logging_policy.arn,
    data.aws_iam_policy.etl_rw_policy.arn,
  ]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "ETL",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_ETL_ECS"
    }
  )
}

module "dotnet_tasks_definitions" {
  source   = "../../../modules/ecs/tasks/fargate_v3"
  for_each = local.etl_tasks

  env_prefix             = local.env_prefix
  project_group          = local.project_group
  family                 = "${local.env_prefix}-${local.project_group}-${each.key}"
  container_name         = each.key
  container_image        = "${data.aws_ecr_repository.scheduled_task_dotnet_ecr.repository_url}:${local.docker_image_env_tag[var.platform.prefix]}"
  cpu                    = lookup(each.value, "cpu", 1024)
  memory                 = lookup(each.value, "memory", 2048)
  command                = each.value.command
  ephemeral_storage_size = lookup(each.value, "ephemeral_storage", 20)

  awslogs_retention = module.cloudwatch_logs_retention_by_env[local.env_prefix]

  task_role_arn = lookup(each.value, "task_role_arn", data.aws_iam_role.standard_exec.arn)
  exec_role_arn = data.aws_iam_role.standard_exec.arn

  env_vars = concat(local.etl_task_env_vars, [
    {
      name  = "ECS_SERVICE",
      value = each.key
    }
  ])
  secrets = local.etl_task_secrets_list

  efs_volume_enabled = true
  efs_volume_name    = "shared-data"
  efs_file_system_id = aws_efs_file_system.dotnet_etl_shared_fs.id
  efs_root_directory = "/"

  mount_points = [
    {
      containerPath = "/app/share",
      readOnly      = false,
      sourceVolume  = "shared-data"
    }
  ]

  common_tags = merge(
    local.common_tags,
    {
      project                  = "ETL",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_ETL_ECS"
    }
  )
}


module "dotnet_tasks" {
  source   = "../../../modules/ecs/tasks/scheduled_taskless"
  for_each = local.etl_tasks

  task_definition_arn = module.dotnet_tasks_definitions[each.key]["arn"]

  env_prefix         = local.env_prefix
  project_group      = local.project_group
  project            = each.key
  cluster_arn        = data.aws_ecs_cluster.etl.arn
  security_groups    = [data.aws_security_group.main.id]
  scheduler_role_arn = data.aws_iam_role.scheduler_role.arn
  subnets            = data.aws_subnets.private_subnets.ids

  schedule_expression = each.value.schedule_expression

  common_tags = merge(
    local.common_tags,
    {
      project                  = "ETL",
      service                  = "ECS",
      plat_env_project_service = "${local.aggregated_tag}_ETL_ECS"
    }
  )
}
