import { isUUID } from 'class-validator';
import { AssetSelectorQueryFieldBase } from '../AssetSelectorQueryFieldBase';
import { AssetPropWhereValue } from '../PropsWhere';
import { ApiError } from '../../../common/error/api-error';
import { ApiErrorCodes } from '../../../common/error/api-error-codes';
import {
  AssetSelectorQueryBuilding,
  AssetSelectorQueryFieldSelector,
} from '../AssetSelectorQuery';
import { AssetScopeFromId, AssetScopeToId } from '../../../constants';

export class AssetSelectorQueryFieldScope extends AssetSelectorQueryFieldBase {
  dbField: string;

  constructor() {
    super('scope');
    this.dbField = 'a.scope_id';
  }

  requestProp(qb: AssetSelectorQueryBuilding): string {
    return this.dbField;
  }

  selectProp(
    qb: AssetSelectorQueryBuilding,
    as: string,
  ): AssetSelectorQueryFieldSelector {
    const ref = this.requestProp(qb);
    return {
      ref,
      as,
      reader: (row, res) => (res[as] = AssetScopeFromId.get(row[as])),
    };
  }

  protected prepareFilterValue(val: AssetPropWhereValue): any {
    if (val === null) return null;
    const scope_id = AssetScopeToId.get(val.toString().toLowerCase());
    if (!scope_id) {
      throw new ApiError('Unknown asset scope', ApiErrorCodes.PARAM_BAD_VALUE, {
        value: val,
      });
    }
    return scope_id;
  }
}
