Newer
Older
pokemon-go-trade / internal / pokemon / pokemon.go
package pokemon

import (
	"fmt"
	"git.ssns.se/git/frozendragon/pokemon-go-trade/internal/db"
	"git.ssns.se/git/frozendragon/pokemon-go-trade/internal/model"
)

type Package struct {
	Db db.Interface
}

type Interface interface {
	GetAvailablePokemons() (*Pokemons, error)
	StoreHavePokemons(pokemons []model.Pokemon) error
	GetHavePokemons() ([]model.Pokemon, error)
	CreateWantGroup() error
	GetWantGroups() ([]model.WantGroup, error)
	DeleteWantGroups(id int) error
	AddPokemonWantGroup(wantGroupID int, pokemon model.Pokemon) error
}

type Pokemons struct {
	Pokemons []model.Pokemon `json:"pokemons"`
}

func (p *Package) GetAvailablePokemons() (*Pokemons, error) {
	dbPokemons, err := p.Db.GetPokemons()
	if err != nil {
		return nil, err
	}
	var pokemons Pokemons
	for _, pokemon := range dbPokemons {
		dexFound := false
		if pokemon.Region != "" {
			for i, p := range pokemons.Pokemons {
				if p.DexNumber == pokemon.DexNumber {
					pokemons.Pokemons[i].Variations = append(pokemons.Pokemons[i].Variations, model.Pokemon{
						ID:        pokemon.ID,
						Name:      pokemon.Name,
						DexNumber: pokemon.DexNumber,
						Shiny:     true,
						Url:       fmt.Sprintf("image/%s", pokemon.ShinyImageName),
					})
					pokemons.Pokemons[i].Variations = append(pokemons.Pokemons[i].Variations, model.Pokemon{
						ID:        pokemon.ID,
						Name:      pokemon.Name,
						DexNumber: pokemon.DexNumber,
						Shiny:     false,
						Url:       fmt.Sprintf("image/%s", pokemon.ImageName),
					})
					dexFound = true
					break
				}
			}
		}
		if dexFound {
			continue
		}
		if pokemon.ShinyEnabled {
			pokemons.Pokemons = append(pokemons.Pokemons, model.Pokemon{
				ID:        pokemon.ID,
				Name:      pokemon.Name,
				DexNumber: pokemon.DexNumber,
				Shiny:     true,
				Url:       fmt.Sprintf("image/%s", pokemon.ShinyImageName),
				Variations: []model.Pokemon{
					{
						ID:        pokemon.ID,
						Name:      pokemon.Name,
						DexNumber: pokemon.DexNumber,
						Shiny:     false,
						Url:       fmt.Sprintf("image/%s", pokemon.ImageName),
					},
				},
			})
		} else {
			pokemons.Pokemons = append(pokemons.Pokemons, model.Pokemon{
				ID:         pokemon.ID,
				DexNumber:  pokemon.DexNumber,
				Shiny:      false,
				Url:        fmt.Sprintf("image/%s", pokemon.ImageName),
				Variations: []model.Pokemon{},
			})
		}

	}
	return &pokemons, nil
}

func (p *Package) GetHavePokemons() ([]model.Pokemon, error) {
	pokemons := []model.Pokemon{}
	dbPokemons, err := p.Db.GetHavePokemons()
	if err != nil {
		return nil, err
	}
	for _, dbPokemon := range dbPokemons {
		pokemon := model.Pokemon{
			ID:        dbPokemon.ID,
			DexNumber: dbPokemon.DexNumber,
			Name:      dbPokemon.Name,
			Shiny:     dbPokemon.ShinyEnabled,
		}
		if dbPokemon.ShinyEnabled {
			pokemon.Url = dbPokemon.ShinyImageName
		} else {
			pokemon.Url = dbPokemon.ImageName
		}
		pokemon.FormatUrl()
		pokemons = append(pokemons, pokemon)
	}
	return pokemons, nil
}

func (p *Package) StoreHavePokemons(pokemons []model.Pokemon) error {
	var havePokemons []db.HavePokemon
	for _, pokemon := range pokemons {
		havePokemons = append(havePokemons, db.HavePokemon{
			PokemonID: pokemon.ID,
			Shiny:     pokemon.Shiny,
		})
	}
	return p.Db.StoreHavePokemons(havePokemons)
}

func (p *Package) CreateWantGroup() error {
	return p.Db.CreateWantGroup(model.WantGroup{
		GroupName: "want group",
	})
}

func (p *Package) GetWantGroups() ([]model.WantGroup, error) {
	wantGroups, err := p.Db.GetWantGroups()
	if err != nil {
		return nil, err
	}
	for i, wantGroup := range wantGroups {
		dbPokemons, err := p.Db.GetWantPokemonByWantGroup(wantGroup.ID)
		if err != nil {
			return nil, err
		}
		pokemons := []model.Pokemon{}
		for _, dbPokemon := range dbPokemons {
			pokemon := model.Pokemon{
				ID:        dbPokemon.ID,
				Name:      dbPokemon.Name,
				DexNumber: dbPokemon.DexNumber,
				Shiny:     true,
				Url:       fmt.Sprintf("image/%s", dbPokemon.ShinyImageName),
			}
			pokemons = append(pokemons, pokemon)
		}

		wantGroups[i].Pokemons = pokemons
	}
	return wantGroups, nil
}

func (p *Package) DeleteWantGroups(id int) error {
	return p.Db.DeleteWantGroup(id)
}

func (p *Package) AddPokemonWantGroup(wantGroupID int, pokemon model.Pokemon) error {
	return p.Db.CreateWantPokemon(model.WantPokemon{
		PokemonID:   pokemon.ID,
		WantGroupID: wantGroupID,
		Shiny:       pokemon.Shiny,
	})
}