#encoding=utf-8
require 'net/http'
require 'digest'

class EcloudController < ApplicationController
  skip_before_filter :verify_authenticity_token

  before_filter :user_setup
  before_filter :require_login, only: [:authorize]


  skip_before_filter :verify_authenticity_token, only: [:ps_new, :ps_edit, :ecloud_login_callback]

  def index

    render file: 'public/react-oschina/build/index.html', :layout => false
  end

  def trustie_login
  end

  CLIENT_ID = '1022'
  CLIENT_SECRET = '2112037a-6d7a-432b-9081-feb1153d8668'
  ROOT_URl = 'http://localhost:3000'
  SERVER_URL = "https://221.176.54.92:9081/restful/services/"



  ## 签名
  def sign(timestamp)
    Digest::MD5.hexdigest("client_id=#{CLIENT_ID}client_key=#{CLIENT_SECRET}timestamp=#{timestamp}")
  end


  # 企业开通
  # ecordercode 唯一标志一个企业的订购关系
  def bs_new
    begin
      ecloud = Ecloud.create!(applyno: params['applyno'], ecordercode: params['ecordercode'], opttype: params['opttype'],
                              trial: params['trial'], bossorderid: params['bossorderid'], custid: params['custid'],
                              custcode: params['custcode'], registersource: params['registersource'], custname: params['custname'],
                              userid: params['userid'], username: params['username'], useralias: params['useralias'], mobile: params['mobile'],
                              email: params['email'], productcode: params['productcode'], begintime: params['begintime'],
                              endtime: params['endtime'])
      EcloudService.create(opttype: params['services']['opttype'], code: params['services']['code'], begintime: params['services']['begintime'],
                           endtime: params['services']['endtime'], ecloud_id: ecloud.try(:id))

      render :json => {result: true, errmsg: ""}
    rescue Exception => e
      logger.error(e.message)
      render :json => {code: 500, msg: "#{e.message}"}
    end
  end

  # 企业更新
  def bs_update
    ecloud = Ecloud.where(custid: params['custid']).first
    ecloud.update_attribute(applyno: params['applyno'], ecordercode: params['ecordercode'], opttype: params['opttype'],
                            custid: params['custid'], custcode: params['custcode'], productcode: params['productcode'],
                            operatime: params['operatime'], effecttime: params['effecttime'])
    ecloud.ecloud_services.update_attributes(packagecode: params['services']['packagecode'], bossorderid:  params['services']['bossorderid'])

  end

  # 用户业务开通接口
  def ps_new
    begin
      logger.info("11111######params")
      ecloud_user = EcloudUser.where(:custid => params['custid'], :user_id => params['users']['userid']).first
      if ecloud_user.present?
        render :json => {code: 501, msg: "你已开通过该业务"}
      else
        EcloudUser.create!(custid: params['custid'], opttype: params['users']['opttype'], userid: params['users']['userid'],
                           username: params['users']['username'], useralias: params['users']['useralias'],
                           mobile: params['users']['mobile'],  email: params['users']['email'],  begintime: params['users']['begintime'].to_s,
                           endtime: params['users']['endtime'].to_s)
        render :json => {success: true, errmsg: ""}
      end
    rescue Exception => e
      logger.error(e.message)
      render :json => {code: 500, msg: "#{e.message}"}
    end
  end

  # 用户业务变更、销毁接口
  def ps_update
    begin
      ecloud_user = EcloudUser.where(:custid => params['custid'], :user_id => params['users']['userid']).first
      if ecloud_user.present?
        ecloud_user.update_attributes(opttype: params['users']['opttype'])
        render :json => {code: 501, msg: "你已开通过该业务"}
      else
        render :json => {code: 404, errmsg: ""}
      end
    rescue Exception => e
      logger.error(e.message)
      render :json => {code: 500, msg: "#{e.message}"}
    end
  end

  def ecloud_login_callback
    #获取code
    logger.info "oauth2 login_callback: #{params}"

    raise "没有code" unless params[:code]

    url = "#{SERVER_URL}/oauth2/authorization?grant_type=authorization_code" +
        "&client_id=#{CLIENT_ID}&scope=&redirect_uri=&code=#{params[:code]}"

    res = post(url)
    logger.info "oauth2 authorization resp: #{res}"

    body = decode(res)
    #{"access_token":"21a80f20ff736b54aecd002b60210943","token_type":"bearer","expires_in":86400,"refresh_token":"be92e2c137a8c6dd22f0d8c4a622b3aeceb054087a95d293130f04ec60fd3e3f","scope":"user_info","created_at":1542684088}

    raise '登录失败' unless body["access_token"]

    #获取此用户信息

    # res = get("https://gitee.com/api/v5/user?access_token=#{body["access_token"]}")
    res = get("#{SERVER_URL}/user/info?access_token=#{body['access_token']}&userid=#{body['uid']}")
    logger.info "oauth2 get user info: #{res}"

    # 同步用户
    # info = decode(res)
    #
    # user =  User.find_by_oschina_user_id(info["id"])
    # unless user
    #   user = User.create_with_oschina!(info)
    # end
    #
    # @current_user = user

    render :index
  end


  private
  def get(url)
    uri = URI(url)
    res = Net::HTTP.start(uri.host, uri.port, use_ssl: url.start_with?('https')) do |http|
      req = Net::HTTP::Get.new(uri)
      #req['Content-Type'] = 'application/json'
      # The body needs to be a JSON string, use whatever you know to parse Hash to JSON
      #req.body = {a: 1}.to_json
      http.request(req)
    end

    res.body
  end

  def post(url)
    uri = URI(url)
    res = Net::HTTP.start(uri.host, uri.port, use_ssl: url.start_with?('https')) do |http|
      req = Net::HTTP::Post.new(uri)
      #req['Content-Type'] = 'application/json'
      # The body needs to be a JSON string, use whatever you know to parse Hash to JSON
      #req.body = {a: 1}.to_json
      http.request(req)
    end

    res.body
  end

  def decode(s)
    begin
      obj = ActiveSupport::JSON.decode(s)
    rescue ActiveSupport::JSON.parse_error
      logger.error("Attempted to decode invalid JSON: #{s}")
    end
  end

  private
  def ecloudeuser_params
    {}
  end
end