{{ config(
  materialized = 'incremental',
  unique_key = "address",
  incremental_strategy = 'delete+insert',
  tags = ['daily']
) }}

WITH base AS (

  SELECT
    base AS address,
    NAME AS label,
    symbol AS project_name,
    denom_units AS raw_metadata,
    '2000-01-01' :: datetime AS _inserted_timestamp
  FROM
    {{ source(
      'bronze_streamline',
      'asset_metadata_api'
    ) }}
  GROUP BY
    1,
    2,
    3,
    4
),
combo AS (
  SELECT
    address,
    label,
    project_name,
    raw_metadata [0] :aliases [0] :: STRING AS alias,
    raw_metadata [array_size(raw_metadata)-1] :exponent :: NUMBER AS DECIMAL,
    raw_metadata,
    COALESCE(
      raw_metadata [0] :aliases [0] :: STRING,
      raw_metadata [0] :denom :: STRING
    ) AS denom,
    address AS _unique_key,
    _inserted_timestamp
  FROM
    base
  UNION ALL
  SELECT
    COALESCE(
      VALUE :denom :: STRING,
      base
    ) AS address,
    NAME AS label,
    symbol AS project_name,
    VALUE :aliases :: STRING AS alias,
    VALUE :exponent :: INT AS DECIMAL,
    denom_units AS raw_metadata,
    COALESCE(
      VALUE :aliases [0] :: STRING,
      VALUE :denom :: STRING
    ) AS denom,
    address AS _unique_key,
    _inserted_timestamp
  FROM
    {{ ref('silver__github_asset_metadata') }},
    LATERAL FLATTEN(
      denom_units,
      outer => TRUE
    )
)
SELECT
  'osmosis' AS blockchain,
  address,
  'flipside' AS creator,
  'token' AS label_type,
  'token_contract' AS label_subtype,
  label,
  project_name,
  alias,
  CASE
    WHEN address = 'ibc/9A76CDF0CBCEF37923F32518FA15E5DC92B9F56128292BC4D63C4AEA76CBB110' THEN 18
    ELSE DECIMAL
  END AS DECIMAL,
  raw_metadata,
  denom,
  _unique_key,
  _inserted_timestamp,
  {{ dbt_utils.generate_surrogate_key(
    ['_unique_key']
  ) }} AS asset_metadata_id,
  SYSDATE() AS inserted_timestamp,
  SYSDATE() AS modified_timestamp,
  '{{ invocation_id }}' AS _invocation_id
FROM
  combo qualify(ROW_NUMBER() over(PARTITION BY address
ORDER BY
  _inserted_timestamp)) = 1
