package mining

import (
	"fmt"
	miningCfg "server/conf/mining"
	"server/game/mod/item"
)

type MiningMod struct {
	Id     int
	Map    map[int32]string
	Gem    []int
	Pass   int
	Mining int
}

func (m *MiningMod) InitData() {
	if m.Map == nil {
		m.Map = make(map[int32]string)
	}
}

func (m *MiningMod) Login(Id int) int {
	OldId := m.Id
	if Id == 0 {
		m.Id = 0
		return OldId
	}
	if m.Id == Id {
		return 0
	}
	m.Id = Id
	m.Map = make(map[int32]string)
	m.Gem = nil
	m.Pass = 1
	m.Mining = 0
	return OldId
}

func (m *MiningMod) ZeroUpdate(Id int) {
	m.Login(Id)
}

func (m *MiningMod) GetMap() map[int32]string {
	return m.Map
}

func (m *MiningMod) GetGem() []int {
	return m.Gem
}

func (m *MiningMod) GetPass() int {
	return m.Pass
}

func (m *MiningMod) GetMining() int {
	return m.Mining
}

func (m *MiningMod) Take(Map map[int32]string, Gem int) ([]*item.Item, error) {
	AreaNum := miningCfg.GetPassArea(m.Pass)
	if AreaNum == 0 {
		return nil, fmt.Errorf("pass is not exist")
	}
	if m.Mining+1 > AreaNum {
		return nil, fmt.Errorf("mining is full")
	}
	if Gem > 0 {
		GemList := miningCfg.GetPassGem(m.Pass)
		if len(m.Gem)+1 > len(GemList) {
			return nil, fmt.Errorf("gem is full")
		}
		m.Map = Map
		m.Mining++
		m.Gem = append(m.Gem, Gem)
		return nil, nil
	}
	m.Map = Map
	m.Mining++
	Items := miningCfg.GetRandItem()
	return Items, nil
}

func (m *MiningMod) GetReward() ([]*item.Item, int, error) {
	GemList := miningCfg.GetPassGem(m.Pass)
	if len(m.Gem) < len(GemList) {
		return nil, 0, fmt.Errorf("gem is not full")
	}
	Items := miningCfg.GetPassItem(m.Pass)
	m.Pass++
	Ming := m.Mining
	m.Mining = 0
	m.Map = nil
	m.Gem = nil
	return Items, Ming, nil
}
