#!/usr/bin/env ruby
require 'rubygems'
require 'camping'
require 'camping/db'
require 'camping/session'
require 'reststop'

Camping.goes :Ctd

module Ctd
    include Camping::Session
end

module Ctd::Models
    class Device < Base; end
    class User < Base; end
    class CreateTheBasics < V 1.0
      def self.up
        create_table :ctd_devices do |t|
          t.column :channel,  :integer, :null => false
          t.column :state, :boolean, :default => true
        end
        create_table :ctd_users do |t|
          t.column :username, :string
          t.column :password, :string
        end
        User.create :username => 'admin', :password => 'camping'
        (1..8).each {|n| Device.create :channel => n}
      end
      def self.down
        drop_table :ctd_users
        drop_table :ctd_devices
      end
    end
end

module Ctd::Controllers
  class NotFound
    def get(p)
      @status = 404
      div do
        h1 'Lo Sentimos'
        h2 "Todos los circuitos están ocupados"
        h3 do 
          text("Por favor ")
          text( a('cuelgue', :href => R(Index)))
          text( "y deje de marcar #{p}")
        end
      end
    end
  end
  
  class Info < R '/info/(\d+)', '/info/(\w+)/(\d+)', '/info', '/info/(\d+)/(\d+)/(\d+)/([\w-]+)'
    def get(*args)
      div do
        code args.inspect; br; br
        code @env.inspect; br
        code "Link: #{R(Info, 1, 2)}"
      end
    end
  end
  
  class Index < R '/'
    def get
      if @state.user_id.blank?
        redirect "sessions"
      else
        redirect "devices"
      end
    end
  end
  
  class Devices < REST 'devices'
    
    # get /devices/1
    def read(channel)
      return redirect R(Index) if @state.user_id.blank?
      begin
        @device = Device.find channel
      rescue
        @device = nil
      end
      render :device
    end
    
    # get /devices
    def list
      return redirect R(Index) if @state.user_id.blank?
      @device = nil
      render :device
    end
  end
  
  class Sessions < REST 'sessions'
    # POST /sessions
    def create
      @user = User.find :first, :conditions => ['username = ? AND password = ?', input.username, input.password]
      if @user
        @login = 'login success !'
        @state.user_id = @user.id
      else
        @login = 'wrong user name or password'
        end
      render :login
    end
    
    # DELETE /sessions
    def delete
      @state.user_id = nil
      render :logout
    end
    
    def read(id)
      redirect R(Index)
    end
    
    # GET /sessions
    def list
      render :_login
    end
    
    def read(*args)
      redirect R(Sessions)
    end
    
  end
end

Markaby::Builder.set(:indent, 2)

module Ctd::Views
  def layout
    html do
      head do
        title 'Call To Device'
        link  :rel => 'stylesheet', :type => 'text/css',
              :href => '/styles.css', :media => 'screen'
      end
      body do
        h1.header { a 'Call To Device', :href => R(Index) }
        div.content do
          self << yield
        end
      end
    end
  end
  
  def login
    p { b @login }
    p { a 'Continue', :href => R(Index) }
  end

  def logout
    p "You have been logged out."
    p { a 'Continue', :href => R(Index) }
  end
  
  def device
    if @device
      p "Usted ha seleccionado el dispositivo #{@device.channel}"
    else
      p "Seleccione el dispositivo a administrar"
    end
  end
  
  # partials
  def _login
    form :action => R(Sessions), :method => 'post' do
      label 'Username', :for => 'username'; br
      input :name => 'username', :type => 'text'; br
      label 'Password', :for => 'password'; br
      input :name => 'password', :type => 'text'; br
      input :type => 'submit', :name => 'login', :value => 'Login'
    end
  end
end


def Ctd.create
  Camping::Models::Session.create_schema
  Ctd::Models.create_schema :assume => (Ctd::Models::Device.table_exists? ? 1.0 : 0.0)
end

if __FILE__ == $0
  require 'webrick/httpserver'
  require 'camping/webrick'

  Camping::Models::Base.establish_connection :adapter  => "sqlite3", :database => "ctd.db"
  Ctd.create
  s = WEBrick::HTTPServer.new :BindAddress => "0.0.0.0", :Port => 3301
  s.mount "/", WEBrick::CampingHandler, Ctd

  # This lets Ctrl+C shut down your server
  trap(:INT) do
    s.shutdown
  end

  s.start
end




