// ExpeditionManager.cs - логика отправки экспедиций и мест для экспедиций
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;

public class ExpeditionManager : MonoBehaviour
{
    public static ExpeditionManager Instance { get; private set; }

    public GameObject expeditionPanel;
    public GameObject expeditionConditionsPanel;
    public GameObject expInfoPanel;
    public Transform expeditionListContent;
    public GameObject expeditionItemPrefab;

    public Button ExpeditionsButton; // Кнопка открытия панели экспедиций
    public Button sendExpeditionButton; // Кнопка отправки экспедиции
    public Button closeConditionsButton; // Кнопка закрытия панели условий
    public Button okResultButton; // Кнопка "ОК" на панели результатов

    public List<ExpeditionLocation> locations = new List<ExpeditionLocation>();
    private List<Expedition> activeExpeditions = new List<Expedition>();

    private ExpeditionLocation currentLocation; // Текущее место экспедиции
    private Scrollbar currentExpeditionProgress; // Scrollbar для текущей экспедиции

    void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
        }
        else
        {
            Destroy(gameObject);
        }
    }

    void Start()
    {
        // Назначаем обработчик:
        ExpeditionsButton.onClick.AddListener(ToggleExpeditionPanel);
    }

    public void AddNewLocation(ExpeditionLocation location)
    {
        locations.Add(location);
        DisplayLocations();
    }

    public void DisplayLocations()
    {
        expeditionPanel.SetActive(true); // Открываем панель экспедиций

        // Очистка предыдущего списка
        foreach (Transform child in expeditionListContent)
        {
            Destroy(child.gameObject);
        }

        // Отображение мест
        foreach (ExpeditionLocation location in locations)
        {
            GameObject listItem = Instantiate(expeditionItemPrefab, expeditionListContent);

            TextMeshProUGUI locationNameText = listItem.transform.Find("LocationName").GetComponent<TextMeshProUGUI>();
            TextMeshProUGUI locationDescriptionText = listItem.transform.Find("LocationDescription").GetComponent<TextMeshProUGUI>();
            Button detailsButton = listItem.transform.Find("DetailsButton").GetComponent<Button>();
            Scrollbar expeditionProgress = listItem.transform.Find("ExpeditionProgress").GetComponent<Scrollbar>();

            locationNameText.text = location.name;
            locationDescriptionText.text = location.description;

            // Назначаем функцию ShowExpeditionConditions для кнопки DetailsButton
            detailsButton.onClick.AddListener(() => ShowExpeditionConditions(location, expeditionProgress));

            // Скрываем Scrollbar, пока экспедиция не запущена
            expeditionProgress.gameObject.SetActive(false);
        }
    }

    public void ShowExpeditionConditions(ExpeditionLocation location, Scrollbar expeditionProgress)
    {
        expeditionConditionsPanel.SetActive(true);

        // СНАЧАЛА НАХОДИМ ВСЕ КОМПОНЕНТЫ:
        TextMeshProUGUI locationNameText = expeditionConditionsPanel.transform.Find("LocationNameText").GetComponent<TextMeshProUGUI>();
        TextMeshProUGUI locationDescriptionText = expeditionConditionsPanel.transform.Find("LocationDescriptionText").GetComponent<TextMeshProUGUI>();
        TextMeshProUGUI populationCostText = expeditionConditionsPanel.transform.Find("PopulationCostText").GetComponent<TextMeshProUGUI>();
        TextMeshProUGUI foodCostText = expeditionConditionsPanel.transform.Find("FoodCostText").GetComponent<TextMeshProUGUI>();
        TextMeshProUGUI weaponsCostText = expeditionConditionsPanel.transform.Find("WeaponsCostText").GetComponent<TextMeshProUGUI>();
        TextMeshProUGUI durationText = expeditionConditionsPanel.transform.Find("DurationText").GetComponent<TextMeshProUGUI>();

        // ПОТОМ ИСПОЛЬЗУЕМ ИХ:
        locationNameText.text = location.name;
        locationDescriptionText.text = location.description;
        populationCostText.text = $"Люди: {location.populationCost}";
        foodCostText.text = $"Еда: {location.foodCost}";
        weaponsCostText.text = $"Оружие: {location.weaponsCost}";
        durationText.text = $"Время: {location.duration} дней";

        // Поиск и назначение функции кнопки "Send"
        sendExpeditionButton = expeditionConditionsPanel.transform.Find("SendButton").GetComponent<Button>();
        sendExpeditionButton.onClick.AddListener(SendExpedition);

        // Поиск и назначение функции кнопки "Close"
        closeConditionsButton = expeditionConditionsPanel.transform.Find("CloseButton").GetComponent<Button>();
        closeConditionsButton.onClick.AddListener(CloseConditionsPanel);

        // Сохраняем текущие location и expeditionProgress
        currentLocation = location;
        currentExpeditionProgress = expeditionProgress;
    }

    private void SendExpedition()
    {
        StartExpedition(currentLocation, currentExpeditionProgress);
        expeditionConditionsPanel.SetActive(false);
    }

    private void StartExpedition(ExpeditionLocation location, Scrollbar expeditionProgress)
    {
        // Проверка ресурсов
        if (GameManager.Instance.population >= location.populationCost &&
            GameManager.Instance.resources.food >= location.foodCost &&
            GameManager.Instance.resources.weapons >= location.weaponsCost)
        {
            // Вычитаем ресурсы
            GameManager.Instance.resources.food -= location.foodCost;
            GameManager.Instance.resources.weapons -= location.weaponsCost;

            // Создаем экспедицию и добавляем в список активных
            Expedition expedition = new Expedition(location, expeditionProgress);
            activeExpeditions.Add(expedition);

            // Запускаем корутину экспедиции
            StartCoroutine(RunExpedition(expedition));
        }
        else
        {
            // Недостаточно ресурсов
            NotificationManager.Instance.ShowNotification("Недостаточно ресурсов для отправки экспедиции!", NotificationType.Bad);
        }
    }

    private IEnumerator RunExpedition(Expedition expedition)
    {
        // Активируем Scrollbar и устанавливаем значение 0
        expedition.progressBar.gameObject.SetActive(true);
        expedition.progressBar.size = 0f;

        float elapsedTime = 0f;

        while (elapsedTime < expedition.location.duration * Calendar.Instance.dayLength)
        {
            // Обновляем Scrollbar
            expedition.progressBar.size = elapsedTime / (expedition.location.duration * Calendar.Instance.dayLength);

            elapsedTime += Time.deltaTime;
            yield return null;
        }

        // Экспедиция завершена, удаляем из списка активных
        activeExpeditions.Remove(expedition);

        // Определяем результат экспедиции
        bool success = Random.value < expedition.location.successChance;
        ShowExpeditionResult(expedition.location, success);

        // Скрываем Scrollbar
        expedition.progressBar.gameObject.SetActive(false);
    }

    private void ShowExpeditionResult(ExpeditionLocation location, bool success)
    {
        expInfoPanel.SetActive(true);

        TextMeshProUGUI expResultText = expInfoPanel.transform.Find("ExpResultText").GetComponent<TextMeshProUGUI>();

        if (success)
        {
            expResultText.text = $"Экспедиция в {location.name} завершилась успешно!\n" +
                                  $"Добыто:\n" +
                                  $"{location.reward.buildingMaterials} стройматериалов\n" +
                                  $"{location.reward.food} еды\n" +
                                  $"{location.reward.gold} монет\n" +
                                  $"{location.reward.weapons} оружия";

            // Добавляем награду к ресурсам игрока:
            GameManager.Instance.resources.buildingMaterials += location.reward.buildingMaterials;
            GameManager.Instance.resources.food += location.reward.food;
            GameManager.Instance.resources.gold += location.reward.gold;
            GameManager.Instance.resources.weapons += location.reward.weapons;
            // Возвращаем людей
            GameManager.Instance.population += location.populationCost;

            // ОБНОВЛЯЕМ UI РЕСУРСОВ И НАСЕЛЕНИЯ:
            GameManager.Instance.resources.UpdateResourceUI();
            GameManager.Instance.UpdatePopulationText();
        }
        else
        {
            expResultText.text = $"Экспедиция в {location.name} провалена!\n" +
                                  $"Отправленные люди погибли.";

            // ДОБАВЛЯЕМ ЛОГИКУ ПОТЕРЬ:
            GameManager.Instance.population -= location.populationCost;
            HistoryManager.Instance.AddHistoryEntry($"Экспедиция в {location.name} провалена! Потери: {location.populationCost} человек.");
            GameManager.Instance.UpdatePopulationText();
        }

        // НАХОДИМ КНОПКУ И НАЗНАЧАЕМ ФУНКЦИЮ:
        okResultButton = expInfoPanel.transform.Find("OKButton").GetComponent<Button>();
        okResultButton.onClick.AddListener(CloseResultPanel);
    }

    private void CloseConditionsPanel()
    {
        expeditionConditionsPanel.SetActive(false);
    }

    public void CloseResultPanel()
    {
        expInfoPanel.SetActive(false);
    }
    public void ToggleExpeditionPanel()
    {
        expeditionPanel.SetActive(!expeditionPanel.activeSelf);
    }

    // Класс для хранения данных об активной экспедиции
    private class Expedition
    {
        public ExpeditionLocation location;
        public Scrollbar progressBar;

        public Expedition(ExpeditionLocation location, Scrollbar progressBar)
        {
            this.location = location;
            this.progressBar = progressBar;
        }
    }
}

У меня присутвует проблема, с вычетом ресурсов экспедиции в ExpeditionManager.cs, ПЕРВЫЙ РАЗ ЕСЛИ МЫ ОТПРАВЛЯЕМ ЭКСПЕДИЦИЮ и она кончается УСПЕХОМ, то всё срабатывает по моей задумке и условие затраты населия на отправку в эскпедицию (PopulationCost) не отнимается (ОНО ДОЛЖНО ОТНИМАТЬСЯ, ЕСЛИ ЭКСПЕДИЦИЯ ПОГИБАЕТ), но ВОТ В ЧЁМ БОЛЬШОЙ ВОПРОС И ДЕЛЕМА!
Если - в это же самое место для экспедиций, куда отправил первый раз экспедицию - я отправляю ВСЕ ПОСЛЕДУЮЩИЕ ЭКСПЕДИЦИИ, то ДАЖЕ ПРИ УСПЕШНОМ УСЛОВИИ (экспедиция завершается без гибели), даже при этом условии ПОЧЕМУ-ТО КОЛИЧЕСТВО ЛЮДЕЙ НУЖНОЕ ДЛЯ ЭКСПЕДИЦИИ ОТНИМАЕТСЯ и скаждым разом всё больше и больше (словно мы не возвращаем это количество PopulationCost), ДАЖЕ ЕСЛИ ЭКСПЕДИЦИЯ УСПЕШНА!
И с каждым разом, если отправлять экспедицию в одно и то же место, то ДАЖЕ ПРИ УСЛОВИИ УСПЕХА количество PopulationCost начинает отниматься и с каждым разом отнимается с умножением.

Например - для отправки в это место нужно 5 человек, я отправляю экспедицию 1 раз - и всё проходит УСПЕЩНО, логика работает как нужно.
Если я отправляю в это же место экспедицию во 2 раз и все последующие разы, то даже при условии УСПЕШНОГО ЗАВЕРШЕНИЯ я теряю PopulationCost с умножением, забирает не 5, а 10, в следующий раз уже не 10, а 20 и так с наростанием.
Причина бага мне совершенно непонятна, помоги мне пожалуйста решить эту проблему!