Now I'm trying to apply color changes to each tile (foreground and background), because you need (I think) to get the pixels from a surface and I only have the texture. Let's see if I can access the pixels in some way.
With SDL2 it's a bad idea to change the surface on fly. The surface in SDL2 (SDL_Surface) is only a stage (data storage for pixels) where you can easily draw stuff on that surface and when it's ready create a texture out of it, and the idea is that texture is static (not changed). So if you want things like colors for fonts then you have to create font sets for each color in the texture and point to proper color of a font. It's easy and also faster than the alternative solution (draw fonts pixel at a time!).
The grid or 2D array (level) usually has two components. The actual level grid has only data about tiles (what the tiles is etc.) and graphical tiles are displayed using that data. So those two (displaying and map data) are separate or they should be.