debug = require "debug"
arcade_config = require("arcade_config")
coords = require "coords"

require "fps"
require "fade"
require "audio"
require "map"
require "mapa"
require "logo"
require "intro"
require "game"
require "switches"
-- require "scenes"

coords.set_config({
    tiles_width  = arcade_config.tiles_width,
    tiles_height = arcade_config.tiles_height,
    room_cols    = mapa_room_cols,
    room_rows    = mapa_room_rows,
    rooms_per_floor = mapa_rooms_per_piso,
})

function editor_to_map_tile(editor_tile)
    local result = 0
    if editor_tile<256 then result = editor_tile + arcade_config.tiles_offset end
    return result
end

function map_to_editor_tile(map_tile)
    local result = map_tile - arcade_config.tiles_offset
    if map_tile==0 then result = 256  end
    return result
end

function load_tilemap( sf_mapa )
    local mapa_tw, mapa_th = surf.size(sf_mapa)
    local nrooms = mapa_rooms_per_piso*mapa_pisos
    local x = 0
    local y = 0
    local yroom = 0
    local xroom = 0
    
    map.surf(sf_mapa)
    for ty=0,mapa_th-1 do
        if y == mapa_room_rows then
            yroom = yroom + mapa_rooms_per_piso 
            y = 0
        end
        xroom = yroom
        for tx=0,mapa_tw-1 do
            local tile=editor_to_map_tile(mapa[1+xroom][1+x+y*mapa_room_cols])
            map.tile(tx, ty, tile)
            x = x + 1
            if x == mapa_room_cols then 
                x = 0
                xroom = xroom + 1
            end
        end
        y = y +1
    end
end

function mini.init()
    tiles=surf.load("tiles.gif")
    surf.source(tiles)
    local paleta=pal.load("tiles.gif")
    pal.set(paleta)

    -- Crear el warp
    warp=surf.new(32,32)
    surf.source(tiles)
    surf.target(warp)
    draw.surfrot(11*16,15*16,16,16,0,0,0)
    draw.surfrot(11*16,15*16,16,16,15,0,90)
    draw.surfrot(11*16,15*16,16,16,0,15,270)
    draw.surfrot(11*16,15*16,16,16,15,15,180)


    logo=surf.new(arcade_config.logo_sf.width,arcade_config.logo_sf.height)
    back=surf.new(arcade_config.surface.width,arcade_config.surface.height)
	sf_mapa=surf.new(mapa_room_cols*mapa_rooms_per_piso,mapa_room_rows*mapa_pisos)
    load_tilemap( sf_mapa )
    fade.init()
    
    font_sf=font.load("X2_font.fnt")

	textsf=surf.new(arcade_config.org_resolucion.width,arcade_config.org_resolucion.height)

	-- Càrrega dels audios
    audio_text_abad     = sound.load(audio_text_abad)
    audio_text_premiere = sound.load(audio_text_premiere)
    audio_text_elalien  = sound.load(audio_text_elalien)
    audio_text_batman   = sound.load(audio_text_batman)
    audio_abad_jump     = sound.load(audio_abad_jump)
    audio_abad_fall     = sound.load(audio_abad_fall)
    audio_abad_hit      = sound.load(audio_abad_hit)
    audio_abad_shot     = sound.load(audio_abad_shot)
    audio_abad_step[1]  = sound.load(audio_abad_step[1])
    audio_abad_step[2]  = sound.load(audio_abad_step[2])
    audio_abad_step[3]  = sound.load(audio_abad_step[3])
    audio_abad_step[4]  = audio_abad_step[2]
    audio_switch        = sound.load(audio_switch)
    audio_hit           = sound.load(audio_hit)
    audio_low           = sound.load(audio_low)

	-- Configuració dels input
    keyUp = tonumber(config.key("keyup")) or key.UP
    keyDown = tonumber(config.key("keydown")) or key.DOWN
    keyLeft = tonumber(config.key("keyleft")) or key.LEFT
    keyRight = tonumber(config.key("keyright")) or key.RIGHT
    keyJump = tonumber(config.key("keyjump")) or key.UP
    keyShoot = tonumber(config.key("keyshoot")) or key.SPACE

    btnUp = tonumber(config.key("btnup")) or  pad.UP
    btnDown = tonumber(config.key("btndown")) or  pad.DOWN
    btnLeft = tonumber(config.key("btnleft")) or  pad.LEFT
    btnRight = tonumber(config.key("btnright")) or  pad.RIGHT
    btnJump = tonumber(config.key("btnjump")) or  pad.B
    btnShoot = tonumber(config.key("btnshoot")) or  pad.A
    btnCycle1 = tonumber(config.key("btncycle1")) or  pad.RIGHTSHOULDER
    btnCycle2 = tonumber(config.key("btncycle2")) or  pad.LEFTSHOULDER
    btnPause = tonumber(config.key("btnpause")) or  pad.START

    -- logo_init()
    -- intro_init()
    game_init()
    -- final_init()
end

function mini.update()
    if key.press(key.F1) then
        win.zoom(win.zoom()-1)
    elseif key.press(key.F2) then
        win.zoom(win.zoom()+1)
    elseif key.press(key.F3) then
        local fs = win.fullscreen()
        win.fullscreen(not fs)
        win.cursor(fs)
    end

    if (game_update) then game_update() end
	
end

function arc_text(str, x, y, col)
	local curr_surf_tgt = surf.target()
	local curr_surf_src = surf.source()
	local sw = arcade_config.org_resolucion.width
	local sh = arcade_config.org_resolucion.height
	local dw = arcade_config.resolucion.width
	local dh = arcade_config.resolucion.height
	surf.target(textsf)
	surf.cls(0)
    draw.text(str,0,0,col)
	-- print("arc_ "..str)
    surf.source(textsf)
	surf.target(curr_surf_tgt)
    draw.surf(0,0,sw,sh,x,y,dw,dh)
    surf.source(curr_surf_src)
end

function arc_textB(str, x, y, col, colB)
	local ox, oy = view.origin()
	local curr_surf_tgt = surf.target()
	local curr_surf_src = surf.source()
	local sw = arcade_config.org_resolucion.width
	local sh = arcade_config.org_resolucion.height
	local dw = arcade_config.resolucion.width
	local dh = arcade_config.resolucion.height
    colB = colB or 16
	surf.target(textsf)
	view.origin(0,0)
	surf.cls(0)
	draw.text(str,0,0,colB)
    draw.text(str,1,0,colB)
    draw.text(str,2,0,colB)
    draw.text(str,0,1,colB)
    draw.text(str,2,1,colB)
    draw.text(str,0,2,colB)
    draw.text(str,1,2,colB)
    draw.text(str,2,2,colB)
	
    draw.text(str,1,1,col)
	-- print("arc_B "..str)
    surf.source(textsf)
	surf.target(curr_surf_tgt)
	view.origin(ox,oy)
    draw.surf(0,0,sw,sh,x,y,dw,dh)
    surf.source(curr_surf_src)
end

-- DEBUG

-- Imprime cualquier valor, incluyendo tablas anidadas
function dump(value, indent)
    indent = indent or ""
    if type(value) ~= "table" then
        return tostring(value)
    end

    local parts = {"{"}
    for k, v in pairs(value) do
        local key = (type(k) == "string") and k or "["..tostring(k).."]"
        table.insert(parts,
            string.format("%s  %s = %s,",
                indent, key, dump(v, indent.."  ")))
    end
    table.insert(parts, indent.."}")
    return table.concat(parts, "\n")
end

function msg_print(x, y, msg, direct_print )
    local scr_x, scr_y
    direct_print = direct_print or false
    if direct_print then 
        scr_x = x
        scr_y = y
    else 
        scr_x, scr_y = viewp:screen_coords(x, y)
    end
    draw.rectf(scr_x,scr_y,45,7,16)
    draw.text(msg,scr_x+1,scr_y+1,2)
end

function view_coord(x, y, w, h, color)
    local scr_x, scr_y = viewp:screen_coords(x, y)
    draw.rect(scr_x, scr_y, w, h, color)
end

function debug.write_tile(x, y, yplus, print_type, align )
    local scr_x, scr_y = viewp:screen_coords(x, y)
    local hab, xx, yy = coords.world_to_tile(x, y)
    
    yplus = yplus or 0
    print_type = print_type or false
    align = align or "R"
    
    local txt_offset = -7
    if align=="R" then txt_offset = -14
    elseif align=="L" then txt_offset = 0
    end     
    
    draw.rectf(scr_x+txt_offset,scr_y+yplus,14,7,16)
    -- local msg = mapa_get_tile(hab,xx,yy)
    local msg = arc_get_tile(x,y)
    if print_type then
        msg = msg.." "..arc_check_tile(x, y)
    end
    draw.text(msg,scr_x+txt_offset+1,scr_y+1+yplus,2)
end

