package rules

import (
	"bytes"
	"context"
	"html/template"

	"code.tnxs.net/taxnexus/lib/api/crm/crm_client/leads"
	"code.tnxs.net/taxnexus/lib/api/crm/crm_models"
	"code.tnxs.net/taxnexus/lib/api/workflow/workflow_client/outgoing_email_message"
	"code.tnxs.net/taxnexus/lib/api/workflow/workflow_models"
	httptransport "github.com/go-openapi/runtime/client"
	"go.temporal.io/sdk/workflow"
)

// NewLeadActivityWrapper wraps the object with workflow params
type NewLeadActivityWrapper struct {
	APIKey   string
	SagaID   string
	SagaType string
	//
	Company     string
	Description string
	Email       string
	FirstName   string
	LastName    string
	UTMSource   string
}

// StoreLeadActivity posts a new lead object to datastore
func StoreLeadActivity(ctx workflow.Context, w NewLeadActivityWrapper) error { //nolint:gocritic // don't care
	sugar.Info("rules.StoreLeadActivity: 📥")
	sugar.Debugf("rules.StoreLeadActivity: 📏 ctx: %v", ctx)
	obj := &crm_models.Lead{
		Company:     w.Company,
		Description: w.Description,
		Email:       w.Email,
		FirstName:   w.FirstName,
		LastName:    w.LastName,
		Name:        w.FirstName + " " + w.LastName,
		UTMSource:   w.UTMSource,
	}
	postLeadParams := leads.NewPostLeadsParamsWithTimeout(postTimeout)
	postLeadParams.LeadRequest = &crm_models.LeadRequest{
		Data: []*crm_models.Lead{obj},
	}
	_, err := crmClient.Leads.PostLeads(postLeadParams,
		httptransport.APIKeyAuth(
			"X-API-Key",
			"header",
			w.APIKey,
		))
	if err != nil {
		return err
	}
	sugar.Info("rules.StoreLeadActivity: 👍 📤")
	return nil
}

// NotifyLeadActivity sends an email to a new lead
func NotifyLeadActivity(ctx context.Context, w NewLeadActivityWrapper) error { //nolint:gocritic,lll // todo #2 need email templates
	sugar.Info("rules.NotifyLeadActivity: 📥")
	sugar.Debugf("rules.StoreLeadActivity: 📏 ctx: %v", ctx)
	var buf bytes.Buffer
	const textBody = `

Alert! New Lead Inquiry from Taxnexus.io website.

 Taxnexus ID: {{.ID}}
  First Name: {{.FirstName}}
   Last Name: {{.LastName}}
       Email: {{.Email}}
     Message: {{.Description}}
     
-- end --
`
	t := template.Must(template.New("textBody").Parse(textBody))
	err := t.Execute(&buf, w)
	if err != nil {
		return err
	}
	emailParams := outgoing_email_message.NewPostOutgoingEmailMessagesParamsWithTimeout(postTimeout)
	emailParams.OutgoingEmailMessageRequest = &workflow_models.OutgoingEmailMessageRequest{
		Data: []*workflow_models.OutgoingEmailMessage{
			{
				Subject:              "New lead from " + w.FirstName + " " + w.LastName,
				ValidatedFromAddress: "support@taxnexus.net",
				ToAddress:            "info@taxnexus.net",
				FromName:             "Taxnexus Onboarding",
				Text:                 buf.String(),
				HTML:                 "<pre>" + buf.String() + "</pre>",
			},
		},
	}
	_, err = workflowClient.OutgoingEmailMessage.PostOutgoingEmailMessages(emailParams,
		httptransport.APIKeyAuth(
			"X-API-Key",
			"header",
			w.APIKey,
		))
	if err != nil {
		return err
	}
	sugar.Info("rules.NotifyLeadActivity: 👍 📤")
	return nil
}
