package activityserve

import (
	"bufio"
	"io"
	"net/http"
	"os"

	// 	"net/url"
	"bytes"
	"encoding/json"

	// 	"time"
	// 	"fmt"
	"github.com/gologme/log"
	// 	"github.com/go-fed/httpsig"
)

func isSuccess(code int) bool {
	return code == http.StatusOK ||
		code == http.StatusCreated ||
		code == http.StatusAccepted ||
		code == http.StatusNoContent
}

//PrettyPrint maps
func PrettyPrint(themap map[string]interface{}) {
	b, err := json.MarshalIndent(themap, "", "  ")
	if err != nil {
		log.Info("error:", err)
	}
	log.Print(string(b))
}

//PrettyPrintJSON does what it's name says
func PrettyPrintJSON(theJSON []byte) {
	dst := new(bytes.Buffer)
	json.Indent(dst, theJSON, "", "\t")
	log.Info(dst)
}

// FormatJSON formats json with tabs and
// returns the new string
func FormatJSON(theJSON []byte) string {
	dst := new(bytes.Buffer)
	json.Indent(dst, theJSON, "", "\t")
	return dst.String()
}

// FormatHeaders to string for printing
func FormatHeaders(header http.Header) string {
	buf := new(bytes.Buffer)
	header.Write(buf)
	return buf.String()
}

func context() [1]string {
	return [1]string{"https://www.w3.org/ns/activitystreams"}
}

// ReadLines reads specific lines from a file and returns them as
// an array of strings
func ReadLines(filename string, from, to int) (lines []string, err error) {
	lines = make([]string, 0, to-from)
	reader, err := os.Open(filename)
	if err != nil {
		log.Info("could not read file")
		log.Info(err)
		return
	}
	sc := bufio.NewScanner(reader)
	line := 0
	for sc.Scan() {
		line++
		if line >= from && line <= to {
			lines = append(lines, sc.Text())
		}
	}
	return lines, nil
}

func lineCounter(filename string) (int, error) {
	r, err := os.Open(filename)
	if err != nil {
		log.Info("could not read file")
		log.Info(err)
		return 0, nil
	}
	buf := make([]byte, 32*1024)
	count := 0
	lineSep := []byte{'\n'}

	for {
		c, err := r.Read(buf)
		count += bytes.Count(buf[:c], lineSep)

		switch {
		case err == io.EOF:
			return count, nil

		case err != nil:
			return count, err
		}
	}
}
