class IMICRTS
  class ParticleEmitter
    def initialize(position:, direction: CyberarmEngine::Vector.up, time_to_live: 1000, particle_time_to_live: 500, speed: 10.0, max_particles: 128, frequency: 10.0, images: [], color: Gosu::Color::WHITE.dup, jitter: 10.0, emitting: true)
      @position = position
      @direction = direction
      @time_to_live = time_to_live
      @particle_time_to_live = particle_time_to_live
      @speed = speed
      @max_particles = max_particles
      @frequency = frequency
      @images = images
      @color = color
      @jitter = jitter
      @emitting = emitting

      @born_at = Gosu.milliseconds
      @last_emitted_at = 0
      @particles = []
      @factor = CyberarmEngine::Vector.new(1.0 ,1.0)

      setup
    end

    def setup
    end

    def emit
      dir = @direction.clone
      dir.x = rand(-@jitter.to_f..@jitter.to_f) * 1
      dir.normalized

      @particles << Particle.new(
        position: @position, direction: dir,
        factor: @factor.clone, angle: rand(360.0),
        speed: @speed, time_to_live: @particle_time_to_live, image: @images.sample,
        color: @color.dup
      )

      @last_emitted_at = Gosu.milliseconds
    end

    def draw
      @particles.each(&:draw)
    end

    def update
      if @particles.count < @max_particles && Gosu.milliseconds >= @last_emitted_at + (1000.0 / @frequency)
        emit if emit?
      end

      @particles.each do |particle|
        @particles.delete(particle) if particle.die?
        particle.update
      end
    end

    def emitting=(boolean)
      @emitting= !!boolean
    end

    def emit?
      @emitting
    end

    def die?
      Gosu.milliseconds >= @born_at + @time_to_live
    end
  end

  class Particle
    attr_accessor :position, :direction, :factor, :angle, :speed, :time_to_live, :image, :color, :born_at
    def initialize(position:, direction:, factor:, angle:, speed:, time_to_live:, image:, color:)
      @position = position
      @direction = direction
      @factor = factor
      @angle = angle
      @speed = speed
      @time_to_live = time_to_live
      @image = image
      @color = color

      @born_at = Gosu.milliseconds
    end

    def draw
      @image.draw_rot(*@position.to_a[0..2], @angle, 0.5, 0.5, @factor.x, @factor.y, @color)
    end

    def update
      @position -= (@direction * @speed) * $window.dt
    end

    def die?
      Gosu.milliseconds >= @born_at + @time_to_live
    end
  end
end

Dir.glob("#{IMICRTS::GAME_ROOT_PATH}/lib/particle_emitters/**/*.rb").each do |emitter|
  require_relative emitter
end