package rules

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

	"code.tnxs.net/taxnexus/lib/api/crm/crm_client/contacts"
	"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"
	"code.tnxs.net/taxnexus/lib/app"
	httptransport "github.com/go-openapi/runtime/client"
	"go.temporal.io/sdk/workflow"
)

// StoreContactActivity posts a new contact object to datastore
func StoreContactActivity(ctx workflow.Context, w app.ContactActivityWrapper) error { //nolint:gocritic // don't care
	obj := &crm_models.Contact{
		AccountID:      w.AccountID,
		AssistantName:  w.AssistantName,
		AssistantPhone: w.AssistantPhone,
		BirthDate:      w.BirthDate,
		Department:     w.Department,
		Description:    w.Description,
		Email:          w.Email,
		FirstName:      w.FirstName,
		HomePhone:      w.HomePhone,
		LastName:       w.LastName,
		LeadSource:     w.LeadSource,
		Level:          w.Level,
		LinkedIn:       w.LinkedIn,
		MobilePhone:    w.MobilePhone,
		Name:           w.Name,
		OtherPhone:     w.OtherPhone,
		OwnerID:        w.OwnerID,
		PersonalEmail:  w.PersonalEmail,
		Phone:          w.Phone,
		PhotoURL:       w.PhotoURL,
		Ref:            w.Ref,
		ReportsToID:    w.ReportsToID,
		Salutation:     w.Salutation,
		Status:         w.Status,
		Title:          w.Title,
		Type:           w.Type,
		MailingAddress: w.MailingAddress.MarshalToCrm(),
		OtherAddress:   w.OtherAddress.MarshalToCrm(),
	}
	if obj.Name == "" {
		obj.Name = obj.FirstName + " " + obj.LastName
	}
	postContactParams := contacts.NewPostContactsParamsWithTimeout(postTimeout)
	postContactParams.ContactsRequest = &crm_models.ContactRequest{
		Data: []*crm_models.Contact{obj},
	}
	_, err := crmClient.Contacts.PostContacts(postContactParams,
		httptransport.APIKeyAuth(
			"X-API-Key",
			"header",
			w.APIKey,
		))
	if err != nil {
		return err
	}
	sugar.Info("crm.storeContact: 👍 📤")
	return nil
}

// NotifyContactActivity sends an email to a new lead
func NotifyContactActivity(ctx context.Context, w app.ContactActivityWrapper) error { //nolint:gocritic,lll // todo #2 need email templates
	sugar.Info("workflow.notifyContact: 📥")
	var buf bytes.Buffer
	const textBody = `

Alert! New Contact 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.Name,
				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("workflow.notifyContact: 👍 📤")
	return nil
}
