import { MigrationInterface, QueryRunner } from 'typeorm';

export class fixImsStringFuncForEnum1703852512903
  implements MigrationInterface
{
  public async up(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(`
    create or replace function imc_to_string(jsonb) returns character varying
        immutable
        strict
        parallel safe
        language sql
    as
    $$
    SELECT CASE jsonb_typeof($1)
        WHEN 'object' THEN
            CASE
            WHEN $1 ? 'assetId' THEN
                '[' || (COALESCE($1->>'title', $1 ->> 'name', '')) || '](#asset:' || ($1->>'assetId') || ')'
            WHEN $1 ? 'accountId' THEN
                '[' || (COALESCE($1 ->> 'name', '')) || '](#account:' ||  ($1 ->> 'accountId') || ')'
            WHEN $1 ? 'blob' THEN
                '[](#blob:' || (COALESCE($1 ->> 'type', '')) || ':' || ($1 ->> 'blob') || ')'
            WHEN $1 ? 'taskNum' THEN
                                '[](#task:' || ($1 ->> 'taskNum') || ')'
            WHEN $1 ? 'enum' THEN
                    COALESCE($1 ->> 'title', $1 ->> 'name')
            WHEN $1 ? 'str' THEN
                    ($1 ->> 'str')
            ELSE $1::varchar
            END
        WHEN 'array' THEN 'array[' || jsonb_array_length($1) || ']'
        WHEN 'string' THEN ($1->>0)::varchar
        WHEN 'number' THEN ($1->>0)::varchar
        WHEN 'boolean' THEN imc_to_string(($1->>0)::boolean)
        END;
    $$;        
`);
    await queryRunner.query(
      `
              UPDATE asset_blocks
              SET props = $1
              WHERE asset_id = $2 AND project_id = 1 AND block_key = 1
          `,
      [
        JSON.stringify({
          '\\fields': [0],
          '\\fields\\0': null,
          '\\fields\\0\\name': 'name',
          '\\fields\\0\\type': 'nameTitle',
          '\\fields\\0\\title': '[[t:EnumItemTitle]]',
        }),
        '00000000-0000-0000-0000-000000000022',
      ],
    );
    await queryRunner.query(
      `
              UPDATE asset_block_comps
              SET computed_at = NULL
              WHERE asset_id = '00000000-0000-0000-0000-000000000022' AND project_id = 1 AND block_key = 1
          `,
    );
  }

  public async down(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(`
    create or replace function imc_to_string(jsonb) returns character varying
        immutable
        strict
        parallel safe
        language sql
    as
    $$
        SELECT CASE jsonb_typeof($1)
            WHEN 'object' THEN
                CASE
                WHEN $1 ? 'assetId' THEN
                    '[' || (COALESCE($1->>'title', $1 ->> 'name', '')) || '](#asset:' || ($1->>'assetId') || ')'
                WHEN $1 ? 'accountId' THEN
                    '[' || (COALESCE($1 ->> 'name', '')) || '](#account:' ||  ($1 ->> 'accountId') || ')'
                WHEN $1 ? 'blob' THEN
                    '[](#blob:' || (COALESCE($1 ->> 'type', '')) || ':' || ($1 ->> 'blob') || ')'
                WHEN $1 ? 'taskNum' THEN
                                    '[](#task:' || ($1 ->> 'taskNum') || ')'
                WHEN $1 ? 'enum' THEN
                        ($1 ->> 'title')
                WHEN $1 ? 'str' THEN
                        ($1 ->> 'str')
                ELSE $1::varchar
                END
            WHEN 'array' THEN 'array[' || jsonb_array_length($1) || ']'
            WHEN 'string' THEN ($1->>0)::varchar
            WHEN 'number' THEN ($1->>0)::varchar
            WHEN 'boolean' THEN imc_to_string(($1->>0)::boolean)
            END;
    $$;        
`);
    await queryRunner.query(
      `
                  UPDATE asset_blocks
                  SET props = $1
                  WHERE asset_id = $2 AND project_id = 1 AND block_key = 1
              `,
      [
        JSON.stringify({
          '\\fields': [0, 1],
          '\\fields\\0': null,
          '\\fields\\1': null,
          '\\fields\\0\\name': 'name',
          '\\fields\\0\\type': 'string',
          '\\fields\\1\\name': 'title',
          '\\fields\\1\\type': 'string',
          '\\fields\\0\\title': '[[t:EnumItemName]]',
          '\\fields\\1\\title': '[[t:EnumItemTitle]]',
        }),
        '00000000-0000-0000-0000-000000000022',
      ],
    );
    await queryRunner.query(
      `
                  UPDATE asset_block_comps
                  SET computed_at = NULL
                  WHERE asset_id = '00000000-0000-0000-0000-000000000022' AND project_id = 1 AND block_key = 1
              `,
    );
  }
}
