// Copyright 2013 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import (
	"fmt"
	"go/build"
	"log"
	"net/http"
	"os"
	"path/filepath"
	"runtime"
	"strings"
	"sync"

	"golang.org/x/tools/blog"
	"golang.org/x/website/cmd/golangorg/godoc/redirect"
)

const (
	blogRepo = "golang.org/x/blog"
	blogURL  = "https://blog.golang.org/"
	blogPath = "/blog/"
)

var (
	blogServer   http.Handler // set by blogInit
	blogInitOnce sync.Once
	playEnabled  bool
)

func init() {
	// Initialize blog only when first accessed.
	http.HandleFunc(blogPath, func(w http.ResponseWriter, r *http.Request) {
		blogInitOnce.Do(func() {
			blogInit(r.Host)
		})
		blogServer.ServeHTTP(w, r)
	})
}

func blogInit(host string) {
	// Binary distributions included the blog content in "/blog".
	// We stopped including this in Go 1.11.
	root := filepath.Join(runtime.GOROOT(), "blog")

	// Prefer content from the golang.org/x/blog repository if present.
	if pkg, err := build.Import(blogRepo, "", build.FindOnly); err == nil {
		root = pkg.Dir
	}

	// If content is not available fall back to redirect.
	if fi, err := os.Stat(root); err != nil || !fi.IsDir() {
		fmt.Fprintf(os.Stderr, "Blog content not available locally. "+
			"To install, run \n\tgo get %v\n", blogRepo)
		blogServer = http.HandlerFunc(blogRedirectHandler)
		return
	}

	s, err := blog.NewServer(blog.Config{
		BaseURL:         blogPath,
		BasePath:        strings.TrimSuffix(blogPath, "/"),
		ContentPath:     filepath.Join(root, "content"),
		TemplatePath:    filepath.Join(root, "template"),
		HomeArticles:    5,
		PlayEnabled:     playEnabled,
		ServeLocalLinks: strings.HasPrefix(host, "localhost"),
	})
	if err != nil {
		log.Fatal(err)
	}
	blogServer = s
}

func blogRedirectHandler(w http.ResponseWriter, r *http.Request) {
	if r.URL.Path == blogPath {
		http.Redirect(w, r, blogURL, http.StatusFound)
		return
	}
	blogPrefixHandler.ServeHTTP(w, r)
}

var blogPrefixHandler = redirect.PrefixHandler(blogPath, blogURL)
