// Copyright(C) 2019 Lars Pontoppidan. All rights reserved.
// Use of this source code is governed by an MIT license file distributed with this software package
module particle

import particle.vec2
import rand
import sokol.sgl

pub struct SystemConfig {
	pool int
}

pub struct System {
	width  int
	height int
mut:
	pool []&Particle
	bin  []&Particle
}

pub fn (mut s System) init(sc SystemConfig) {
	for i := 0; i < sc.pool; i++ {
		p := new(vec2.Vec2{f32(s.width) * 0.5, f32(s.height) * 0.5})
		s.bin << p
	}
}

pub fn (mut s System) update(dt f64) {
	mut p := &Particle(0)
	for i := 0; i < s.pool.len; i++ {
		p = s.pool[i]
		p.update(dt)
		if p.is_dead() {
			s.bin << p
			s.pool.delete(i)
		}
	}
}

pub fn (s System) draw() {
	sgl.begin_quads()
	for p in s.pool {
		p.draw()
	}
	sgl.end()
}

pub fn (mut s System) reset() {
	for i in 0 .. s.pool.len {
		mut p := s.pool[i]
		p.reset()
		p.life_time = 0
	}
	for i in 0 .. s.bin.len {
		mut p := s.pool[i]
		p.reset()
		p.life_time = 0
	}
}

pub fn (mut s System) explode(x f32, y f32) {
	mut reserve := 500
	center := vec2.Vec2{x, y}
	mut p := &Particle(0)
	for i := 0; i < s.bin.len && reserve > 0; i++ {
		p = s.bin[i]
		p.reset()
		p.location.from(center)
		p.acceleration = vec2.Vec2{rand.f32_in_range(-0.5, 0.5), rand.f32_in_range(-0.5,
			0.5)}
		p.velocity = vec2.Vec2{rand.f32_in_range(-0.5, 0.5), rand.f32_in_range(-0.5, 0.5)}
		p.life_time = rand.f64_in_range(500, 2000)
		s.pool << p
		s.bin.delete(i)
		reserve--
	}
}

pub fn (mut s System) free() {
	for p in s.pool {
		if p == 0 {
			print(ptr_str(p) + ' ouch')
			continue
		}
		unsafe { free(p) }
	}
	s.pool.clear()
	for p in s.bin {
		if p == 0 {
			print(ptr_str(p) + ' ouch')
			continue
		}
		unsafe {
			// println('Freeing from bin')
			free(p)
		}
	}
	s.bin.clear()
}