// package web_gui -- веб-сервер для графики
package web_gui

import (
	"fmt"
	"net/http"
	"strconv"
	"wartank/pkg/alias"
	"wartank/pkg/components/kernel/logger"
	"wartank/pkg/types"

	"github.com/gofiber/fiber/v2"
)

// ВебГип -- веб-сервер для графики
type ВебГуи struct {
	серв   types.ИСервер
	файбер *fiber.App
	лог    *logger.Логгер
}

// НовВебГуи -- возвращает новый веб-сервер для графики
func НовВебГуи(вебСервер types.ИВебСервер) *ВебГуи {
	лог := logger.НовЛоггер("ВебГуи")
	лог.Паника(вебСервер == nil, "НовВебГуи(): ИВебСервер==nil")
	сам := &ВебГуи{
		серв:   вебСервер.Сервер(),
		файбер: вебСервер.Файбер(),
		лог:    лог,
	}
	сам.файбер.Get("/", сам.индекс)
	сам.файбер.Get("/gui/login", сам.логин)
	сам.файбер.Get("/gui/list_bot", сам.кукиПроверить, сам.списокБотов)
	сам.файбер.Get("/gui/add_bot", сам.кукиПроверить, сам.гетБотНов)
	сам.файбер.Get("/gui/bot/:number/state", сам.кукиПроверить, сам.состояниеБота)
	return сам
}

// Показывает состояние бота по имени
func (сам *ВебГуи) состояниеБота(кнт *fiber.Ctx) error {
	сам.лог.Отладка("ВебГуи.состояниеБота()\n")
	стрНомер := кнт.Params("number")
	иНомер, ош := strconv.Atoi(стрНомер)
	if ош != nil {
		return кнт.Render("list_bot", fiber.Map{
			"Title": "WarTank",
			"err":   fmt.Sprintf("ВебГуи.состояниеБота(): ошибка декодирования имени бота: %v", ош.Error()),
		})
	}
	ботНомер := alias.БотНомер(иНомер)
	сам.лог.Отладка("ВебГуи.состояниеБота(): ботНомер=%d\n", стрНомер)
	бот := сам.серв.ServBots().Get(ботНомер)
	if бот == nil {
		return кнт.Render("list_bot", fiber.Map{
			"Title": "WarTank",
			"err":   "Бот не найден",
		})
	}
	уровень := бот.Ангар().База().Шахта().Уровень()
	стрУровень := fmt.Sprint(уровень.Получ())
	return кнт.Render("state_bot", fiber.Map{
		"Title":   "WarTank",
		"имя":     бот.Имя(),
		"number":  бот.Номер(),
		"топливо": бот.Ангар().Топливо().Получ(),
		"золото":  бот.Ангар().Золото().Получ(),
		"серебро": бот.Ангар().СереброВсего().Получ(),
		"слава":   бот.Ангар().Конвой().Слава().Получ(),

		"атака":     бот.Стата().Атака().Получ(),
		"броня":     бот.Стата().Броня().Получ(),
		"точность":  бот.Стата().Точность().Получ(),
		"прочность": бот.Стата().Прочность().Получ(),
		"мощь":      бот.Стата().Мощь().Получ(),

		"шахта_уровень":       стрУровень,
		"шахта_режим":         бот.Ангар().База().Шахта().АренаСостояние().Состояние(),
		"шахта_сделать_кол":   бот.Ангар().База().Шахта().ПродуктКолСейчас(),
		"шахта_сделать_назв":  бот.Ангар().База().Шахта().ПродуктИмяСейчас(),
		"шахта_сделать_время": бот.Ангар().База().Шахта().ПродуктВремяСейчас(),

		"полигон_уровень":       fmt.Sprintf("%v", бот.Ангар().База().Полигон().Уровень().Получ()),
		"полигон_режим":         fmt.Sprintf("%v", бот.Ангар().База().Полигон().АренаСостояние().Состояние()),
		"полигон_сделать_кол":   fmt.Sprintf("%v", бот.Ангар().База().Полигон().ПродуктКолСейчас()),
		"полигон_сделать_назв":  бот.Ангар().База().Полигон().ПродуктИмяСейчас(),
		"полигон_сделать_время": бот.Ангар().База().Полигон().ПродуктВремяСейчас(),

		"оружейная_режим":  бот.Ангар().База().Арсенал().АренаСостояние().Состояние(),
		"оружейная_работа": бот.Ангар().База().Арсенал().АренаСостояние().РаботаИмя(),
		"оружейная_время":  бот.Ангар().База().Арсенал().ВремяОстат().String(),
		"оружейная_ремки":  бот.Ангар().База().Арсенал().Ремки().Получ(),
		"оружейная_кумул":  бот.Ангар().База().Арсенал().Кумулятивы().Получ(),
	})
}

// Показывает страницу добавления бота
func (сам *ВебГуи) гетБотНов(кнт *fiber.Ctx) error {
	сам.лог.Отладка("ВебГуи.гетБотНов()\n")
	return кнт.Render("add_bot", fiber.Map{
		"Title": "WarTank",
	})
}

// Возвращает страницу со списком ботов
func (сам *ВебГуи) списокБотов(кнт *fiber.Ctx) error {
	сам.лог.Отладка("ВебГуи.списокБотов()\n")
	списокБотов := сам.серв.ServBots().ListBot()
	списокБот := make(map[alias.БотНомер]string, 0)
	for _, бот := range списокБотов {
		списокБот[бот.Номер()] = бот.Имя()
	}
	return кнт.Render("list_bot", fiber.Map{
		"Title": "WarTank",
		"bots":  списокБот,
	})
}

// Возвращает индексную страницу
func (сам *ВебГуи) индекс(кнт *fiber.Ctx) error {
	сам.лог.Отладка("ВебГуи.индекс()\n")
	имя := кнт.Cookies("login")
	if имя != "svi" {
		return кнт.Redirect("/gui/login", http.StatusSeeOther)
	}
	return кнт.Redirect("/gui/list_bot", http.StatusSeeOther)
}

// Возвращает страницу логина
func (сам *ВебГуи) логин(кнт *fiber.Ctx) error {
	сам.лог.Отладка("ВебГуи.логин()\n")
	return кнт.Render("login", fiber.Map{
		"Title": "WarTank",
		"err":   "Неправильный логин",
	})
}

// Проверка на куки
func (сам *ВебГуи) кукиПроверить(кнт *fiber.Ctx) error {
	сам.лог.Отладка("ВебГуи.кукиПроверить()\n")
	имя := кнт.Cookies("login")
	if имя != "svi" {
		return кнт.Redirect("/gui/login", http.StatusSeeOther)
	}
	return кнт.Next()
}
