package core

import (
	"errors"
	"strings"

	"git.lxtend.com/lixiangwuxian/qqbot/handler/blackjack/controller"
	"git.lxtend.com/lixiangwuxian/qqbot/handler/blackjack/view"
)

type BackJackGame struct {
	simulator *controller.BackJackSimulator
	viewer    *view.LiteralViewer
}

func NewBlackJackGame(simulator *controller.BackJackSimulator, viewer *view.LiteralViewer) *BackJackGame {
	return &BackJackGame{
		simulator: simulator,
		viewer:    viewer,
	}
}

func (game *BackJackGame) AddCommand(command string) (string, error) {
	command = strings.Split(command, " ")[0]
	response := ""
	err := error(nil)

	switch command {
	case "start":
		{
			game.simulator.Init()
			response += game.viewer.GetResponse()
			response += "[🐧] You have started a new Blackjack game.\n"
			response += "[🐧] Type hit to hit.\n"
			response += "[🐧] Type stand to stand.\n"
			response += "[🐧] Type start to restart a new game.\n"
			response += "[🐧] Type exit to leave the game.\n"
		}

	case "hit":
		{
			result := game.simulator.Hit()
			response += game.viewer.GetResponse()
			response += result.Description
			if result.Code != 200 {
				err = errors.New("game over")
			}
		}

	case "stand":
		{
			result := game.simulator.Stand()
			response += game.viewer.GetResponse()
			response += "[🐧] You decide to stand !\n"
			response += result.Description
			if result.Code != 200 {
				err = errors.New("game over")
			}
		}

	default:
		{
			response += "[🐧] Invalid command !\n"
			err = errors.New("invalid command")
		}
	}

	return response, err
}

func (game *BackJackGame) Close() {
	game.viewer = nil
	game.simulator = nil
}
