--Mining or breaking a rock paints the tiles underneath
local Event = require 'utils.event'

local valid_entities = {
    ['big-rock'] = true,
    ['huge-rock'] = true,
    ['big-sand-rock'] = true
}

local replacement_tiles = {
    ['nuclear-ground'] = 'dirt-7',
    ['dirt-7'] = 'dirt-6',
    ['dirt-6'] = 'dirt-5',
    ['dirt-5'] = 'dirt-4',
    ['dirt-4'] = 'dirt-3',
    ['dirt-3'] = 'dirt-2'
}

local coords = {
    { x = 0,  y = 0 },
    { x = -1, y = -1 },
    { x = 1,  y = -1 },
    { x = 0,  y = -1 },
    { x = -1, y = 0 },
    { x = -1, y = 1 },
    { x = 0,  y = 1 },
    { x = 1,  y = 1 },
    { x = 1,  y = 0 },
    { x = 2,  y = 0 },
    { x = -2, y = 0 },
    { x = 0,  y = 2 },
    { x = 0,  y = -2 }
}

local function on_pre_player_mined_item(event)
    local entity = event.entity
    if not valid_entities[entity.name] then
        return
    end

    local tiles = {}
    for i = 1, #coords do
        local p = coords[i]

        local pos = { x = entity.position.x + p.x, y = entity.position.y + p.y }
        local tile = entity.surface.get_tile(pos)
        if not tile.collides_with('player') then
            if replacement_tiles[tile.name] and math.random(1, 2) == 1 then
                table.insert(tiles, { name = replacement_tiles[tile.name], position = pos })
            end
        end
    end
    if #tiles == 0 then
        return
    end
    entity.surface.set_tiles(tiles, true)
end

local function on_entity_died(event)
    local entity = event.entity
    if not entity or not entity.valid then
        return
    end

    local cause = event.cause

    if cause and cause.valid and cause.force.index == 2 then
        return
    end

    on_pre_player_mined_item(event)
end

Event.add(defines.events.on_entity_died, on_entity_died)
Event.add(defines.events.on_pre_player_mined_item, on_pre_player_mined_item)
