package main

import (
	"encoding/json"
	"errors"
	"fmt"
	"log"
	"net/http"
)

type errorHTTPResponse struct {
	ErrorMsg       string
	HTTPStatusCode int
	HTTPHeader     http.Header
}

func (e errorHTTPResponse) Error() string {
	return e.ErrorMsg
}

func errorHTTPResponseNew(r *http.Response, msg string) (e errorHTTPResponse) {
	e.ErrorMsg = msg
	e.HTTPStatusCode = r.StatusCode
	e.HTTPHeader = r.Header
	return e
}

type crmdReason struct {
	Reason string                      `json:"reason"`
	Data   map[string]*json.RawMessage `json:"data"`
}

func (e errorHTTPResponse) XStatusReason() (r crmdReason) {
	jsonStr := e.HTTPHeader.Get("X-Status-Reason")
	json.Unmarshal([]byte(jsonStr), &r)
	return
}

func (m crmdReason) Data2Entity(entityType string) (r interface{}, err error) {
	if len(m.Data) > 1 {
		log.Println("Warning: Multiple data object found, only choose first one")
		log.Println(m)
	}

	//only take one object
	for _, v := range m.Data {
		switch entityType {
		case "Lead":
			e := crmdLead{}
			err = json.Unmarshal(*v, &e)
			r = e
		case "Account":
			//r = crmdAccount{}
		default:
			msg := fmt.Sprintf("(crmdReason) Data2Entity: Unknown EntityType %s", entityType)
			err = errors.New(msg)
			log.Fatalln(err)
		}
		break //after procesing first ojbect, we quite, neglect all the rest
	}
	return
}
