module Api
  module V1
    class RepliesController < BaseController

      before_action :set_custom_errors_messages
      before_action :load_locale

      def_param_group :photo do
        param :content, String,"Contenido de la foto en <Base64Encoded data>",required: true
        param :filename, String,"Nombre del archivo incluyendo la extensión. Ejemplo :  original_filename.jpg",required: true
        param :content_type, String, "Se refiere al formato de la imagen. Ejemplo: image/jpeg. Los formatos soportados son: XXX,XXX,XXX.",required: true
      end

      def_param_group :reply do
        param_group :photo
        param :question_id, String, "Corresponde al id de la pregunta a la cual se agrega la respuesta.",required: true
      end

      api :POST, "/v1/replies", "Permite la creación de una respuesta al usuario especificado en el access_token. Los parámetros deben ser entregados en el BODY."
      param_group :reply
      error 422, "Indicidará el atributo y su respectivo mensaje del modo { <atributo> : <mensaje>, ....}"
      example "
        Los parámetros deben ser ingresados del siguiente modo:

        {
        	'reply': {
        		'question_id': '79',
        		'photo': {
        			'filename': 'squartle.jpeg',
        			'content': '<content_BASE64>',
        			'content_type': 'image/jpeg'
        		}
        	}
        }

        La respuesta en forma positiva es:

        {'message':'<descripcion_mensaje>'}
      "
      def create
        #It saves errors
        @reply = Reply.new
        photo = parse_photo_data(@reply,params[:reply][:photo]) if params[:reply][:photo]
        @question = Question.find(params[:reply][:question_id]) if params[:reply][:question_id]

        @reply.question = @question
        @reply.user = current_user
        if @reply.errors.empty?
          @reply.photo = photo
        end

        #TODO: See why base errors are not displayed
        if @reply.save
          clean_tempfile
          render json:{message:@translations[:success][:create]},status:200
        else
          render json:@reply.errors,status: :unprocessable_entity
        end
      end

      api :POST, "/api/v1/replies/:id/buy", "Permite la compra de una pregunta al usuario especificado en el access_token. Al realizar la compra, reduce los créditos del usuario en el monto espeficado por el valor de la respuesta.  "
      param :id, String, desc:"Identificador de la pregunta solicitada.", required: true
      error 422, "Indica el error del modo : {'message':'descripcion_error'}"
      def buy
        @reply = Reply.find(params[:id])

        result = CreditService.instance.accept_reply(current_user, @reply)

        if result.has_key?(:notice)
          render json: { reply: Api::V1::BoughtReplySerializer.new(@reply,root:false),message:@translations[:success][:buy],reamining_credits:current_user.credits},status:200
        else
          render json: {message:@translations[:errors][:buy][:fail]}, status: :unprocessable_entity
        end
      end

      api :POST, "/api/v1/replies/:id/qualify", "Permite calificar una pregunta utilizando un puntaje entre 1 y 5."
      param :id, String, desc:"Identificador de la pregunta solicitada.", required: true
      param :score, String, desc:"Corresponde a la calificación entregada a la pregunta. El valor debe estar entre 1 y 5.", required: true
      error 422, "Indicidará el atributo y su respectivo mensaje del modo { <atributo> : <mensaje>, ....}"
      def qualify
        @reply = Reply.find(params[:id])
        if @reply.add_score(params[:score])
          render json: {message: @translations[:success][:qualify]},status:200
        else
          render json: @reply.errors,status: :unprocessable_entity
        end
      end

      api :GET, "/api/v1/replies/my_replies", "Permite obtener todas las respuestas del usuario especificado en el access_token."
      error 500, "Indicará una descripción del error en el siguiente formato {'error': 'descripción del error',...}"
      example "
        [
          {
            'id': 5,
            'photo_links': {
              'medium': '/images/replies/medium/4khbtEh-yJOXJiU4puaEcA?1481236068',
              'large': '/images/replies/large/4khbtEh-yJOXJiU4puaEcA?1481236068'
            },
            'score': null,
            'is_buyed': true,
            'created_at': '2016-10-29T00:00:00.000-03:00',
            'disabled': false
          },
          {
            'id': 8,
            'photo_links': {
              'medium': '/images/replies/medium/t_4Daopj-2MgqtcM4dPRpg?1481236070',
              'large': '/images/replies/large/t_4Daopj-2MgqtcM4dPRpg?1481236070'
            },
            'score': 5,
            'is_buyed': true,
            'created_at': '2016-10-17T00:00:00.000-03:00',
            'disabled': false
          },...
        ]
      "
      def my_replies
        @my_replies = current_user.replies

        render json: @my_replies, each_serializer: Api::V1::MyRepliesSerializer
      end

      private
      def set_custom_errors_messages
        @custom_errors = {}
      end

      def load_locale
        @translations = I18n.t('api.replies')
      end
    end
  end
end
