package caddyhugo

import (
	"fmt"
	"html/template"
	"os"
	"path"
	"path/filepath"

	"git.stephensearles.com/stephen/caddy-hugo2/comments"
	"git.stephensearles.com/stephen/caddy-hugo2/media"

	"github.com/gohugoio/hugo/hugofs"
	"github.com/mholt/caddy"
	"github.com/mholt/caddy/caddyhttp/httpserver"
)

var eventHookCounter uint64

func SetupCaddy(c *caddy.Controller) error {
	ch := &CaddyHugo{}

	ch.Site = httpserver.GetConfig(c)
	root, err := filepath.Abs(ch.Site.Root)
	if err != nil {
		return err
	}
	err = ch.Setup(root)

	c.OnShutdown(func() error {
		return ch.persistAllEdits()
	})

	ch.Site.AddMiddleware(ch.Middleware(c))
	ch.commentsSetting(c)

	return err
}

func (ch *CaddyHugo) commentsSetting(c *caddy.Controller) {
	for c.NextLine() {
		if c.Val() == "hugo" {
			for c.NextBlock() {
				if c.Val() == "comments" {
					ch.Comments = comments.WithStorage(comments.NewDiskv(path.Join(ch.Site.Root, "comments")))
					if c.NextArg() {
						ch.Comments.Password = c.Val()
					}
				}
			}
		}
	}
}

func (ch *CaddyHugo) Setup(dir string) error {
	var err error

	ch.Dir = dir
	ch.docs = make(map[string]*editSession)
	ch.confirmingToClient = make(map[uint64]struct{})

	ch.HugoSites, ch.HugoCfg, err = ch.configWithFs(hugofs.Os)
	if err != nil {
		return fmt.Errorf("error setting up hugo : %v", err)
	}

	err = ch.Build()
	if err != nil {
		return fmt.Errorf("error building initial hugo: %v", err)
	}

	ch.authorTmpl, err = template.New("").Parse(AuthorPage)
	if err != nil {
		return fmt.Errorf("author template invalid: %v", err)
	}

	ch.adminTmpl, err = template.New("").Parse(AdminPage)
	if err != nil {
		return fmt.Errorf("admin template invalid: %v", err)
	}

	ch.editTmpl, err = template.New("").Parse(EditPage)
	if err != nil {
		return fmt.Errorf("edit template invalid: %v", err)
	}

	ch.Media = &media.MediaSource{
		StorageDir: path.Join(dir, "media"),
		ThumbDir:   path.Join(dir, "thumbs"),
	}

	err = os.MkdirAll(ch.Media.StorageDir, 0755)
	if err != nil {
		return fmt.Errorf("couldn't initialize media: %v", err)
	}

	err = writeThemeFiles(ch.Dir)
	if err != nil {
		fmt.Println("error installing theme files:", err)
	}

	err = ch.Publish()
	if err != nil {
		fmt.Println("error with initial publish of hugo site:", err)
	}

	return nil
}
