class MobileAppApi::V1::EventController < MobileAppApi::V1::BaseController

  before_filter :login_required!

  # Api to get all events of current user
  def get_events
    start_date = if params[:start_date]
      Date.parse(params[:start_date])
    else
      Date.today_in_time_zone.beginning_of_day.to_date
    end
    end_date = (start_date + 6.days).end_of_day.to_date
    events = @user.events.order(:start_time).for_date_range(start_date, end_date)
    events = events.map {|t| serialized_event(t)}
    events = events.group_by {|t| t['start_time'].to_date.to_s(:iso8601)}
    render json: {status: 200, events: events, date_range: [start_date, end_date]}
  end

  # Api to find event by its Id.
  def get_event
    begin
      event = @user.events.find(params[:id])
    rescue
      render json: {status: 401, error: 'Unauthorized'} and return
    end
    render json: {status: 200, event: serialized_event(event)}
  end

  # Api used to create new event by user through mobile app.
  def add_event
    event = @user.owned_events.build(event_params)
    if !event_params["user_emails"].blank?
      users = User.where(email: event_params["user_emails"].split(','))
      invitee_emails = event_params["user_emails"].split(',') - users.map(&:email)
      users.each do |user|
        event.shares.build(user_id: @user.id, shared_to: user)
      end
    end
    if event.save
      Invite.invite_users(invitee_emails, event) if invitee_emails.present?
      render json: {status: 200, message: 'event Added successfully.', event: serialized_event(event)}
    else
      render json: { status: 400, error: event.errors.full_messages }
    end
  end

  #Api to find and update the event created by current user
  def update_event
    begin
      event = @user.events.find(params[:id])
      if event.update_attributes(event_params)
        if !event_params["user_emails"].blank?
          event.share_with!(event_params["user_emails"].split(','))
        end
        render json: {status: 200, message: 'event updated successfully.', event: serialized_event(event)}
      else
        render json: { status: 400, error: event.errors.full_messages }
      end
    rescue
      render json: {status: 401, error: 'Unauthorized'} and return
    end
  end

  # Api to find and destroy the event created by current user.
  def remove_event
    begin
      event = @user.events.find(params[:id])
    rescue
      render json: {status: 401, error: 'Unauthorized'} and return
    end
    if event.can_delete?(@user)
      if event.destroy
        render json: {status: 200, message: 'event removed successfully.'}
      else
        render json: {status: 400, error: 'Unable to remove event, kindly contact our support team.'}
      end
    else
      render json: {status: 401, error: 'Unauthorized'}
    end
  end

  private
  def event_params
    permitted_params = params.required(:event).permit(:name, :description, :stime, :etime, :date, :frequency, :reminder, :owner_id, :user_emails, :grouped, shares_attributes: [:shared_to_id, :shared_to_type, :id, :user_id])
    permitted_params[:date] = Date.parse(permitted_params[:date]).try(:mm_dd_yyyy)
    permitted_params
  end

  def serialized_event(event)
    event.serializable_hash(only: [:id, :owner_id, :name,
      :description, :start_time, :end_time, :created_at, :updated_at, :frequency, :reminder, :status ])
  end

end
