import { atNone } from './interfaces';

import type { Primitive } from '@aurelia/kernel';
import type { AccessorType, IAccessor, ISubscribable } from './interfaces';

export class PrimitiveObserver implements IAccessor, ISubscribable {
  public get doNotCache(): true { return true; }
  public type: AccessorType = atNone;
  /** @internal */
  private readonly _obj: Primitive;
  /** @internal */
  private readonly _key: PropertyKey;

  public constructor(
    obj: Primitive,
    key: PropertyKey,
  ) {
    this._obj = obj;
    this._key = key;
  }

  public getValue(): unknown {
    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-explicit-any
    return (this._obj as any)[this._key];
  }
  public setValue(): void { /* do nothing */ }
  public subscribe(): void { /* do nothing */ }
  public unsubscribe(): void { /* do nothing */ }
}
