#encoding: utf-8

# -*- encoding : utf-8 -*-

class MapsController < ApplicationController



  access_control do
    actions :edit, :update, :new, :create, :destroy, :destroy_layer, :publish, :unpublish do
      allow :admin
    end
    actions :index, :show do
      allow :admin
      allow anonymous, logged_in
    end
  end


  # GET /maps
  # GET /maps.json
  def index
    if current_user && (current_user.has_role? :admin)
      publish = params[:filter_rating] || 0
      @maps = Map.all
    else
      @maps = Map.find_all_by_public(true)
    end
    @layers = Layer.find_all_by_map_id(params[:map])


    response.headers["Cache-Control"] = "must-revalidate"
    respond_to do |format|
      format.json { render json: @maps }
      format.html
    end
  end

  # GET /maps/1
  # GET /maps/1.json
  def show
    @map = Map.find(params[:id])
    @layers = Layer.find_all_by_map_id(@map.id)

    if current_user && (current_user.has_role? :admin)
      @maps = Map.all
    else
      @maps = Map.find_all_by_public(true)
    end
    # TODO if site goes live
    if current_user
      @placemarks = Placemark.find(:all,  :order => "updated_at DESC", :conditions => ["layer_id IN (?)", @layers])
    else
      @placemarks = Placemark.find(:all,  :order => "updated_at DESC", :conditions => ["layer_id IN (?) and public = ?", @layers, true])
    end
    puts params[:more]
    @more = true if ( params[:more] == "1" )

    if @map.public || current_user
      respond_to do |format|
        format.html { render }
        format.json { render json: @placemarks.to_json(:methods => :internal_link) }
        format.gpx { render :layout=>false, :content_type => 'application/x-gpx' }
      end
    else
      render 'shared/_not_public'
    end

  end

  # GET /maps/new
  # GET /maps/new.json
  def new
    @map = Map.new
    # ugly, but true .)
    @icons = MARKERS.sort
    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @map }
    end
  end

  # GET /maps/1/edit
  def edit
    @map = Map.find(params[:id])
    @icons = MARKERS.sort
    # layers = @map.layers.build
    # 1.times { layers = @map.layers.build }
  end

  # POST /maps
  # POST /maps.json
  def create

    # if params[:map][:layers_attributes] && params[:map][:layers_attributes]["0"][:title] == ""
    #  params[:map][:layers_attributes]["0"][:title] = "Basis Ebene"
    #  params[:map][:layers_attributes]["0"][:subtitle] = "(Automatisch angelegt)"
    # end

    @map = Map.new(params[:map])
    @icons = MARKERS.sort
    unless @map.layers[0]
      @map.layers.build
      @map.layers[0].title = "Basis Ebene"
      @map.layers[0].subtitle = "(Automatisch angelegt)"
    end
    respond_to do |format|
      if @map.save
        format.html { redirect_to @map, notice: 'Karte wurde angelegt.' }
        format.json { render json: @map, status: :created, location: @map }
      else
        format.html { render action: "new" }
        format.json { render json: @map.errors, status: :unprocessable_entity }
      end
    end
  end

  # PUT /maps/1
  # PUT /maps/1.json
  def update
    @map = Map.find(params[:id])
    unless @map.layers[0]
      @map.layers.build
      @map.layers[0].title = "Basis Ebene"
      @map.layers[0].subtitle = "(Automatisch angelegt)"
    end

    respond_to do |format|
      if @map.update_attributes(params[:map])
        format.html { redirect_to @map, notice: 'Karte wurde aktualisiert.' }
        format.json { head :ok }
      else
        format.html { render action: "edit" }
        format.json { render json: @map.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /maps/1
  # DELETE /maps/1.json
  def destroy
    @map = Map.find(params[:id])
    @map.destroy

    respond_to do |format|
      format.html { redirect_to maps_url }
      format.json { head :ok }
    end
  end

  def destroy_layer
    if params[:layer_id].blank?
      flash[:error] = "Keine ID für eine Ebene übergeben!"
      redirect_to :controller => "maps", :action => "edit", :id => params[:id]
    else
      @map = Map.find(params[:id])
      @layer = Layer.find(params[:layer_id])
      if ( @map.layers[0].id != @layer.id )
        Placemark.update_all({:layer_id => @map.layers[0].id}, {:layer_id => @layer.id})
        @layer.destroy
        flash[:notice] = "Ebene wurde gelöscht!"
        redirect_to :controller => "maps", :action => "edit", :id => params[:id]
      else
        flash[:error] = "Diese Ebene  kann nicht gelöscht werden (Basis Layer)!"
        redirect_to :controller => "maps", :action => "edit", :id => params[:id]
      end
    end
  end

  def publish
    @map = Map.find(params[:id])
    @map.update_attribute(:public, true)
    flash[:notice]="Karte '#{@map.title}' veröffentlicht"
    session[:return_to] ||= request.referer
    redirect_to session[:return_to]
  end

  def unpublish
    @map = Map.find(params[:id])
    @map.update_attribute(:public, false)
    flash[:notice]="Karte '#{@map.title}' versteckt"
    session[:return_to] ||= request.referer
    redirect_to session[:return_to]
  end


end
