class ApiBandsController < ApiController

  before_filter :api_signed_in_user, :except => [:index, :show, :follower_index]
  before_filter :auth_band_member, :only => [:update, 
                :recording_create, :recording_update, :recording_destroy,
                :invitation_index, :invitation_show, :invitation_create, :invitation_destroy]

  respond_to :json

  def index
    @bands = Band.paginate(page: params[:page])
  end

  def show
    @band = Band.find(params[:id])
  end

  def create
    @band = Band.save(params[:id],
                      params[:name],
                      params[:website],
                      params[:biography],
                      params[:city],
                      params[:state],
                      params[:country],
                      params[:genres],
                      current_user.id,
                      params[:photo_url],
                      params[:logo_url])
    
    respond_with @band, responder: ApiResponder, :status => 201, :location => api_band_detail_url(@band)
  end

  def update
    @band = Band.save(params[:id],
                      params[:name],
                      params[:website],
                      params[:biography],
                      params[:city],
                      params[:state],
                      params[:country],
                      params[:genres],
                      current_user.id,
                      params[:photo_url],
                      params[:logo_url])

    respond_with @band, responder: ApiResponder, :status => :ok   
  end

  ###################### FOLLOWERS ########################
  def liker_index
    # NOTE: liker_index.rabl template references the likers property
    @band = Band.find(params[:id])
  end

  ###################### FOLLOWERS ########################
  def follower_index
    # NOTE: follower_index.rabl template references the followers property
    @band = Band.find(params[:id])
  end

  ###################### RECORDINGS #######################
  def recording_index
    @recordings = Band.recording_index(current_user, params[:id])
    respond_with @recordings, responder: ApiResponder, :status => 200
  end

  def recording_show
    hide_private = false
    band = Band.find(params[:id])

    # hide private Recordings from anyone who's not in the Band
    unless band.users.exists? current_user
      hide_private = true
    end

    @recording = Recording.find(params[:recording_id])
    if !@recording.public && hide_private
      render :json => { :message => "You are not allowed to access this recording." }, :status => 403
      #respond_with "You are not allowed to view this recording.", responder: ApiResponder, :status => 403
    else
      respond_with @recording, responder: ApiResponder, :status => 200
    end
  end

  def recording_create
    @recording = Recording.save(params[:recording_id],
                   params[:public],
                   params[:description],
                   params[:genres],
                   current_user.id,
                   params[:id],
                   true)

    respond_with @recording, responder: ApiResponder, :status => 201, :location => api_band_recording_detail_url(@band, @recording)
  end

  def recording_update
    @recording = Recording.save(params[:recording_id],
                                params[:public],
                                params[:description],
                                params[:genres],
                                current_user.id,
                                params[:id],
                                false)

    respond_with @recording, responder: ApiResponder, :status => 200
  end

  def recording_destroy
    @recording = Recording.find(params[:recording_id])

    unless @recording.nil?
      @recording.delete
      respond_with responder: ApiResponder, :status => 204
    end

    # no recording was found with this ID
    render :json => { :message => ValidationMessages::RECORDING_NOT_FOUND }, :status => 404 
  end

  ###################### INVITATIONS ######################
  def invitation_index
    @invitations = @band.invitations
    respond_with @invitations, responder: ApiResponder, :status => 200
  end

  def invitation_show
    begin
      @invitation = BandInvitation.find(params[:invitation_id])
      respond_with @invitation, responder: ApiResponder, :status => 200

    rescue ActiveRecord::RecordNotFound
      render :json => { :message => ValidationMessages::BAND_INVITATION_NOT_FOUND }, :status => 404 
    end
  end

  def invitation_create
    @invitation = BandInvitation.save(params[:invitation_id],
                                      params[:id],
                                      params[:user_id],
                                      current_user.id,
                                      params[:accepted])

    respond_with @invitation, responder: ApiResponder, :status => 201, :location => api_band_invitation_detail_url(@band, @invitation)
  end


  def invitation_destroy
    begin
      @invitation = BandInvitation.find(params[:invitation_id])
      @invitation.delete
      respond_with responder: ApiResponder, :status => 204

    rescue ActiveRecord::RecordNotFound
      render :json => { :message => ValidationMessages::BAND_INVITATION_NOT_FOUND }, :status => 404 
    end
  end

  #############################################################################
  protected
    # ensures user is a member of the band
    def auth_band_member
      @band = Band.find(params[:id])
      unless @band.users.exists? current_user
        raise PermissionError, ValidationMessages::PERMISSION_VALIDATION_ERROR
      end
    end
end