require 'csv'

class Panel::Survey::BackEnd::SurveysController < OrbitBackendController

  include AdminHelper
  include OrbitControllerLib::DivisionForDisable

  def initialize
    super
    @app_title = 'survey'
  end

  def index
    @surveys = (params[:sort]) ? get_sorted_and_filtered("survey") : get_viewable("survey")

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @qas }
      format.js
    end
  end

  def new
    @survey = ::Survey.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @survey }
    end
  end

  def create
    @survey = ::Survey.new(params[:survey])

    @survey.create_user_id = current_user.id
    @survey.update_user_id = current_user.id

    respond_to do |format|
      if @survey.save
        format.html { redirect_to(panel_survey_back_end_surveys_url) }
        format.xml  { render :xml => @survey, :status => :created, :location => @survey }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @survey.errors, :status => :unprocessable_entity }
      end
    end
  end

  def edit
    @survey = ::Survey.find(params[:id])
    @sqs = []
    @survey.survey_questions.each do |sq|
      sq['title_translations'] = sq.title_translations
      sq['description_translations'] = sq.description_translations
      temp = []
      sq.survey_question_options.each do |sqo|
        sqo['name_translations'] = sqo.name_translations
        temp << sqo
      end
      temp = []
      sq.survey_question_radiogroups.each do |sqr|
        sqr['name_translations'] = sqr.name_translations
        temp << sqr
      end
      sq.survey_question_radiogroups = temp
      @sqs << sq
    end
  end

  def update
    @survey = ::Survey.find(params[:id])
    @survey.update_user_id = current_user.id

    respond_to do |format|
      if @survey.update_attributes(params[:survey])
        format.html { redirect_to(panel_survey_back_end_surveys_url(:page => params[:page])) }
        format.xml  { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @survey.errors, :status => :unprocessable_entity }
      end
    end
  end

  def destroy
    @survey = ::Survey.find(params[:id])

    @survey.destroy

    respond_to do |format|

      format.html { redirect_to(panel_survey_back_end_surveys_url) }
      format.js
    end
  end

  def delete
    if params[:ids]
      surveys = ::Survey.any_in(:_id => params[:ids]).destroy_all
    end
    redirect_to panel_survey_back_end_surveys_url(:direction => params[:direction], :sort => params[:sort], :sort_options => params[:sort_options])
  end

  def export
    @survey = ::Survey.find(params[:id])
    @chart_data, @survey_questions, @survey_answers = @survey.generate_chart_data

    csv = CSV.generate do |csv|
      row = []
      @survey_questions.each do |question|
        row << question.title
        row << ' '
      end
      csv << row
      csv_stats = []
      @survey_questions.each do |question|
        csv_options = []
        csv_counts = []
        case question.type
        when ::SurveyQuestion::Radio, ::SurveyQuestion::Select, ::SurveyQuestion::Check
          question.survey_question_options.map do |option|
            csv_options << option.name
            csv_counts << "#{(@chart_data[question.id.to_s][option.name] || 0 rescue 0)}"
          end
        when ::SurveyQuestion::Radiogroup
          question.survey_question_options.map do |option|
            question.survey_question_radiogroups.map do |group|
              csv_options << "#{option.name} - #{group.name}"
              csv_counts << "#{(@chart_data[question.id.to_s][option.name][group.name] || 0 rescue 0)}"
            end
          end.flatten
        else
          csv_options << " "
          csv_counts << " "
        end
        csv_stats << csv_options
        csv_stats << csv_counts
      end
      max_length = csv_stats.map(&:length).max
      csv_stats.map do |l|
        while l.length < max_length
          l.push ' '
        end
        l
      end.transpose.each do |l|
        csv << l
      end
      @survey_answers.each do |answer|
        row = []
        @survey_questions.each do |question|
          if question.type == ::SurveyQuestion::Radiogroup
            options = Hash[question.survey_question_options.collect{|o| [ o.id.to_s, o.name ] }]
            row << Hash[answer[question.id.to_s].map {|o, g| [options[o], g]}]
          else
            row << answer[question.id.to_s]
          end
          row << ' '
        end
        csv << row
      end

    end

    respond_to do |format|
      format.csv do
        response.headers["Content-Type"] = "text/csv; charset=big5"
        render :text => csv.encode('Big5')
      end
    end
  end

  def set_answers
    @survey = ::Survey.find(params[:id])
  end

  def jump
    @survey = ::Survey.find(params[:id])
    @questions = @survey.survey_questions.all

    @jump_to_options = [[ t('survey.not_jump'), 0 ], [t('survey.jump_to_end'), 1]]
    @jump_to_options += @questions.collect {|q| [ q.title, q.id.to_s ] }
  end

  def duplicate_it
    @survey = ::Survey.find(params[:id])

    @new_survey = ::Survey.new

    @survey.attributes.each do |key, value|
      unless ['_id', 'created_at', 'updated_at', 'update_user_id'].include? key
        if @survey.respond_to?(key + '_translations')
          @new_survey.send(key + '_translations=', value)
        else
          @new_survey.write_attribute(key, value)
        end
      end
    end
    @survey.survey_questions.all.each do |question|
      new_question = @new_survey.survey_questions.new
      question.attributes.each do |key, value|
        unless ['_id', 'survey_id'].include? key
          if question.respond_to?(key + '_translations')
            new_question.send(key + '_translations=', value)
          else
            new_question.write_attribute(key, value)
          end
        end
      end
      question.survey_question_options.all.each do |option|
        new_option = new_question.survey_question_options.new
        option.attributes.each do |key, value|
          unless ['_id', 'survey_question_id'].include? key
            if option.respond_to?(key + '_translations')
              new_option.send(key + '_translations=', value)
            else
              new_option.write_attribute(key, value)
            end
          end
        end
      end
      question.survey_question_radiogroups.all.each do |radiogroup|
        new_radiogroup = new_question.survey_question_radiogroups.new
        radiogroup.attributes.each do |key, value|
          unless ['_id', 'survey_question_id'].include? key
            if radiogroup.respond_to?(key + '_translations')
              new_radiogroup.send(key + '_translations=', value)
            else
              new_radiogroup.write_attribute(key, value)
            end
          end
        end
      end
    end

    @new_survey.create_user_id = current_user.id
    @new_survey.update_user_id = current_user.id

    @new_survey.save!

    respond_to do |format|
      format.html { redirect_to(panel_survey_back_end_surveys_url) }
      format.xml  { render :xml => @survey, :status => :created, :location => @new_survey }
    end
  end
  
end
