package main

import (
  "text/template"
  "fmt"
  "net/http"
  "net/url"
  "strings"
  "log"
  "os"
  "path/filepath"
)

type Page struct {
  Tit, Err, Bdy, Dec, Img, Url, Dom, Ver, Ves string
}

func extractGurl(r *http.Request) (string, error) {
  rq := r.URL.RawQuery
  q, err := url.QueryUnescape(rq)
  if err != nil {
    return "URLを受取に失敗", err
  }

  gurl := strings.Replace(q, "/?url=", "", -1)

  return gurl, nil
}

func serv (cnf Config, port int) {
  dir, err := filepath.Abs(filepath.Dir(os.Args[0]))
  if err != nil {
    log.Fatal(err)
  }
  err = os.Chdir(dir)
  if err != nil {
    log.Fatal(err)
  }

  http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir(cnf.webpath + "/static"))))
  ftmpl := []string{cnf.webpath + "/view/index.html", cnf.webpath + "/view/header.html", cnf.webpath + "/view/footer.html"}

  http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    // 1.xで、URLは「/?url=」が付いたけど、2.0.0からは不要になった
    // だから、下記の部分は古いURLの為だ
    urls, ok := r.URL.Query()["url"]
    if ok && len(urls[0]) > 0 {
      http.Redirect(w, r, "/" + urls[0], http.StatusMovedPermanently)
      return
    }

    data := &Page{Ver: version, Ves: strings.ReplaceAll(version, ".", "")}
    uri := r.URL.Path
    gurl, err := extractGurl(r)
    if err != nil {
      data.Tit = "エラー"
      data.Err = err.Error()
      ftmpl[0] = cnf.webpath + "/view/404.html"
    }

    if uri == "/" {
      ftmpl[0] = cnf.webpath + "/view/index.html"
    } else {
      furl := uri + "?" + gurl
      page := get(furl, cnf)
      data.Tit = page["title"]
      if page["err"] != "" {
        data.Err = page["err"]
        ftmpl[0] = cnf.webpath + "/view/404.html"
      } else {
        data.Bdy = page["content"]
        data.Img = "/static/logo.jpg"
        if isarticle(furl) {
          data.Dec = page["desc"]
          data.Img = page["img"]
          data.Url = cnf.domain + furl
        }
        ftmpl[0] = cnf.webpath + "/view/news.html"
      }
    }

    tmpl := template.Must(template.ParseFiles(ftmpl[0], ftmpl[1], ftmpl[2]))
    tmpl.Execute(w, data)
    data = nil
  })

  fmt.Println(fmt.Sprint("http://" + cnf.ip + ":", port, " でサーバーを実行中。終了するには、CTRL+Cを押して下さい。"))
  http.ListenAndServe(fmt.Sprint(cnf.ip + ":", port), nil)
}