/* eslint-disable @typescript-eslint/no-explicit-any */

import GLHook from './GLHook'
import TextureHook from './TextureHook'

export default class BaseHooks {
  protected _drawCalls: number = -1

  protected _maxDeltaDrawCalls: number = -1

  protected glhook?: GLHook

  protected texturehook?: TextureHook

  constructor() {}

  public attach(gl: any) {
    this.glhook = new GLHook(gl)
    this.texturehook = new TextureHook(gl)
  }

  public get drawCalls(): number {
    if (this.glhook && this.glhook.isInit) {
      return this.glhook.drawPasses
    }

    return -1
  }

  public get maxDeltaDrawCalls() {
    return this._maxDeltaDrawCalls
  }

  public get deltaDrawCalls(): number {
    if (this._drawCalls == -1) {
      this._drawCalls = this.drawCalls
      return 0
    }

    const dc: number = this.drawCalls
    const delta: number = dc - this._drawCalls
    this._drawCalls = dc
    this._maxDeltaDrawCalls = Math.max(this._maxDeltaDrawCalls, delta)
    return delta
  }

  public get maxTextureCount(): number {
    if (this.texturehook && this.texturehook.isInit)
      return this.texturehook.maxTexturesCount
    return 0
  }

  public get texturesCount(): number {
    if (this.texturehook && this.texturehook.isInit)
      return this.texturehook.currentTextureCount
    return 0
  }

  public reset(): void {
    this._maxDeltaDrawCalls = -1
    this._drawCalls = -1
    if (this.glhook) this.glhook.reset()
    if (this.texturehook) this.texturehook.reset()
  }

  public release(): void {
    if (this.glhook) this.glhook.release()
    if (this.texturehook) this.texturehook.release()
  }
}
