package server

import (
	"music-server/internal/backend"
	"net/http"
	"os"

	"github.com/labstack/echo/v4"
)

type MusicHandler struct {
}

func NewMusicHandler() *MusicHandler {
	return &MusicHandler{}
}

func (m *MusicHandler) GetSong(ctx echo.Context) error {
	song := ctx.QueryParam("song")
	if song == "" {
		return ctx.String(http.StatusBadRequest, "song can't be empty")
	}
	songPath := backend.GetSong(song)
	file, err := os.Open(songPath)
	if err != nil {
		return echo.NewHTTPError(http.StatusNotFound, err)
	}
	defer file.Close()
	return ctx.Stream(http.StatusOK, "audio/mpeg", file)
}

func (m *MusicHandler) GetSoundCheckSong(ctx echo.Context) error {
	songPath := backend.GetSoundCheckSong()
	file, err := os.Open(songPath)
	if err != nil {
		return echo.NewHTTPError(http.StatusNotFound, err)
	}
	defer file.Close()
	return ctx.Stream(http.StatusOK, "audio/mpeg", file)
}

func (m *MusicHandler) ResetMusic(ctx echo.Context) error {
	backend.Reset()
	return ctx.NoContent(http.StatusOK)
}

func (m *MusicHandler) GetRandomSong(ctx echo.Context) error {
	songPath := backend.GetRandomSong()
	file, err := os.Open(songPath)
	if err != nil {
		return echo.NewHTTPError(http.StatusNotFound, err)
	}
	defer file.Close()
	return ctx.Stream(http.StatusOK, "audio/mpeg", file)
}

func (m *MusicHandler) GetRandomSongLowChance(ctx echo.Context) error {
	songPath := backend.GetRandomSongLowChance()
	file, err := os.Open(songPath)
	if err != nil {
		return echo.NewHTTPError(http.StatusNotFound, err)
	}
	defer file.Close()
	return ctx.Stream(http.StatusOK, "audio/mpeg", file)
}

func (m *MusicHandler) GetRandomSongClassic(ctx echo.Context) error {
	songPath := backend.GetRandomSongClassic()
	file, err := os.Open(songPath)
	if err != nil {
		return echo.NewHTTPError(http.StatusNotFound, err)
	}
	defer file.Close()
	return ctx.Stream(http.StatusOK, "audio/mpeg", file)
}

func (m *MusicHandler) GetSongInfo(ctx echo.Context) error {
	song := backend.GetSongInfo()
	return ctx.JSON(http.StatusOK, song)
}

func (m *MusicHandler) GetPlayedSongs(ctx echo.Context) error {
	songList := backend.GetPlayedSongs()
	return ctx.JSON(http.StatusOK, songList)
}

func (m *MusicHandler) GetNextSong(ctx echo.Context) error {
	songPath := backend.GetNextSong()
	file, err := os.Open(songPath)
	if err != nil {
		return echo.NewHTTPError(http.StatusNotFound, err)
	}
	defer file.Close()
	return ctx.Stream(http.StatusOK, "audio/mpeg", file)
}

func (m *MusicHandler) GetPreviousSong(ctx echo.Context) error {
	songPath := backend.GetPreviousSong()
	file, err := os.Open(songPath)
	if err != nil {
		return echo.NewHTTPError(http.StatusNotFound, err)
	}
	defer file.Close()
	return ctx.Stream(http.StatusOK, "audio/mpeg", file)
}

func (m *MusicHandler) GetAllGames(ctx echo.Context) error {
	gameList := backend.GetAllGames()
	return ctx.JSON(http.StatusOK, gameList)
}

func (m *MusicHandler) GetAllGamesRandom(ctx echo.Context) error {
	gameList := backend.GetAllGamesRandom()
	return ctx.JSON(http.StatusOK, gameList)
}

type played struct {
	Song int
}

func (m *MusicHandler) PutPlayed(ctx echo.Context) error {
	var played played
	err := ctx.Bind(&played)
	if err != nil {
		return ctx.JSON(http.StatusBadRequest, err)
	}
	backend.SetPlayed(played.Song)
	return ctx.NoContent(http.StatusOK)
}

func (m *MusicHandler) AddLatestToQue(ctx echo.Context) error {
	backend.AddLatestToQue()
	return ctx.NoContent(http.StatusOK)
}

func (m *MusicHandler) AddLatestPlayed(ctx echo.Context) error {
	backend.AddLatestPlayed()
	return ctx.NoContent(http.StatusOK)
}
