module CharacterPageConfig
  #Usados en los textos de la Lista y Descripciones
  DARKBASECOLOR        = Color.new(80,80,88)
  DARKSHADOWCOLOR      = Color.new(168,184,184)

  #Usados en textos sobre fondo más oscuro.
  LIGHTBASECOLOR        = Color.new(248,248,248)
  LIGHTSHADOWCOLOR      = Color.new(0,0,0)
end

#===============================================================================
# 
#===============================================================================

def clCharacterPage(char)
  character_profile = clGetProfile(char) rescue nil
  if character_profile
    pbFadeOutIn(99999) { 
      scene=CharacterPageDisplayScene.new
      screen=CharacterPageDisplay.new(scene)
      screen.pbStartScreen(character_profile)
    }
  else
    p "Personaje no encontrado con ID: #{id}" if $DEBUG
  end
end

def clOpenCharacterScene
  unlocked_characters = clUnlockedCharacters
  if unlocked_characters.length == 0
    Kernel.pbMessage(_INTL("No hay personajes desbloqueados."))
    return false
  end
  
  ev = CharacterProfileListScene.new
  ev.start
  Input.update
  return true
end

#===============================================================================
# 
#===============================================================================

class CharacterPageDisplayScene
  
  PAGES = 2
  
  def drawPage(id=0)
    @overlay.clear
    @textpos = []
    @imagepos = []
    
    textX= 24
    textSize = Graphics.width - textX - 24
    
    textX2= 200
    textSize2 = Graphics.width - textX2 - 24

    pbSetSystemFont(@overlay)
    
    
    charname = @character.fullname ? @character.fullname : @character.name
    
    drawFormattedTextEx(@overlay,textX,2,textSize,_INTL("{1}",charname),@baseColor2,@shadowColor2,26)

    pbSetSmallFont(@overlay)
    if id == 0
      @sprites["background"].setBitmap("Graphics/Pictures/CharacterProfiles/page0")
      @sprites["char"].visible = true if !@character.trainerclass
      @sprites["char2"].visible = true
      @sprites["trainer"].visible = true
      
      allytext = nil
      if @character.ally
        allycolor = @baseColor
        allyshadow = @shadowColor
        if @character.ally == 1
          allycolor = Color.new(28,227,43)
          allytext = "Aliado"
        elsif @character.ally == 2
          allycolor = Color.new(233,4,127)
          allytext = "Enemigo"
        elsif @character.ally == 0
          allycolor = Color.new(176,176,176)
          allyshadow = Color.new(104,104,104)
          allytext = "Neutral"
        end
      end
      
      genderColor = @baseColor
      if @character.gender=="♂"
        genderColor = Color.new(60,184,237)
      elsif @character.gender=="♀"
        genderColor = Color.new(233,4,127)
      end
      
      @textpos.push([_INTL("{1}",allytext),84+12,232,2,allycolor,@shadowColor2]) if allytext
      if @character.age
        @textpos.push([_INTL("Edad:"),textX,232+32,0,@baseColor2,@shadowColor2])
        @textpos.push([_INTL("{1}",@character.age),168,232+32,1,@baseColor2,@shadowColor2])
      end
      if @character.gender
        @textpos.push([_INTL("Sexo:"),textX,232+64,0,@baseColor2,@shadowColor2])
        @textpos.push([_INTL("{1}",@character.gender),168,232+64,1,genderColor,@shadowColor2])
      end

      drawFormattedTextEx(@overlay,textX2,56,textSize2,_INTL("<b>Lugar de origen:</b><br>{1}",@character.hometown),@baseColor,@shadowColor,26)
      drawFormattedTextEx(@overlay,textX2,56+54,textSize2,_INTL("<b>Pokémon insignia:</b><br>{1}",PBSpecies.getName(clGetPokemonPartner(@character.partner))),@baseColor,@shadowColor,26) if @character.partner
      
      drawFormattedTextEx(@overlay,textX2,56+64+64,textSize2,_INTL("<b>Descripción</b><br>{1}",@character.description),@baseColor,@shadowColor,26) if @character.description

    elsif id == 1
      @sprites["background"].setBitmap("Graphics/Pictures/CharacterProfiles/page1")
      @sprites["char"].visible = false
      @sprites["char2"].visible = false
      @sprites["trainer"].visible = false
      drawFormattedTextEx(@overlay,textX,56,textSize,_INTL("{1}",@character.get_data(1)),@baseColor,@shadowColor,26) if @character.get_data(1)
      drawFormattedTextEx(@overlay,textX,168,textSize,_INTL("{1}",@character.get_data(2)),@baseColor,@shadowColor,26) if @character.get_data(2)
      drawFormattedTextEx(@overlay,textX,280,textSize,_INTL("{1}",@character.get_data(3)),@baseColor,@shadowColor,26) if @character.get_data(3)
    end

    pbDrawImagePositions(@overlay,@imagepos)
    pbDrawTextPositions(@overlay,@textpos)
    drawpageIcon(@page)
  end
  
  def drawpageIcon(page=0)
    @pagebitmap = AnimatedBitmap.new("Graphics/Pictures/CharacterProfiles/icon_page")
    rectsize = 32
    tmy = 2
    tmx = Graphics.width - rectsize*PAGES - 16
    
    for i in 0...PAGES
      pgrect=Rect.new(i*rectsize,i == page ? rectsize : 0,rectsize,rectsize)
      @overlay.blt(tmx+(rectsize*i),tmy,@pagebitmap.bitmap,pgrect)
    end
  end
  
  def pbUpdate
    pbUpdateSpriteHash(@sprites)
  end

  def pbStartScene(char)
    @character=char
    
    @viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
    @viewport.z=99999

    @sprites={}
    
    addBackgroundPlane(@sprites,"bg","CharacterProfiles/bg",@viewport)

    @sprites["background"]=IconSprite.new(0,0,@viewport)
    
    @sprites["overlay"]=BitmapSprite.new(Graphics.width,Graphics.height,@viewport)
    @overlay=@sprites["overlay"].bitmap
    @overlay.clear
    
    @baseColor    = CharacterPageConfig::DARKBASECOLOR
    @shadowColor  = CharacterPageConfig::DARKSHADOWCOLOR
    @baseColor2   = CharacterPageConfig::LIGHTBASECOLOR
    @shadowColor2 = CharacterPageConfig::LIGHTSHADOWCOLOR
    
    pbSetSmallFont(@sprites["overlay"].bitmap)

    @sprites["trainer"]=IconSprite.new(@viewport)
    @sprites["char"] = IconSprite.new(0, 0, @viewport)
    if @character.charsprite
      @sprites["char"].setBitmap("Graphics/Characters/#{@character.charsprite}")
    end
    if @character.trainerclass
      trclass = clGetTrainerClass(@character.trainerclass)
      @sprites["trainer"].setBitmap(pbTrainerSpriteFile(trclass))
      @sprites["trainer"].visible = true
      @sprites["trainer"].x = 192/4 - 32
      @sprites["trainer"].y = 192/4 - 32 + 32
      @sprites["trainer"].ox = 0
      @sprites["trainer"].oy = 0
    end
    @sprites["char"].x = 192/4 + 16
    @sprites["char"].y = 192/4 + 32
    @sprites["char"].ox = 0
    @sprites["char"].oy = 0
    @sprites["char"].src_rect.height = (@sprites["char"].bitmap.height / 4).round
    @sprites["char"].src_rect.width = (@sprites["char"].bitmap.width / 4).round
    @sprites["char"].visible = false
    
    
    @sprites["char2"] = IconSprite.new(0, 0, @viewport)
    if @character.partner
      pokemon = clGetPokemonPartner(@character.partner)
      pkimg = pbResolveBitmap("Graphics/Characters/#{pokemon}")
      if pkimg
        @sprites["char2"].setBitmap(pkimg)
        @sprites["char2"].x = 512 - 64 - 24
        @sprites["char2"].y = 88
        @sprites["char2"].ox = 0
        @sprites["char2"].oy = 0
        @sprites["char2"].src_rect.height = (@sprites["char"].bitmap.height / 4).round
        @sprites["char2"].src_rect.width = (@sprites["char"].bitmap.width / 4).round
      end
    end
    @sprites["char2"].visible = false
  
    @page=0
    drawPage(0)
    pbFadeInAndShow(@sprites) { pbUpdate }
  end

  def pbChar
    @sprites["char"].src_rect.x += (@sprites["char"].bitmap.width / 4).round rescue nil
    @sprites["char"].src_rect.x = 0 if @sprites["char"].src_rect.x >= @sprites["char"].bitmap.width rescue nil
    @sprites["char2"].src_rect.x += (@sprites["char2"].bitmap.width / 4).round rescue nil
    @sprites["char2"].src_rect.x = 0 if @sprites["char2"].src_rect.x >= @sprites["char2"].bitmap.width rescue nil
  end

  def pbEndScene
    pbFadeOutAndHide(@sprites) { pbUpdate }
    pbDisposeSpriteHash(@sprites)
    @viewport.dispose
  end

  def pbScene
    @frame = 0
    loop do
      @frame += 1
      Graphics.update
      Input.update
      pbUpdate
      if Input.trigger?(Input::B)
        break
      end
      dorefresh=false
      if Input.trigger?(Input::LEFT)
        oldpage=@page
        @page-=1
        @page=0 if @page<0
        @page=PAGES-1 if @page>PAGES-1
        dorefresh=true
        if @page!=oldpage # Move to next page
          pbSEPlay("GUI summary change page")
          dorefresh=true
        end
      end
      if Input.trigger?(Input::RIGHT)
        oldpage=@page
        @page+=1
        @page=0 if @page<0
        @page=PAGES-1 if @page>PAGES-1
        if @page!=oldpage # Move to next page
          pbSEPlay("GUI summary change page")
          dorefresh=true
        end
      end
      if dorefresh
        drawPage(@page)
      end
      pbChar if @frame == 6 || @frame == 12 || @frame == 18
      @frame = 0 if @frame == 18
    end
    return
  end
end

class CharacterPageDisplay
  def initialize(scene)
    @scene=scene
  end

  def pbStartScreen(char)
    @scene.pbStartScene(char)
    ret=@scene.pbScene
    @scene.pbEndScene
    return ret
  end
end



#===============================================================================
# Lista de personajes
#===============================================================================
class CharacterProfileListScene
  
  def pbUpdate
    pbUpdateSpriteHash(@sprites)
  end
  
  def initialize 
    @unlocked_characters = clUnlockedCharacters
    @commands = []
    @trainers = []

    @unlocked_characters.each do |char_info|
      char_name, char_symbol, char_sprite, char_event = char_info
      @trainers.push([char_name, char_symbol, char_sprite, char_event])
      @commands.push(char_name)
    end

    @sprites = {}
    @viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
    @viewport.z = 99999
    @sprites["overlay"]=BitmapSprite.new(Graphics.width,Graphics.height,@viewport)
    @overlay=@sprites["overlay"].bitmap
    @overlay.clear
    
    @sprites["list"] = Window_CommandPokemon.newEmpty(200-16,64-16,
                       Graphics.width-(200-16)-24,Graphics.height-(126-32),@viewport)
    @sprites["list"].baseColor   = CharacterPageConfig::DARKBASECOLOR
    @sprites["list"].shadowColor = CharacterPageConfig::DARKSHADOWCOLOR
    
    @sprites["header"] = Window_UnformattedTextPokemon.newWithSize(_INTL("Perfiles de personaje"),
       12, -12, Graphics.width, Graphics.height, @viewport)
    @sprites["header"].baseColor   = CharacterPageConfig::LIGHTBASECOLOR
    @sprites["header"].shadowColor = CharacterPageConfig::LIGHTSHADOWCOLOR
  
    @sprites["bottom"] = Window_AdvancedTextPokemon.newWithSize("",
       162, Graphics.height - 64 - 8, Graphics.width - 158, 64, @viewport)
    @sprites["bottom"].baseColor   = CharacterPageConfig::LIGHTBASECOLOR
    @sprites["bottom"].shadowColor = CharacterPageConfig::LIGHTSHADOWCOLOR

    addBackgroundPlane(@sprites, "background", "CharacterProfiles/bg", @viewport)
    addBackgroundPlane(@sprites, "bg", "CharacterProfiles/list", @viewport)

    #Carga el mini
    @sprites["char"] = IconSprite.new(0, 0, @viewport)
    @sprites["char"].setBitmap("Graphics/Characters/#{@unlocked_characters[0][2]}")
    @sprites["char"].src_rect.height = (@sprites["char"].bitmap.height / 4).round
    @sprites["char"].src_rect.width = (@sprites["char"].bitmap.width / 4).round

    @sprites["char"].x = 192/4 + 16
    @sprites["char"].y = 192/4 + 32
    @sprites["char"].ox = 0
    @sprites["char"].oy = 0
    
    @sprites["list"].commands = @commands
    pbFadeInAndShow(@sprites) { pbUpdate }
  end

  def start
    @frame = 0
    pbActivateWindow(@sprites, "list") {
      oldindex = -1
      loop do
        Graphics.update
        Input.update
        pbUpdate
        # Muestra detalles del personaje seleccionado
        if @sprites["list"].index != oldindex
          selected_character = @trainers[@sprites["list"].index]
          char_name = selected_character[0]
          @sprites["bottom"].text = "<ac>" + char_name

          @sprites["char"].setBitmap("Graphics/Characters/#{selected_character[2]}")
          @sprites["char"].src_rect.height = (@sprites["char"].bitmap.height / 4).round
          @sprites["char"].src_rect.width = (@sprites["char"].bitmap.width / 4).round
        end
        
        if Input.trigger?(Input::B)
          break
        elsif Input.trigger?(Input::C)
          index = @sprites["list"].index
          if index >= 0
            loop do
              commands = []
              commands[cmdProfile=commands.length] = "Ver Perfil"
              commands[cmdCall=commands.length] = "Llamar" if @trainers[index][3]
              commands[cmdExit=commands.length] = "Salir"
              choice = Kernel.pbMessage(_INTL("Has seleccionado a {1}.", @trainers[index][0]),
              commands, commands.length, "Graphics/Windowskins/menuskin")
              if choice == cmdProfile
                clCharacterPage(@trainers[index][1])
              elsif choice == cmdCall
                pbCommonEvent(@trainers[index][3]) if @trainers[index][3]
              elsif choice == cmdExit
                break
              end
            end # Loop
          end
        end #if
      end #Loop
    }
    
    pbFadeOutAndHide(@sprites)
    pbDisposeSpriteHash(@sprites)
    @viewport.dispose
  end
end
 