FieldInfoLogger = {}
FieldInfoLogger.lastFieldData = nil

-- 1. Наш "шпион". Вызывается игрой автоматически, когда игрок смотрит на поле
function FieldInfoLogger:fieldAddFarmland(data, box)
    FieldInfoLogger.lastFieldData = data
end

PlayerHUDUpdater.fieldAddFarmland = Utils.appendedFunction(PlayerHUDUpdater.fieldAddFarmland, FieldInfoLogger.fieldAddFarmland)

-- 2. Слушаем нажатие клавиш
function FieldInfoLogger:keyEvent(unicode, sym, modifier, isDown)
    if isDown and sym == Input.KEY_z then
        self:printFieldInfoToLog()
    end
    if isDown and sym == Input.KEY_x then
        self:dumpAllVehicleTasks()
    end
end

-- ==============================================================================
-- ФУНКЦИЯ ОПРЕДЕЛЕНИЯ ЗАДАЧ ТЕХНИКИ
-- ==============================================================================
function FieldInfoLogger:getVehicleTasks(vehicle, fieldFruitIndex)
    fieldFruitIndex = fieldFruitIndex or 0

    local tasks = {}

    local function scan(v)
        -- ПЛУГ (реальная пахота с оборотом пласта)
        if v.spec_plow ~= nil then tasks["PLOW"] = true end

        -- КУЛЬТИВАЦИЯ (подготовка почвы без оборота)
        if v.spec_cultivator ~= nil then
            tasks["CULTIVATE"] = true
        end

        -- КОМБИНИРОВАННЫЕ СЕЯЛКИ (культивируют, сеют, удобряют)
        if v.spec_fertilizingSowingMachine ~= nil then
            tasks["CULTIVATE"] = true   -- они готовят почву
            tasks["SOW"] = true          -- они сеют
            tasks["FERTILIZE"] = true    -- они удобряют
        end

        -- ОБЫЧНАЯ СЕЯЛКА (только сеет, почва должна быть готова)
        if v.spec_sowingMachine ~= nil and v.spec_fertilizingSowingMachine == nil then
            tasks["SOW"] = true
        end

        -- УДОБРЕНИЕ (опрыскиватели, разбрасыватели)
        if v.spec_sprayer ~= nil or v.spec_spreader ~= nil then
            tasks["FERTILIZE"] = true
        end

        -- ПРОПОЛКА
        if v.spec_weeder ~= nil then tasks["WEED"] = true end

        -- ИЗВЕСТКОВАНИЕ
        if v.spec_lime ~= nil then tasks["LIME"] = true end

        -- КОМБАЙН (уборка)
        if v.spec_combine ~= nil or v.spec_fruitPreparer ~= nil then
            local fruitDict = self:getHarvestableFruitIds(v)
            if fruitDict then
                if fieldFruitIndex > 0 then
                    if fruitDict[fieldFruitIndex] then
                        tasks["HARVEST"] = true
                    end
                else
                    tasks["HARVEST"] = true
                end
            end
        end

        -- Рекурсивно проверяем прицепы
        if v.getAttachedImplements ~= nil then
            local implements = v:getAttachedImplements()
            if implements ~= nil then
                for _, impl in pairs(implements) do
                    if impl.object ~= nil then
                        scan(impl.object)
                    end
                end
            end
        end
    end

    scan(vehicle)
    return tasks
end

-- ==============================================================================
-- ОСНОВНАЯ ФУНКЦИЯ ДЛЯ ПОЛУЧЕНИЯ ID ФРУКТОВ ИЗ ЖАТКИ
-- ==============================================================================
function FieldInfoLogger:getCombineHarvestableFruitIds(combineVehicle)
    -- 1. Проверяем, есть ли у техники специализация комбайна
    if combineVehicle.spec_combine == nil then
        return nil -- Это не комбайн
    end

    -- 2. Получаем список прицепленных орудий
    local attachedImplements = nil
    if combineVehicle.getAttachedImplements ~= nil then
        attachedImplements = combineVehicle:getAttachedImplements()
    end

    if not attachedImplements or #attachedImplements == 0 then
        return nil
    end

    -- 3. Ищем жатку среди прицепов
    local cutter = nil
    for _, implement in pairs(attachedImplements) do
        if implement.object and implement.object.spec_cutter then
            cutter = implement.object
            break
        end
    end

    if not cutter then
        return nil
    end

    -- 4. Получаем данные из специализации жатки
    local cutterSpec = cutter.spec_cutter
    if not cutterSpec then
        return nil
    end

    -- 5. В FS25 ID фруктов хранятся в fruitTypeIndices (массив)
    if cutterSpec.fruitTypeIndices ~= nil then
        -- Преобразуем массив в словарь для удобства проверки
        local fruitDict = {}
        for _, fruitId in ipairs(cutterSpec.fruitTypeIndices) do
            fruitDict[fruitId] = true
        end
        return fruitDict
    end

    -- Запасные варианты на всякий случай
    if cutterSpec.supportedFruitTypes ~= nil then
        return cutterSpec.supportedFruitTypes
    end

    if cutterSpec.allowedFruitTypes ~= nil then
        local fruitDict = {}
        for _, fruitId in ipairs(cutterSpec.allowedFruitTypes) do
            fruitDict[fruitId] = true
        end
        return fruitDict
    end

    return nil
end

-- ==============================================================================
-- УНИВЕРСАЛЬНАЯ ФУНКЦИЯ (проверяет и комбайн, и его жатку)
-- ==============================================================================
function FieldInfoLogger:getHarvestableFruitIds(vehicle)
    local fruitDict = nil
    
    -- 1. СНАЧАЛА ПРОВЕРЯЕМ САМ КОМБАЙН (для спецтехники как OXBO EPD540E)
    if vehicle.spec_combine then
        -- У некоторых комбайнов есть встроенная жатка
        if vehicle.spec_combine.fruitTypeIndices then
            fruitDict = {}
            for _, fruitId in ipairs(vehicle.spec_combine.fruitTypeIndices) do
                fruitDict[fruitId] = true
            end
            return fruitDict
        end
        
        -- Или через spec_cutter прямо в комбайне
        if vehicle.spec_cutter and vehicle.spec_cutter.fruitTypeIndices then
            fruitDict = {}
            for _, fruitId in ipairs(vehicle.spec_cutter.fruitTypeIndices) do
                fruitDict[fruitId] = true
            end
            return fruitDict
        end
    end
    
    -- 2. ЕСЛИ НЕТ ВСТРОЕННОЙ, ИЩЕМ ПРИЦЕПНУЮ ЖАТКУ
    local attachedImplements = nil
    if vehicle.getAttachedImplements ~= nil then
        attachedImplements = vehicle:getAttachedImplements()
    end

    if attachedImplements and #attachedImplements > 0 then
        for _, implement in pairs(attachedImplements) do
            if implement.object then
                -- Проверяем жатку в прицепе
                if implement.object.spec_cutter and implement.object.spec_cutter.fruitTypeIndices then
                    fruitDict = {}
                    for _, fruitId in ipairs(implement.object.spec_cutter.fruitTypeIndices) do
                        fruitDict[fruitId] = true
                    end
                    return fruitDict
                end
                
                -- Проверяем сам прицеп (на случай если прицеп - это спецкомбайн)
                if implement.object.spec_combine and implement.object.spec_combine.fruitTypeIndices then
                    fruitDict = {}
                    for _, fruitId in ipairs(implement.object.spec_combine.fruitTypeIndices) do
                        fruitDict[fruitId] = true
                    end
                    return fruitDict
                end
            end
        end
    end
    
    return nil
end

-- ==============================================================================
-- ОСНОВНАЯ ФУНКЦИЯ ВЫВОДА ИНФОРМАЦИИ О ПОЛЕ
-- ==============================================================================
function FieldInfoLogger:printFieldInfoToLog()
    local data = FieldInfoLogger.lastFieldData

    if data == nil or data.farmlandId == nil or data.farmlandId == 0 then
        print("ОШИБКА: Нет данных. Встаньте на поле, чтобы интерфейс обновился.")
        return
    end

    local farmland = g_farmlandManager:getFarmlandById(data.farmlandId)
    if farmland == nil then return end

    print("\n========== ИНФОРМАЦИЯ О ПОЛЕ (Z) ==========")
    print(string.format("ID Участка: %s", tostring(data.farmlandId)))
    
    local currentFruitIndex = 0

    if data.lastFruitTypeIndex ~= nil and data.lastFruitTypeIndex ~= 0 then
        local fruitType = g_fruitTypeManager:getFruitTypeByIndex(data.lastFruitTypeIndex)
        if fruitType ~= nil then
            currentFruitIndex = fruitType.index
            print(string.format("Культура на поле: %s (ID: %d)", fruitType.name, currentFruitIndex))
            print(string.format("Стадия роста: %s из %s", tostring(data.lastGrowthState), tostring(fruitType.numGrowthStates)))
            
            if fruitType.growthStateToName ~= nil and fruitType.growthStateToName[data.lastGrowthState] == "harvestReady" then
                print("Статус: Готово к уборке!")
            else
                print("Статус: Созревает / Не готово к уборке")
            end
        end
    else
        print("Культура: Нет данных / Поле пустое")
    end

    print("===========================================\n")
end

-- ==============================================================================
-- ДИАГНОСТИКА: Вывод всех задач для всей техники (КЛАВИША X)
-- ==============================================================================
function FieldInfoLogger:dumpAllVehicleTasks()
    print("\n========== ДИАГНОСТИКА ЗАДАЧ ВСЕЙ ТЕХНИКИ ==========")
    
    -- Получаем список всей техники
    local vehiclesList = g_currentMission.vehicleSystem ~= nil and g_currentMission.vehicleSystem.vehicles or g_currentMission.vehicles
    if vehiclesList == nil then
        print("Нет техники на карте")
        return
    end
    
    -- Получаем текущую культуру поля (если есть)
    local fieldFruitIndex = 0
    if self.lastFieldData ~= nil and self.lastFieldData.fruitTypeIndex ~= nil then
        fieldFruitIndex = self.lastFieldData.fruitTypeIndex
    end
    
    local totalVehicles = 0
    local vehiclesWithTasks = 0
    
    -- Проходим по всей технике
    for _, vehicle in pairs(vehiclesList) do
        if type(vehicle) == "table" and (vehicle.spec_motorized ~= nil or (vehicle.getIsEnterable ~= nil and vehicle:getIsEnterable())) then
            
            totalVehicles = totalVehicles + 1
            local name = vehicle.getFullName ~= nil and vehicle:getFullName() or "Unknown"
            
            -- Получаем задачи для этой техники
            local tasks = self:getVehicleTasks(vehicle, fieldFruitIndex)
            
            -- Собираем все активные задачи в строку
            local taskList = {}
            for taskId, _ in pairs(tasks) do
                table.insert(taskList, taskId)
            end
            
            -- Если есть задачи - выводим
            if #taskList > 0 then
                vehiclesWithTasks = vehiclesWithTasks + 1
                table.sort(taskList)
                
                print(string.format("\n🚜 [%s]", name))
                print(string.format("   Задачи: %s", table.concat(taskList, ", ")))
            end
        end
    end
    
    print("\n========== ИТОГО ==========")
    print(string.format("Всего техники: %d", totalVehicles))
    print(string.format("Техники с задачами: %d", vehiclesWithTasks))
    print("============================\n")
end

-- Регистрируем мод
addModEventListener(FieldInfoLogger)