package main

import (
	"log"

	"github.com/hajimehoshi/ebiten/v2/audio"
	"github.com/hajimehoshi/ebiten/v2/audio/wav"
)

const (
	SoundGunshot = iota
	SoundVampireDie1
	SoundVampireDie2
	SoundBat
	SoundPlayerHurt
	SoundPlayerDie
	SoundPickup
	SoundMunch
)

var soundMap = map[int]string{
	SoundGunshot:     "assets/audio/gunshot.wav",
	SoundVampireDie1: "assets/audio/vampiredie1.wav",
	SoundVampireDie2: "assets/audio/vampiredie2.wav",
	SoundBat:         "assets/audio/bat.wav",
	SoundPlayerHurt:  "assets/audio/playerhurt.wav",
	SoundPlayerDie:   "assets/audio/playerdie.wav",
	SoundPickup:      "assets/audio/pickup.wav",
	SoundMunch:       "assets/audio/munch.wav",
}
var soundAtlas [][]*audio.Player

var nextSound = make([]int, len(soundMap))

func loadWav(context *audio.Context, p string) (*audio.Player, error) {
	f, err := assetsFS.Open(p)
	if err != nil {
		return nil, err
	}
	defer f.Close()

	stream, err := wav.DecodeWithSampleRate(sampleRate, f)
	if err != nil {
		return nil, err
	}

	return context.NewPlayer(stream)
}

func loadStream(ctx *audio.Context, p string) (*audio.Player, error) {
	stream, err := loadWav(ctx, p)
	if err != nil {
		return nil, err
	}

	// Workaround to prevent delays when playing for the first time.
	stream.SetVolume(0)
	stream.Play()
	stream.Pause()
	stream.Rewind()

	return stream, nil
}

func loadSoundAtlas(ctx *audio.Context) [][]*audio.Player {
	atlas := make([][]*audio.Player, len(soundMap))
	var err error
	for soundID, soundPath := range soundMap {
		atlas[soundID] = make([]*audio.Player, 4)
		for i := 0; i < 4; i++ {
			atlas[soundID][i], err = loadStream(ctx, soundPath)
			if err != nil {
				log.Fatal(err)
			}
		}
	}
	return atlas
}
