extends Node

# Constants for tile types/colors
const MAIN_SOURCE_ID = 1
const BLUE_ISOMETRICTILE_ATLAS_POSITION = Vector2i(0,0)
const RED_ISOMETRICTILE_ATLAS_POSITION = Vector2i(1,0)
const GREEN_ISOMETRICTILE_ATLAS_POSITION = Vector2i(2,0)
const WHITE_ISOMETRICTILE_ATLAS_POSITION = Vector2i(3,0)
const BLACK_ISOMETRICTILE_ATLAS_POSITION = Vector2i(4,0)
const PURPLE_ISOMETRICTILE_ATLAS_POSITION = Vector2i(5,0)
const ORANGE_ISOMETRICTILE_ATLAS_POSITION = Vector2i(6,0)
const LOW_ALPHA_BLOCK_ISOMETRICTILE_ATLAS_POSITION = Vector2i(7,0)
const SELECTED_BLUE_ISOMETRICTILE_ATLAS_POSITION = Vector2i(0,1)
const SELECTED_RED_ISOMETRICTILE_ATLAS_POSITION = Vector2i(1,1)
const SELECTED_GREEN_ISOMETRICTILE_ATLAS_POSITION = Vector2i(2,1)
const SELECTED_WHITE_ISOMETRICTILE_ATLAS_POSITION = Vector2i(3,1)
const SELECTED_BLACK_ISOMETRICTILE_ATLAS_POSITION = Vector2i(4,1)
const SELECTED_PURPLE_ISOMETRICTILE_ATLAS_POSITION = Vector2i(5,1)
const SELECTED_ORANGE_ISOMETRICTILE_ATLAS_POSITION = Vector2i(6,1)
# Debug flags
var debug_enabled = true

# Debug function that only prints when debug is enabled
func debug_print(message):
    if debug_enabled:
        print("[IsometricMapSystem] " + str(message))


# Utility functions for conversion between coordinate systems
func iso_to_world(tile_x, tile_y, player_z_layer = 0, tile_width = 32, tile_height = 16):
    # Calculate the world position from isometric coordinates
    var world_x = (tile_x - tile_y) * (tile_width / 2)
    var world_y = (tile_x + tile_y) * (tile_height / 2) - (player_z_layer * tile_height / 2)
    
    return Vector2(world_x, world_y)

# Converts world position to isometric tile coordinates
func world_to_iso(world_pos, player_z_layer = 0, tile_width = 32, tile_height = 16):
    # Adjust y position based on z-layer
    var adjusted_y = world_pos.y + (player_z_layer * tile_height / 2)
    
    # Calculate the tile coordinates
    var tile_x = (world_pos.x / (tile_width / 2) + adjusted_y / (tile_height / 2)) / 2
    var tile_y = (adjusted_y / (tile_height / 2) - world_pos.x / (tile_width / 2)) / 2
    
    return Vector2i(round(tile_x), round(tile_y))

# Create a new tile data structure with default values
func create_tile_data(coord_x, coord_y, z, atlas_base_position = null, atlas_highlight_position = null):
    # Ensure we have valid default positions to avoid null reference errors
    var base_pos = atlas_base_position if atlas_base_position != null else BLUE_ISOMETRICTILE_ATLAS_POSITION
    var highlight_pos = atlas_highlight_position if atlas_highlight_position != null else WHITE_ISOMETRICTILE_ATLAS_POSITION
    
    return {
        "x": coord_x,
        "y": coord_y,
        "z": z,
        "atlas_base_position": null,
        "atlas_highlight_position": null,
        "highlighted": false,
        "selected": false,
        "hp": 100,
        "armour": 0,
        "destroyable": false,
        "visibility": false,
        "unit": null,
        "unit_type": null, # PC (more options e.g. can move it) or NPC (can only view it) 
        "gravity": null,
    }
