class XmppController < ApplicationController
  
  #Mapping XMPP Standar Status to Social Stream Chat Status
  STATUS = {
  '' => 'available', 
  'chat' => 'available', 
  'away' => 'away', 
  'xa' => 'away',
  'dnd' => 'dnd',
  #Special status to disable chat
  'disable' => 'disable'
  }
   
   
  #API METHODS
  
  def setConnection  
    unless authorization
      render :text => "Authorization error"
      return
    end
    
    user = User.find_by_slug(params[:name])
    
    if user && !user.connected
       user.connected = true
       user.status = "available"
       user.save!
       render :text => "Ok"
       return
    end
    
    render :text => "Error"
  end
  
  
  def unsetConecction
    unless authorization
      render :text => "Authorization error"
      return
    end
    
    user = User.find_by_slug(params[:name])
    
    if user && user.connected
       user.connected = false
       user.save!
       render :text => "Ok"
       return
    end
    
    render :text => "User not connected"
  end
  
  
  def setPresence  
    unless authorization
      render :text => "Authorization error"
      return
    end
    
    user = User.find_by_slug(params[:name])
    status = params[:status]
    
    if setStatus(user,status)
      if user && !user.connected
        user.connected = true
        user.save!
      end
      render :text => 'Status changed'
    else
      render :text => 'Status not changed'
    end
    
  end
  
  
  def unsetPresence  
    unless authorization
      render :text => "Authorization error"
      return
    end
    
    user = User.find_by_slug(params[:name])
    
    if user && user.connected
       user.connected = false
       user.save!
       render :text => "Ok"
       return
    end
    
    render :text => "User not connected"
  end
  
  
  def resetConnection
    unless authorization
      render :text => "Authorization error"
      return
    end
    
    SocialStream::Presence::XmppServerOrder::resetPresence
    
    render :text => "Ok" 
  end
  
  
  def synchronizePresence  
    unless authorization
      render :text => "Authorization error"
      return
    end 
     
    #Actual connected users
    user_slugs = params[:name]  
    
    SocialStream::Presence::XmppServerOrder::synchronizePresenceForSlugs(user_slugs)
    
    render :text => "ok"
  end
 
 
  def authorization
    return params[:password] == SocialStream::Presence.xmpp_server_password
  end
  
  
  def chatWindow
    if (current_user) and (current_user.status != 'disable') and (params[:userConnected]=="true")
      render :partial => 'xmpp/chat_contacts'
    else
      #User not connected or chat desactivated
      render :partial => 'xmpp/chat_off'
    end 
  end
    

 
  
  #TEST METHODS
  def active_users
    @users = User.find_all_by_connected(true)
    @all_users = User.all
  end
   
  def test
    #puts "TEST"
  end
  
  
  private
  
  def setStatus(user,status)
    if user and status and user.status != status and validStatus(status)  
      user.status = STATUS[status]
      user.save!
      return true
    end
    return false
  end 
  
  def validStatus(status)
    return STATUS.keys.include?(status)
  end
  
end