package controllers

import (
	"code.google.com/p/goauth2/oauth"
	"github.com/revel/revel"
	"github.com/leanote/leanote/app/lea/netutil"
	. "github.com/leanote/leanote/app/lea"
	"encoding/json"
	"fmt"
)

type Oauth struct {
	BaseController
}

var oauthCfg = &oauth.Config{
	ClientId:     "3790fbf1fc14bc6c5d85",
	ClientSecret: "e9dadfe601c7caa6df9b33db3e7539945c60dfa2",
	AuthURL:      "https://github.com/login/oauth/authorize",
	TokenURL:     "https://github.com/login/oauth/access_token",
	RedirectURL:  "http://leanote.com/oauth/githubCallback",
	Scope: "user",
}

// 用户允许后, github返回到leanote
// 通过code得到token
// https://github.com/login/oauth/authorize?access_type=&approval_prompt=&client_id=3790fbf1fc14bc6c5d85&redirect_uri=http%3A%2F%2F127.0.0.1%3A8080%2Foauth2callback&response_type=code&scope=user&state=
func (c Oauth) GithubCallback(code string) revel.Result {
	t := &oauth.Transport{Config: oauthCfg}

	// Exchange the received code for a token
	tok, err := t.Exchange(code)
	token := tok.AccessToken
	if err != nil || token == "" {
		c.RenderArgs["title"] = "error"
		return c.RenderTemplate("oauth/oauth_callback_error.html")
	}

	// 得到用户信息
	profileInfoURL := "https://api.github.com/user"
	url := fmt.Sprintf("%s?access_token=%s", profileInfoURL, token)
	content, err2 := netutil.GetContent(url)
	if err2 != nil {
		c.RenderArgs["title"] = "error"
		return c.RenderTemplate("oauth/oauth_callback_error.html")
	}
	// 转成map
	profileInfo := map[string]interface{}{}
	Log(string(content))
	err2 = json.Unmarshal(content, &profileInfo)
	if err2 != nil {
		c.RenderArgs["title"] = "error"
		return c.RenderTemplate("oauth/oauth_callback_error.html")
	}

	usernameI := profileInfo["login"]

	username, _ := usernameI.(string)
	userId := username

	// 注册
	isExists, userInfo := authService.ThirdRegister("github", userId, username)
	c.RenderArgs["isExists"] = isExists
	c.RenderArgs["userInfo"] = userInfo

	// 登录之
	c.SetSession(userInfo)

	return c.Redirect("/note")
}