#coding=utf-8

module Mobile
  module Apis
    class NewComment< Grape::API
      include ApplicationHelper
      include ApiHelper
      resources :new_comment do

        desc "add a new comment"
        params do
          requires :type, type: String
          requires :content, type: String
        end
        post ':id' do
          unless current_user
            #如果当前用户不存在 则需要根据微信昵称注册一个帐号
            openid = session[:wechat_openid]
            raise "无法获取到openid,请在微信中打开本页面" unless openid
            us = UsersService.new

            access_token = session[:access_token]
            refresh_token = session[:refresh_token]
						
						if access_token.present? && refresh_token.present?
              begin
                refreshinfo = Wechat.api.web_refresh_access_token(refresh_token)
              rescue
                info = Wechat.api.web_access_token(session[:wechat_code])
                openid =info["openid"]
                access_token =info["access_token"]
                if access_token
                  session[:access_token] = access_token
                end
                refresh_token = info["refresh_token"]
                if refresh_token
                  session[:refresh_token] = refresh_token
                end
                refreshinfo = Wechat.api.web_refresh_access_token(refresh_token)
              end

							access_token = refreshinfo["access_token"]
							refresh_token = refreshinfo["refresh_token"]
							session[:access_token] = access_token
							session[:refresh_token] = refresh_token

							#获取用户信息
							userinfo = Wechat.api.web_userinfo(access_token,openid)
							Rails.logger.info "userinfo!!!!!!!!!"
							Rails.logger.info userinfo
							name = userinfo["nickname"]
						else
							name = openid[0..3]+"***"+openid.last
						end

            user = us.register ({:login=>openid, :mail=>"#{openid}@163.com",
                                 :password=>"12345678", :password_confirmation=>"12345678",
                                 :should_confirmation_password => true})
            raise user.errors.full_messages.first if user.new_record?
            user.update_attributes(:lastname=>name)
            #自动激活
            if Setting.self_registration != '3'
              user.activate
              user.last_login_on = Time.now
              if user.save
                UserStatus.create(:user_id => user.id, :changsets_count => 0, :watchers_count => 0)
              end
            end
            UserWechat.create!(
                openid: openid,
                user: user,
                bindtype: 1
            )
          end

          authenticate!

          subscribe = 0 #默认未关注

          #-------------------获取用户是否关注此公众号-----------------------------
          openid = session[:wechat_openid]
          raise "无法获取到openid,请在微信中打开本页面" unless openid
          user_info = Wechat.api.user(openid)
          Rails.logger.info "user_info!!!!!!!!!"
          Rails.logger.info user_info
          subscribe = user_info["subscribe"]

          status = 0
          tip = 0 #0班级1项目
          type = params[:type]
          result = 1

          #0回复 1回复的回复
          reply_type = params[:reply_type]

          update_id = 0

          if params[:content]!="" && current_user
            case type
              when "HomeworkCommon"
                #如果是私有的 并且不是成员则不能回复
                # is_public = homework_common.course.is_public
                # if is_public == 0 && !current_user.member_of_course?(homework_common.course)
                #   status = -1
                #   tip = 0
                # else
                #   feedback = HomeworkCommon.add_homework_jour(current_user, params[:content], params[:id])
                #   if (feedback.errors.empty?)
                #     homework_common.update_column(:updated_at, Time.now)
                #     result = 2
                #   end
                # end
                if reply_type == nil || reply_type == 0
                  homework_common = HomeworkCommon.find(params[:id])
                  feedback = HomeworkCommon.add_homework_jour(current_user, params[:content], params[:id])
                  if (feedback.errors.empty?)
                    homework_common.update_column(:updated_at, Time.now)
                    result = 2
                    update_id = homework_common.id
                  end
                else
                  #二级回复
                  reply = JournalsForMessage.find params[:id].to_i
                  homework_common = HomeworkCommon.find reply.jour_id

                  options = {:notes => params[:content], :reply_id => reply.user_id,:user_id => current_user.id,:m_parent_id => params[:id].to_i,:m_reply_id => params[:id].to_i}
                  feedback = HomeworkCommon.add_homework_jour(current_user, params[:content], reply.jour_id, options)
                  if (feedback.errors.empty?)
                    homework_common.update_column(:updated_at, Time.now)
                    result = 2
                    update_id = homework_common.id
                  end
                end

              when "News"
                # if news.project
                #   if news.project.is_public == false && !current_user.member_of?(news.project)
                #     status = -1
                #     tip = 1
                #   end
                # elsif news.course
                #   if news.course.is_public == 0 && !current_user.member_of_course?(news.course)
                #     status = -1
                #     tip = 0
                #   end
                # end
                if status == 0
                  if reply_type == nil || reply_type == 0
                    news = News.find(params[:id])
                    comment = Comment.new
                    comment.comments = params[:content]
                    comment.author = current_user
                    if news.comments << comment
                      result = 2
                      update_id = news.id
                    end
                  else
                    #二级回复
                    comment = Comment.find(params[:id])
                    news = News.find comment.commented_id
                    new_comment = news.comments.build(:author_id => current_user.id, :reply_id => params[:id], :comments => params[:content], :parent_id => comment.id)
                    if new_comment.save
                      result = 2
                      update_id = news.id
                    end
                  end
                end
              when "Message"
                # if message.project
                #   if message.project.is_public == false && !current_user.member_of?(message.project)
                #     status = -1
                #     tip = 1
                #   end
                # elsif message.course
                #   if message.course.is_public == 0 && !current_user.member_of_course?(message.course)
                #     status = -1
                #     tip = 0
                #   end
                # end

                if status == 0
                  # if reply_type == nil || reply_type == 0
                    message = Message.find(params[:id])
                    board = Board.find(message.board_id)
                    topic = message.root
                    reply = Message.new
                    reply.author = current_user
                    reply.board = board
                    reply.content = params[:content]
                    reply.parent_id = params[:id]
                    reply.subject = "RE: #{topic.subject}"
                    if message.children << reply
                      result = 2
                      update_id = topic.id
                    end
                  # else
                    #二级回复

                  # end
                end
              when "JournalsForMessage"
                # if jour.jour_type == "Project"
                #   if jour.project.is_public == false && !current_user.member_of?(jour.project)
                #     status = -1
                #     tip = 1
                #   end
                # elsif jour.jour_type == "Course"
                #   if jour.course.is_public == 0 && !current_user.member_of_course?(jour.course)
                #     status = -1
                #     tip = 0
                #   end
                # end

                if status == 0
                  # if reply_type == nil || reply_type == 0
                    jour = JournalsForMessage.find(params[:id]).root
                    parent_id = params[:id]
                    author_id = current_user.id
                    reply_user_id = jour.user_id
                    reply_id = params[:id]
                    content = params[:content]
                    options = {:user_id => author_id,
                               :status => true,
                               :m_parent_id => parent_id,
                               :m_reply_id => reply_id,
                               :reply_id => reply_user_id,
                               :notes => content,
                               :is_readed => false}
                    jfm = jour.user.add_jour(nil, nil, nil, options)
                    if jfm.errors.empty?
                      (JournalsForMessage.find parent_id).update_attribute(:updated_on,Time.now)
                      result = 2
                      update_id = jour.id
                    end
                  # else
                    #二级回复

                  # end
                end
              when 'Issue'
                # if issue.project.is_public == false && !current_user.member_of?(issue.project)
                #   status = -1
                #   tip = 1
                # end

                if status == 0
                  if reply_type == nil || reply_type == 0
                    issue = Issue.find params[:id]
                    is_jour = Journal.new
                    is_jour.user_id = current_user.id
                    is_jour.notes = params[:content]
                    is_jour.journalized = issue
                    if is_jour.save
                      result = 2
                      update_id = issue.id
                    end
                  else
                    #二级回复
                    jour = Journal.find(params[:id])
                    issue = jour.journalized
                    is_jour = Journal.new
                    is_jour.user_id = current_user.id
                    is_jour.notes = params[:content]
                    is_jour.reply_id = params[:id]
                    is_jour.parent_id = params[:id]
                    is_jour.journalized = issue
                    if is_jour.save
                      result = 2
                      update_id = issue.id
                    end
                  end
                end
              when 'BlogComment'
                if reply_type == nil || reply_type == 0
                  blog = BlogComment.find(params[:id]).root
                  blogComment = BlogComment.new
                  blogComment.author = current_user
                  blogComment.blog = blog.blog
                  blogComment.content = params[:content]
                  blogComment.title = "RE: #{blog.title}"
                  if blog.children << blogComment
                    result = 2
                    update_id = blog.id
                  end
                else
                  #二级回复
                  blog = BlogComment.find(params[:id]).root
                  blogComment = BlogComment.new
                  blogComment.author = current_user
                  blogComment.blog = blog.blog
                  blogComment.content = params[:content]
                  blogComment.title = "RE: #{blog.title}"
                  parent = BlogComment.find params[:id]
                  blogComment.parent_id = params[:id]         #被回复的回复
                  blogComment.reply_id = parent.author.id     #被回复者id

                  if parent.children << blogComment
                    result = 2
                    update_id = blog.id
                  end

                end
            end
            if result == 2
              update_course_activity_api(type,update_id)
              update_user_activity_api(type,update_id)
              update_org_activity_api(type,update_id)
              update_forge_activity_api(type,update_id)
              update_principal_activity_api(type,update_id)
            end
          else
            result = 3
          end
          present :result, result
          present :status, status
          present :act_id, update_id
          present :tip, tip
          present :subscribe,subscribe
        end
      end
    end
  end
end
