import { AssetSelectorQueryFieldBase } from '../AssetSelectorQueryFieldBase';
import { AssetPropWhereOp, AssetPropWhereOpKind } from '../PropsWhere';
import { AssetSelectorQueryBuilding } from '../AssetSelectorQuery';
import { ApiError } from '../../../common/error/api-error';
import { ApiErrorCodes } from '../../../common/error/api-error-codes';
import { WhereExpressionBuilder } from 'typeorm';

export class AssetSelectorQueryFieldQuery extends AssetSelectorQueryFieldBase {
  constructor() {
    super('query');
    this.allowSelect = false;
  }

  where(
    qb: AssetSelectorQueryBuilding,
    qwhere: WhereExpressionBuilder,
    cond_op: AssetPropWhereOp,
  ): void {
    switch (cond_op.op) {
      case AssetPropWhereOpKind.EQUAL:
      case AssetPropWhereOpKind.EQUAL_NOT: {
        const param_num = ++qb.namesCounter;
        const op =
          cond_op.op === AssetPropWhereOpKind.EQUAL ? 'ILIKE' : 'NOT ILIKE';
        qwhere.andWhere(`a.title ${op} :val${param_num}`, {
          [`val${param_num}`]: '%' + cond_op.v.toString() + '%',
        });
        break;
      }
      case AssetPropWhereOpKind.LIKE:
      case AssetPropWhereOpKind.LIKE_NOT: {
        const param_num = ++qb.namesCounter;
        const op =
          cond_op.op === AssetPropWhereOpKind.LIKE ? 'ILIKE' : 'NOT ILIKE';
        qwhere.andWhere(`a.title ${op} :val${param_num}`, {
          [`val${param_num}`]: cond_op.v.toString(),
        });
        break;
      }
      default:
        throw new ApiError(
          `Asset filter type is not supported for prop`,
          ApiErrorCodes.PARAM_BAD_VALUE,
          {
            prop: this.name,
            value: cond_op,
          },
        );
    }
  }
}
