import { AssetSelectorQueryFieldBase } from '../AssetSelectorQueryFieldBase';
import { AssetSelectorQueryBuilding } from '../AssetSelectorQuery';
import { NotificationAssetEntity } from '../../../entities/notification-asset.entity';

export class AssetSelectorQueryFieldIsAttractive extends AssetSelectorQueryFieldBase {
  constructor() {
    super('isattracting');
  }

  requestProp(qb: AssetSelectorQueryBuilding): string {
    if (!qb.context.userId) {
      return '(false)';
    }
    if (!qb.joinedTableMarks.has('isattracting')) {
      qb.query.leftJoin(
        (sq) => {
          return sq
            .select(['na.project_id', 'na.asset_id'])
            .from(NotificationAssetEntity, 'na')
            .where('na.user_id = :userId AND na.viewed_at IS NULL', {
              userId: qb.context.userId,
            })
            .groupBy('na.project_id')
            .addGroupBy('na.asset_id');
        },
        'isattracting_v',
        `isattracting_v.project_id = a.project_id AND isattracting_v.asset_id = a.id`,
      );
    }
    return `(isattracting_v.asset_id IS NOT NULL)`;
  }
}
