import { MigrationInterface, QueryRunner } from 'typeorm';

export class updateFuncsForEnumPropValue1701586785455
  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
                            ($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;
            $$;        
        `);
  }

  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 ? '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;
            $$;        
        `);
  }
}
