package apigee

import (
	"bytes"
	"encoding/json"
	"fmt"
	"io"
	"net/http"
	"os"

	"github.com/apid/istioApigeeAdapter/adapter/config"
	me "github.com/hashicorp/go-multierror"
	"istio.io/mixer/pkg/adapter"
)

type (
	builder struct{ adapter.DefaultBuilder }

	logger struct{ logStream io.Writer }

	analyticsRecord struct {
		ClientReceivedStartTimestamp int    `json:"client_received_start_timestamp"`
		ClientReceivedEndTimestamp   int    `json:"client_received_end_timestamp"`
		RecordType                   string `json:"recordType"`
		ApiProxy                     string `json:"apiproxy"`
		RequestUri                   string `json:"request_uri"`
		RequestPath                  string `json:"request_path"`
		RequestVerb                  string `json:"request_verb"`
		ClientIp                     string `json:"request_path"`
		UserAgent                    string `json:"useragent"`
		ApiProxyRevision             string `json:"apiproxy_revision"`
		ResponseStatusCode           int    `json:"response_status_code"`
		ClientSentStartTimestamp     int    `json:"client_sent_start_timestamp"`
		ClientSentEndTimestamp       int    `json:"client_sent_end_timestamp"`
		DeveloperEmail               string `json:"developer_email,omitempty"`
		DeveloperApp                 string `json:"developer_app"`
		AccessToken                  string `json:"access_token,omitempty"`
		ClientId                     string `json:"client_id,omitempty"`
		ApiProduct                   string `json:"api_product"`
	}

	analyticsRecordCollection struct {
		Records []analyticsRecord `json:"records"`
	}

	edgemicroKeys struct {
		Key    string
		Secret string
	}
)

func newReportBuilder() builder {
	return builder{adapter.NewDefaultBuilder(
		"apigeeReport",
		"Report logs to apigee",
		&config.ReportParams{},
	)}
}

func (builder) NewApplicationLogsAspect(env adapter.Env, cfg adapter.Config) (adapter.ApplicationLogsAspect, error) {
	return newLogger(cfg)
}

func (builder) NewAccessLogsAspect(env adapter.Env, cfg adapter.Config) (adapter.AccessLogsAspect, error) {
	return newLogger(cfg)
}

func newLogger(cfg adapter.Config) (*logger, error) {
	c := cfg.(*config.ReportParams)

	w := os.Stderr
	if c.LogStream == config.STDOUT {
		w = os.Stdout
	}

	return &logger{w}, nil
}

func (l *logger) Log(entries []adapter.LogEntry) error {
	return l.log(entries)
}

func (l *logger) LogAccess(entries []adapter.LogEntry) error {
	fmt.Println("*** here")
	return l.log(entries)
}

func (l *logger) log(entries []adapter.LogEntry) error {
	var recordsCollection []analyticsRecord

	var errors *me.Error
	for _, entry := range entries {

		if err := writeJSON(l.logStream, entry); err != nil {
			errors = me.Append(errors, err)
		}

		ax_data := analyticsRecord{
			ClientReceivedStartTimestamp: 33,
			DeveloperApp:                 "microgateway-demo",
		}

		recordsCollection = append(recordsCollection, ax_data)

	}

	res2B, _ := json.Marshal(recordsCollection)
	fmt.Println(string(res2B))

	return errors.ErrorOrNil()
}

func (l *logger) Close() error { return nil }

func writeJSON(w io.Writer, le interface{}) error {
	return json.NewEncoder(w).Encode(le)
}

func sendAnalyticsRecords(collection analyticsRecordCollection, keys edgemicroKeys, uri string) bool {
	serializedBody, _ := json.Marshal(&collection)
	req, _ := http.NewRequest("POST", uri, bytes.NewBuffer(serializedBody))
	req.SetBasicAuth(keys.Key, keys.Secret)
	req.Header.Add("content-type", "application/json")
	client := &http.Client{}
	resp, _ := client.Do(req)
	if resp.StatusCode != 200 {
		return false
	} else {
		return true
	}
}
