// 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/internal/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)
