package measure

import (
	"encoding/json"
	"errors"
	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/sqs"
)

const (
	REGION         = "us-west-2"
	Prod    string = "prod"
	Staging string = "staging"
	Dev     string = "dev"
)

var SQSQueueURLMap = map[string]string{
	Dev:     "https://sqs.us-west-2.amazonaws.com/385595570414/billing-report-nightly",
	Staging: "https://sqs.us-west-2.amazonaws.com/385595570414/billing-report-staging",
	Prod:    "https://sqs.us-west-2.amazonaws.com/380838443567/billing-report-prod",
}

type MeasureSQSImpl struct {
	sqsClient *sqs.SQS
	queueURL  string
}

func (m *MeasureSQSImpl) InitMeasureSqsHandler(envType string, queueUrl string) error {
	if len(envType) < 1 {
		return errors.New("envType param is null . ")
	}
	sess, err := session.NewSession(aws.NewConfig().WithRegion(REGION))
	m.sqsClient = sqs.New(sess)
	if err != nil {
		return err
	}
	url, ok := SQSQueueURLMap[envType]
	if !ok {
		return errors.New("envType param  is invalid.")
	}
	// use app cfg
	if len(queueUrl) > 0 {
		url = queueUrl
	}
	m.queueURL = url

	return nil
}
func (m *MeasureSQSImpl) SendMeasure(billingMeasure BillingMeasure) error {
	err := m.CheckMeasure(billingMeasure)
	if err != nil {
		return err
	}
	jsonData, err := json.Marshal(billingMeasure)
	if err != nil {
		return err
	}
	_, err = m.sqsClient.SendMessage(&sqs.SendMessageInput{
		MessageBody:  aws.String(string(jsonData)),
		QueueUrl:     aws.String(m.queueURL),
		DelaySeconds: aws.Int64(0),
	})
	if err != nil {
		return err
	}

	return nil
}
func (m *MeasureSQSImpl) CheckMeasure(billingMeasure BillingMeasure) error {
	if billingMeasure.TenantID < 1 {
		return errors.New("TenantID param invalid")
	}
	if len(billingMeasure.CostID) < 1 {
		return errors.New("CostID param invalid")
	}
	if billingMeasure.Cost < 1 {
		return errors.New("cost param invalid")
	}
	if billingMeasure.CostTimestamp < 1 {
		return errors.New("CostTimestamp param invalid")
	}
	if len(billingMeasure.Unit) < 1 {
		return errors.New("unit param invalid")
	}

	return nil
}
