// package mine -- объект шахты на базе
package mine

import (
	"context"
	"fmt"
	"strconv"
	"strings"
	"time"
	"wartank/pkg/alias"
	"wartank/pkg/arena"
	"wartank/pkg/components/arena_net"
	"wartank/pkg/types"
	"wartank/server/serv_bots/warbot/stat_tank/static_param"
)

// Шахта -- объект шахты на базе
type Шахта struct {
	types.ИАрена
	сеть         types.ИАренаСеть
	лог          types.ИВебЛог
	бот          types.ИБот
	база         types.ИБаза
	руда         types.ИСтатПарам
	железо       types.ИСтатПарам
	сталь        types.ИСтатПарам
	свинец       types.ИСтатПарам
	уровень      types.ИСтатПарам
	продуктИмя   string           // Что сейчас делается
	продуктКол   types.ИСтатПарам // Сколько делается прямо сейчас
	продуктВремя string           // Сколько осталось времени прямо сейчас
	кнт          context.Context  // контекст шахты
	фнОтмена     func()           // Функция отмены шахты
}

// НовШахта -- возвращает новый *Mine
func НовШахта(база types.ИБаза) (types.ИБазаШахта, error) {
	кнт, фнОтмена := context.WithCancel(база.Контекст())
	сам := &Шахта{
		бот:        база.Бот(),
		база:       база,
		руда:       static_param.НовСтатПарам("руда"),
		железо:     static_param.НовСтатПарам("железо"),
		сталь:      static_param.НовСтатПарам("сталь"),
		свинец:     static_param.НовСтатПарам("свинец"),
		продуктКол: static_param.НовСтатПарам("свинец"),
		уровень:    static_param.НовСтатПарам("уровень"),
		кнт:        кнт,
		фнОтмена:   фнОтмена,
	}
	аренаКонфиг := arena.АренаКонфиг{
		Бот_:         сам.бот,
		АренаИмя_:    "Шахта",
		СтрКонтроль_: `<span class="green2">Руда</span><br/>`,
		ФнПуск_:      сам.пуск,
		СтрУрл_:      "https://wartank.ru/production/Mine",
	}
	сам.ИАрена = arena.НовАрена(аренаКонфиг)
	сам.лог = сам.ВебЛог()
	сам.сеть = arena_net.НовАренаСеть(сам, "https://wartank.ru/production/Mine")
	go сам.пуск()
	сам.лог.ОтклВывод()
	сам.лог.Добавить("Шахта.НовШахта(): бот=%q\n", сам.бот.Имя())
	return сам, nil
}

// пуск -- запускает обработку шахты
func (сам *Шахта) пуск() {
	фнРабота := func() {
		defer func() {
			for сам.ВремяОстат().ПолучМилСек() > 0 {
				time.Sleep(time.Second * 5)
			}
		}()
		сам.лог.Добавить("Шахта.пуск().фнРабота(): бот=%q\n", сам.бот.Имя())
		{ // Построить
			счёт := 5
			for счёт > 0 {
				еcлиНет := сам.построить()
				if еcлиНет {
					break
				}
				счёт--
			}
		}
		{ // Забрать из шахты
			счёт := 5
			for счёт > 0 { // Забрать из шахты
				if сам.шахтаЗабрать() {
					break
				}
				счёт--
			}
		}
		сам.уровеньОбновить()
		сам.ускорениеПровер()
		{ // Проапгрейдить
			счёт := 5
			for счёт > 0 {
				if сам.проапгрейдить() {
					break
				}
				счёт--
			}
		}
		{ // Получить продукцию
			счёт := 5
			for счёт > 0 {
				счёт--
				еслиПолуч, ош := сам.количествоПолучить()
				if ош != nil {
					continue
				}
				if еслиПолуч {
					break
				}
			}
		}
		сам.Сделать()
	}
	for {
		select {
		case <-сам.кнт.Done():
			return
		case <-сам.ВремяОстат().КаналСиг():
			фнРабота()
		default:
			фнРабота()
		}
	}
}

// Проверяет количество продукта в шахте
func (сам *Шахта) количествоПолучить() (bool, error) {
	сам.лог.Добавить("Шахта.количествоПолучить()\n")
	var (
		ind         int
		strOut      string
		еслиНайдено bool
		режим       string
	)
	lstMine := сам.сеть.ВебВоркер().Получ("https://wartank.ru/buildings")
	/*
		Режим (руда-1):
		<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;1</div></td>

		Время (+8 строк):
		<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;1</div></td>
	*/
	for ind, strOut = range lstMine {
		// Руда текущее
		if strings.Contains(strOut, `src="/images/icons/ore.png?2" alt="ore"`) {
			// <td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;1</div></td>
			еслиНайдено = true
			режим = "руда"
			break
		}
		// Железо текущее
		if strings.Contains(strOut, `src="/images/icons/iron.png?2" alt="iron"`) {
			// <td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/iron.png?2" alt="iron"/>&nbsp;2</div></td>
			еслиНайдено = true
			режим = "железо"
			break
		}
		// Сталь текущее
		if strings.Contains(strOut, `src="/images/icons/steel.png?2" alt="steel"`) {
			// <td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/steel.png?2" alt="iron"/>&nbsp;2</div></td>
			еслиНайдено = true
			режим = "сталь"
			break
		}
		// Свинец текущее
		if strings.Contains(strOut, `src="/images/icons/plumbum.png?2" alt="plumbum"`) {
			// <td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/plumbum.png?2" alt="iron"/>&nbsp;2</div></td>
			еслиНайдено = true
			режим = "свинец"
			break
		}
	}
	if !еслиНайдено {
		сам.лог.Добавить("Шахта.количествоПолучить(): не надо\n")
		return true, nil
	}
	switch режим {
	case "руда":
		_число := strings.TrimPrefix(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/ore.png?2" alt="ore"/>&nbsp;`)
		_число = strings.TrimSuffix(_число, `</div></td>`)
		iNum, err := strconv.Atoi(_число)
		if err != nil {
			сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): кол-во руды (%v) не число, err=\n\t%v\n", _число, err)
			return false, fmt.Errorf("")
		}
		сам.продуктКол.Уст(iNum)
		сам.продуктИмя = "руда"
		сам.лог.Добавить("Шахта.количествоПолучить(): кол-во руды = %v\n", iNum)
	case "железо":
		_число := strings.TrimPrefix(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/iron.png?2" alt="iron"/>&nbsp;`)
		_число = strings.TrimSuffix(_число, `</div></td>`)
		iNum, err := strconv.Atoi(_число)
		if err != nil {
			сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): кол-во железа (%v) не число, err=\n\t%v\n", _число, err)
			return false, fmt.Errorf("")
		}
		сам.продуктКол.Уст(iNum)
		сам.продуктИмя = "железо"
		сам.лог.Добавить("Шахта.количествоПолучить(): кол-во железа = %v\n", iNum)
	case "сталь":
		_число := strings.TrimPrefix(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/steel.png?2" alt="steel"/>&nbsp;`)
		_число = strings.TrimSuffix(_число, `</div></td>`)
		iNum, err := strconv.Atoi(_число)
		if err != nil {
			сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): кол-во стали (%v) не число, err=\n\t%v\n", _число, err)
			return false, fmt.Errorf("")
		}
		сам.продуктКол.Уст(iNum)
		сам.продуктИмя = "сталь"
		сам.лог.Добавить("Шахта.количествоПолучить(): кол-во стали = %v\n", iNum)
	case "свинец":
		_число := strings.TrimPrefix(strOut, `<td class="vam"><div class="nwr pr5 gray1"><img class="rico vm" src="/images/icons/plumbum.png?2" alt="plumbum"/>&nbsp;`)
		_число = strings.TrimSuffix(_число, `</div></td>`)
		iNum, err := strconv.Atoi(_число)
		if err != nil {
			сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): кол-во свинца (%v) не число, err=\n\t%v\n", _число, err)
			return false, fmt.Errorf("")
		}
		сам.продуктКол.Уст(iNum)
		сам.продуктИмя = "свинец"
		сам.лог.Добавить("Шахта.количествоПолучить(): кол-во свинца = %v\n", iNum)
	default:
		сам.лог.Добавить("Шахта.количествоПолучить(): неизвестный режим (%v)\n", режим)
		return false, fmt.Errorf("")
	}
	// <td><div class="value-block lh1"><span><span>00:00:34</span></span></div></td>
	strTime := lstMine[ind+3]
	// <td><div class="value-block lh1"><span><span>00:19:53</span></span></div></td>
	strTime = strings.TrimPrefix(strTime, `<td><div class="value-block lh1"><span><span>`)
	strTime = strings.TrimSuffix(strTime, `</span></span></div></td>`)
	сам.продуктВремя = strTime
	if err := сам.ОбратВремяУст(alias.Время(strTime)); err != nil {
		сам.лог.Добавить("ОШИБКА Шахта.количествоПолучить(): при установке времени производства(%v), err=\n\t%v\n", strTime, err)
	}
	сам.лог.Добавить("Шахта.количествоПолучить(): время=%q\n", strTime)
	return true, nil
}

// Проверяет на забор из шахты
func (сам *Шахта) шахтаЗабрать() bool {
	сам.лог.Добавить("Шахта.шахтаЗабрать()\n")
	var (
		strOut      string
		еслиНайдено bool
	)
	списШахта := сам.сеть.ВебВоркер().Получ("https://wartank.ru/buildings")
	// <a class="simple-but border" href="buildings?35-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink"><span><span>Забрать</span></span></a>
	for _, strOut = range списШахта {
		if strings.Contains(strOut, `.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink`) {
			еслиНайдено = true
			break
		}
	}
	if !еслиНайдено {
		сам.лог.Добавить("Шахта.шахтаЗабрать(): не надо\n")
		return true
	}
	_ссылка := strings.TrimPrefix(strOut, `<a class="simple-but border" href="`)
	_ссылка = strings.TrimSuffix(_ссылка, `"><span><span>Забрать</span></span></a>`)
	ссылка := "https://wartank.ru/" + _ссылка
	// http://wartank.ru/buildings?5-1.ILinkListener-buildings-0-building-rootBlock-actionPanel-takeProductionLink
	lstBase1 := сам.сеть.ВебВоркер().Получ(ссылка)
	if err := сам.СтрОбновить(lstBase1); err != nil {
		сам.лог.Добавить("Шахта.шахтаЗабрать(): при обновлении lstMine, err=\n\t%v\n", err)
		return false
	}
	сам.лог.Добавить("Шахта.шахтаЗабрать(): ОК\n")
	return true
}

// Проверяет ускорение строительства FIXME: не работает
func (сам *Шахта) ускорениеПровер() {
	сам.лог.Добавить("")
	списСтр := сам.сеть.ВебВоркер().Получ("http://wartank.ru/buildings")
	// <span class="green2">Шахта - 0</span><br/>
	var (
		еслиНайти bool
		стр       string
	)
	for _, стр = range списСтр {
		if strings.Contains(стр, `<span class="green2">Шахта - `) {
			еслиНайти = true
			break
		}
	}
	if !еслиНайти {
		сам.лог.Добавить("Шахта.ускорениеПровер(): не надо\n")
		return
	}
	сам.лог.Добавить("Шахта.ускорениеПровер(): надо\n")
}

// Уровень -- возвращает уровень шахты
func (сам *Шахта) Уровень() types.ИСтатПарам {
	return сам.уровень
}

// Обновляет текущий уровень шахты (может быть не построена)
func (сам *Шахта) уровеньОбновить() bool {
	сам.лог.Добавить("Шахта.уровеньОбновить()\n")
	списСтр := сам.сеть.ВебВоркер().Получ("http://wartank.ru/buildings")
	// <span class="green2">Шахта - 0</span><br/>
	var (
		еслиНайти = false
		стр       = ""
	)
	for _, стр = range списСтр {
		if strings.Contains(стр, `<span class="green2">Шахта - `) {
			еслиНайти = true
			break
		}
	}
	if !еслиНайти {
		сам.лог.Добавить("Шахта.уровеньОбновить(): нет уровня\n")
		return false
	}
	_стр := strings.TrimPrefix(стр, `<span class="green2">Шахта - `)
	_стр = strings.TrimSuffix(_стр, `</span><br/>`)
	иУровень, ош := strconv.Atoi(_стр)
	if ош != nil {
		сам.лог.Добавить("ОШИБКА Шахта.уровеньОбновить(): строка уровня сбойная, стр=%q, ош=\n\t%v\n", стр, ош)
		return false
	}
	сам.уровень.Уст(иУровень)
	сам.лог.Добавить("Шахта.уровеньОбновить(): уровень=%v\n", иУровень)
	return true
}

// Строит шахту при нулевом уровне
func (сам *Шахта) построить() bool {
	сам.лог.Добавить("Шахта.построить()\n")
	// <td style="width:50%;padding-left:1px;"><a class="simple-but border mb5" href="building-upgrade/Mine"><span><span>Построить</span></span></a></td>
	var (
		еслиНайти = false
		стр       = ""
	)
	списСтр := сам.сеть.ВебВоркер().Получ("http://wartank.ru/buildings")
	for _, стр = range списСтр {
		if strings.Contains(стр, `href="building-upgrade/Mine"><span><span>Построить</span></span>`) {
			еслиНайти = true
			break
		}
	}
	if !еслиНайти {
		сам.лог.Добавить("Шахта.построить(): не надо\n")
		return true
	}
	// Пробуем построить шахту
	_стр := strings.TrimPrefix(стр, `<td style="width:50%;padding-left:1px;"><a class="simple-but border mb5" href="`)
	_стр = strings.TrimSuffix(_стр, `"><span><span>Построить</span></span></a></td>`)
	ссылка := "https://wartank.ru/" + _стр
	списСтр = сам.сеть.ВебВоркер().Получ(ссылка)
	еслиНайти = false
	// "<a class=\"simple-but border mb5\" href=\"Mine?14-1.ILinkListener-upgradeLink-link\">"
	for _, стр = range списСтр {
		if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
			еслиНайти = true
			break
		}
	}
	if !еслиНайти {
		сам.лог.Добавить("Шахта.построить(): не найдена команда постройки\n")
		return true
	}
	_стр = strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
	_стр = strings.TrimSuffix(_стр, "\">")
	// http://wartank.ru/building-upgrade/Mine?16-1.ILinkListener-upgradeLink-link
	ссылка = "https://wartank.ru/building-upgrade/" + _стр
	_ = сам.сеть.ВебВоркер().Получ(ссылка)
	return true
}

// Пытается проапгрейдить топливный склад
func (сам *Шахта) проапгрейдить() bool {
	сам.лог.Добавить("Шахта.проапгрейдить()\n")
	var (
		еслиНайти = false
		списСтр   []string
		стр       = ""
	)
	фнКупить := func() (bool, error) {
		defer time.Sleep(time.Millisecond * 1000)
		списСтр = сам.сеть.ВебВоркер().Получ("https://wartank.ru/building-upgrade/Mine")
		for _, стр = range списСтр {
			// <a class="simple-but border mb5" href="Mine?5-1.ILinkListener-upgradeLink-link">
			if strings.Contains(стр, `ILinkListener-upgradeLink-link`) {
				еслиНайти = true
				break
			}
		}
		if !еслиНайти {
			сам.лог.Добавить("Шахта.проапгрейдить().фнКупить(): не надо\n")
			return false, nil
		}
		// Пробуем улучшить шахту
		_стр := strings.TrimPrefix(стр, "<a class=\"simple-but border mb5\" href=\"")
		_стр = strings.TrimSuffix(_стр, "\">")
		// https://wartank.ru/building-upgrade/Mine?4-1.ILinkListener-upgradeLink-link
		// <a class="simple-but border mb5" href="FuelStorage?50-1.ILinkListener-upgradeLink-link">
		ссылка := "https://wartank.ru/building-upgrade/" + _стр
		списСтр = сам.сеть.ВебВоркер().Получ(ссылка)
		// Проверить, что постройка состоялась
		for _, стр := range списСтр {
			if strings.Contains(стр, "ILinkListener-upgradeLink-link") {
				сам.лог.Добавить("ОШИБКА Шахта.проапгрейдить().фнКупить(): покупка шахты не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
				return false, fmt.Errorf("покупка шахты не прошла") // Покупка не оплачена
			}
		}
		сам.лог.Добавить("Шахта.проапгрейдить().фнКупить(): покупка шахты прошла\n")
		return true, nil
	}

	фнПодтверждение := func() bool {
		for _, стр = range списСтр {
			// <a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="../wicket/page?7-1.ILinkListener-confirmLink"><span><span>да, подтверждаю</span></span></a>
			if strings.Contains(стр, `ILinkListener-confirmLink`) {
				еслиНайти = true
				break
			}
		}
		if !еслиНайти {
			сам.лог.Добавить("Шахта.проапгрейдить().фнПодтверждение(): нет подтверждения\n")
			return true
		}
		// Пробуем построить шахту
		_стр := strings.TrimPrefix(стр, `<a class="simple-but border w50 mXa mb10" w:id="confirmLink" href="..`)
		_стр = strings.TrimSuffix(_стр, `"><span><span>да, подтверждаю</span></span></a>`)
		// https://wartank.ru/wicket/page?6-1.ILinkListener-confirmLink
		ссылка := "https://wartank.ru" + _стр
		списСтр = сам.сеть.ВебВоркер().Получ(ссылка)
		// Проверить, что постройка состоялась
		for _, стр := range списСтр {
			if strings.Contains(стр, "<title>Вы сделали слишком большую паузу</title>") {
				сам.лог.Добавить("Шахта.проапгрейдить().фнПодтверждение(): подтверждение покупка шахты не прошла\n\tlink=%v\n\tстр=\n\t%v\n", ссылка, стр)
				return false // Покупка не оплачена
			}
		}
		сам.лог.Добавить("Шахта.проапгрейдить().фнПодтверждение(): подтверждение покупка шахты прошла\n")
		return true
	}

	фнКомплекс := func() {
		сам.лог.Добавить("Шахта.проапгрейдить().фнКомплекс()\n")
		count := 5
		for count > 0 {
			еслиОк, ош := фнКупить()
			switch {
			case ош == nil && еслиОк: // покупка шахты прошла
				if фнПодтверждение() {
					return
				}
			case ош == nil && !еслиОк: // покупка шахты не нужна
				return
			case ош != nil: // ошибка при работе с сетью
				count--
			}
		}
	}
	фнКомплекс()
	return true
}

// Сделать -- вызывается с базы, если она обнаружила, что пора сделать продукцию
func (сам *Шахта) Сделать() {
	сам.сеть.Обновить()
	if err := сам.выбратьМеталл(); err != nil {
		сам.лог.Добавить("ERRO Шахта.Сделать(): при выборе продукции, err=\n\t%v\n", err)
		return
	}
	работа := сам.АренаСостояние().РаботаИмя()
	switch работа {
	case "руда":
		for !сам.рудаСделать() {
		}
	case "железо":
		for !сам.железоСделать() {
		}
	case "сталь":
		for !сам.стальСделать() {
		}
	case "свинец":
		for !сам.свинецСделать() {
		}
	default:
		сам.лог.Добавить("ERRO Шахта.Сделать(): неизвестный режим производства, режим=%q\n", работа)
	}
}

// Свинец -- возвращает объект свинца
func (сам *Шахта) Свинец() types.ИСтатПарам {
	return сам.свинец
}

// Сталь -- возвращает объект стали
func (сам *Шахта) Сталь() types.ИСтатПарам {
	return сам.сталь
}

// Железо -- возвращает объект железа
func (сам *Шахта) Железо() types.ИСтатПарам {
	return сам.железо
}

// Руда -- возвращает объект руды
func (сам *Шахта) Руда() types.ИСтатПарам {
	return сам.руда
}

// ПродуктКолСейчас -- возвращает количество производимого продукта
func (сам *Шахта) ПродуктКолСейчас() int {
	return сам.продуктКол.Получ()
}

// ПродуктИмяСейчас -- возвращает имя производимого продукта
func (сам *Шахта) ПродуктИмяСейчас() string {
	return сам.продуктИмя
}

// ПродуктВремяСейчас -- сколько осталось времени до производства продукта
func (сам *Шахта) ПродуктВремяСейчас() string {
	// сам.количествоПолучить()
	return сам.продуктВремя
	// return сам.Секция.ВремяОпрос().Стр()
}

// Выбирает продукцию по возможности произвести и её количеству
func (сам *Шахта) выбратьМеталл() error {
	var (
		диктПродукция = make(map[string]bool) // Словарь известной продукции
		lstMine       = сам.СписПолучить()
	)

	фнВыбратьПродукт := func() { // вычисляет список допустимой продукции
		диктПродукция["руда"] = true // Руда есть всегда
		диктПродукция["железо"] = false
		диктПродукция["сталь"] = false
		диктПродукция["свинец"] = false
		for _, strProd := range lstMine { // Проверить руду
			if strings.Contains(strProd, `<span class="green2">Руда</span><br/>`) {
				диктПродукция["руда"] = true
				break
			}
		}
		for _, strProd := range lstMine { // Проверить руду
			if strings.Contains(strProd, `<span class="green2">Железо</span><br/>`) {
				диктПродукция["железо"] = true
				break
			}
		}
		for _, strProd := range lstMine { // Проверить сталь
			if strings.Contains(strProd, `<span class="green2">Сталь</span><br/>`) {
				диктПродукция["сталь"] = true
				break
			}
		}
		for _, strProd := range lstMine { // Проверить свинец
			if strings.Contains(strProd, `<span class="green2">Свинец</span><br/>`) {
				диктПродукция["свинец"] = true
				break
			}
		}
	}
	фнВыбратьПродукт()
	сам.АренаСостояние().РаботаИмяУст("руда")
	руда := сам.Руда().Получ()
	железо := сам.Железо().Получ()
	if диктПродукция["железо"] {
		if руда > железо*2 {
			сам.АренаСостояние().РаботаИмяУст("железо")
		}
	}

	сталь := сам.Сталь().Получ()
	if диктПродукция["сталь"] {
		if железо > сталь*2 {
			сам.АренаСостояние().РаботаИмяУст("сталь")
		}
	}

	свинец := сам.Свинец().Получ()
	if диктПродукция["свинец"] {
		if сталь > свинец*2 {
			сам.АренаСостояние().РаботаИмяУст("свинец")
		}
	}

	return nil
}

// Создаёт руду
func (сам *Шахта) рудаСделать() bool {
	time.Sleep(time.Millisecond * 55)
	lstMine, err := сам.сеть.Get("https://wartank.ru/production/Mine")
	if err != nil {
		// log._rintf("ERRO Шахта.сделатьРуду(): при GET-команде 'начать производство руды', err=\n\t%v\n", err)
		return false
	}
	var (
		инд         int
		стрВых      string
		strTime     string
		strLink     string
		strNum      string
		еслиНайдено bool
	)
	for инд, стрВых = range lstMine {
		if strings.Contains(стрВых, `<span class="green2">Руда</span><br/>`) { // <span class="green2">Руда</span><br/>
			strNum = lstMine[инд+1]
			strTime = lstMine[инд+3]
			strLink = lstMine[инд+10]
			еслиНайдено = true
			break
		}
	}
	if !еслиНайдено {
		return false
	}
	if !strings.Contains(strLink, `>Начать производство<`) {
		return true
	}
	// "Mine?16-1.ILinkListener-productions-0-production-startProduceLink\"><span><span>Начать производство</span></span></a>"
	// "<a class=\"simple-but border\" href=\"Mine?16-1.ILinkListener-productions-0-production-startProduceLink\"><span><span>Начать производство</span></span></a>"
	_link := strings.TrimPrefix(strLink, `<a class="simple-but border" href="`)
	_link = strings.TrimSuffix(_link, "\"><span><span>Начать производство</span></span></a>")
	strLink = "https://wartank.ru/production/" + _link
	// https://wartank.ru/production/Mine?19-1.ILinkListener-productions-0-production-startProduceLink
	time.Sleep(time.Millisecond * 55)
	lstMine, err = сам.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Шахта.сделатьРуду(): при GET-команде 'начать производство руды', err=\n\t%v\n", err)
		return false
	}
	for _, стрВых = range lstMine {
		if strings.Contains(стрВых, `><span><span>Начать производство</span></span></a>`) {
			return false
		}
	}
	if err = сам.СтрОбновить(lstMine); err != nil {
		// log._rintf("ERRO Шахта.сделатьРуду(): при обновлении lstMine, err=\n\t%v\n", err)
		return false
	}
	if err := сам.ОбратВремяУст(alias.Время(strTime)); err != nil {
		сам.лог.Добавить("ERRO Шахта.сделатьРуду(): при установке времени ожидания добычи руды(%v)\n\terr=%v\n", strTime, err)
	}
	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
	strNum = lstNum[1]
	lstNum = strings.Split(strNum, `</span><br/>`)
	strNum = lstNum[0]
	iNum, err := strconv.Atoi(strNum)
	if err != nil {
		// log._rintf("ERRO Шахта.сделатьРуду(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
		return false
	}
	сам.продуктКол.Уст(iNum)
	return true
}

// Создаёт железо
func (сам *Шахта) железоСделать() bool {
	var (
		lstMine     = сам.СписПолучить()
		ind         int
		strOut      string
		strTime     string
		strLink     string
		strNum      string
		еслиНайдено bool
	)
	for ind, strOut = range lstMine {
		if strings.Contains(strOut, `<span class="green2">Железо</span><br/>`) {
			// <span class="green2">Железо</span><br/>
			strNum = lstMine[ind+1]
			// Кол-во: <span class="green2">1</span><br/>
			strTime = lstMine[ind+3]
			// <a class="simple-but border" href="Mine?4-1.ILinkListener-productions-1-production-startProduceLink"><span><span>Начать производство</span></span></a>
			strLink = lstMine[ind+10]
			еслиНайдено = true
			break
		}
	}
	if !еслиНайдено {
		return true
	}
	lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
	strLink = lstLink[1]
	lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
	strLink = "https://wartank.ru/production/" + lstLink[0]
	// https://wartank.ru/production/Mine?4-1.ILinkListener-productions-1-production-startProduceLink
	lstMine, err := сам.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO MineNet.makeFerrum(): при GET-команде 'начать производство железа', err=\n\t%v\n", err)
		return false
	}
	for _, strOut := range lstMine { // Проверка на базу
		if strings.Contains(strOut, `<title>База</title>`) {
			// log._rintf("ERRO MineNet.makeFerrum(): при обновлении lstMine найден lstBase")
			return false
		}
	}
	if err = сам.СтрОбновить(lstMine); err != nil {
		// log._rintf("ERRO MineNet.makeFerrum(): при обновлении lstMine, err=\n\t%v\n", err)
		return false
	}
	if err := сам.ОбратВремяУст(alias.Время(strTime)); err != nil {
		сам.лог.Добавить("ERRO Mine.makeFerrum(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
	}
	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
	strNum = lstNum[1]
	lstNum = strings.Split(strNum, `</span><br/>`)
	strNum = lstNum[0]
	iNum, err := strconv.Atoi(strNum)
	if err != nil {
		// log._rintf("ERRO MineNet.makeFerrum(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
		return false
	}
	сам.продуктКол.Уст(iNum)
	return true
}

// Создаёт сталь
func (сам *Шахта) стальСделать() bool {
	var (
		lstMine     = сам.СписПолучить()
		ind         int
		strOut      string
		strTime     string
		strLink     string
		strNum      string
		еслиНайдено bool
	)
	for ind, strOut = range lstMine {
		if strings.Contains(strOut, `<span class="green2">Сталь</span><br/>`) {
			strNum = lstMine[ind+1]
			strTime = lstMine[ind+3]
			strLink = lstMine[ind+10]
			еслиНайдено = true
			break
		}
	}
	if !еслиНайдено {
		return true
	}
	lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
	strLink = lstLink[1]
	lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
	strLink = "https://wartank.ru/production/" + lstLink[0]
	time.Sleep(time.Millisecond * 55)
	lstMine, err := сам.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO MineNet.makeSteel(): при GET-команде 'начать производство стали', err=\n\t%v\n", err)
		return false
	}
	for _, strOut := range lstMine { // Проверка на базу
		if strings.Contains(strOut, `<title>База</title>`) {
			// log._rintf("ERRO MineNet.makeSteel(): при обновлении lstMine найден lstBase")
			return false
		}
	}
	if err = сам.СтрОбновить(lstMine); err != nil {
		// log._rintf("ERRO MineNet.makeSteel(): при обновлении lstMine, err=\n\t%v\n", err)
		return false
	}
	if err := сам.ОбратВремяУст(alias.Время(strTime)); err != nil {
		сам.лог.Добавить("ERRO Mine.makeSteel(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
	}
	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
	strNum = lstNum[1]
	lstNum = strings.Split(strNum, `</span><br/>`)
	strNum = lstNum[0]
	iNum, err := strconv.Atoi(strNum)
	if err != nil {
		// log._rintf("ERRO MineNet.makeSteel(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
		return false
	}
	сам.продуктКол.Уст(iNum)
	return true
}

// Создаёт свинец
func (сам *Шахта) свинецСделать() bool {
	var (
		lstMine     = сам.СписПолучить()
		ind         int
		strOut      string
		strTime     string
		strLink     string
		strNum      string
		еслиНайдено bool
	)
	for ind, strOut = range lstMine {
		if strings.Contains(strOut, `<span class="green2">Свинец</span><br/>`) {
			strNum = lstMine[ind+1]
			strTime = lstMine[ind+3]
			strLink = lstMine[ind+10]
			еслиНайдено = true
			break
		}
	}
	if !еслиНайдено {
		return true
	}
	lstLink := strings.Split(strLink, `<a class="simple-but border" href="`)
	strLink = lstLink[1]
	lstLink = strings.Split(strLink, `"><span><span>Начать производство</span></span></a>`)
	strLink = "https://wartank.ru/production/" + lstLink[0]
	time.Sleep(time.Millisecond * 55)
	lstMine, err := сам.сеть.Get(strLink)
	if err != nil {
		// log._rintf("ERRO Шахта.сделатьСвинец(): при GET-команде 'начать производство стали', err=\n\t%v\n", err)
		return false
	}
	for _, strOut := range lstMine { // Проверка на базу
		if strings.Contains(strOut, `<title>База</title>`) {
			// log._rintf("ERRO Шахта.сделатьСвинец(): при обновлении lstMine найден lstBase")
			return false
		}
	}
	if err = сам.СтрОбновить(lstMine); err != nil {
		// log._rintf("ERRO Шахта.сделатьСвинец(): при обновлении lstMine, err=\n\t%v\n", err)
		return false
	}
	if err := сам.ОбратВремяУст(alias.Время(strTime)); err != nil {
		сам.лог.Добавить("ERRO Шахта.сделатьСвинец(): при установке времени производства железа(%v)\n\terr=%v\n", strTime, err)
	}
	lstNum := strings.Split(strNum, `Кол-во: <span class="green2">`)
	strNum = lstNum[1]
	lstNum = strings.Split(strNum, `</span><br/>`)
	strNum = lstNum[0]
	iNum, err := strconv.Atoi(strNum)
	if err != nil {
		// log._rintf("ERRO Шахта.сделатьСвинец(): кол-во(%v) не число, err=\n\t%v\n", strNum, err)
		return false
	}
	сам.продуктКол.Уст(iNum)
	return true
}
