package template_display

import (
	"bytes"
	"encoding/json"
	"fmt"
	"user-behavior/pkg/clinic_event"
)

func (params BackupTemplateParams) SendEvent(eventType EventType) error {
	eventRequest := clinic_event.EventRequest{
		ApplicationID: fmt.Sprintf("%d", params.TenantId),
		TargetID:      fmt.Sprintf("%d", params.ClusterId),
		Catalog:       "backup",
		SeverityLevel: int(clinic_event.Info),
		Payload:       make(map[string]interface{}),
		ContextID:     fmt.Sprintf("backup-%d-%d", params.ClusterId, params.BackupId),
	}

	// gen payload
	payloadByte, err := json.Marshal(params)
	if err != nil {
		return err
	}
	payloadDecoder := json.NewDecoder(bytes.NewBuffer(payloadByte))
	payloadDecoder.UseNumber()
	payloadDecoder.Decode(&eventRequest.Payload)

	switch eventType {
	case BackupStart:
		eventRequest.Name = "backup:start"
		eventRequest.CalibrationTime = params.CreatedAt
		eventRequest.Payload["summary"] = fmt.Sprintf("Starting %s backup(%d) task", params.BackupType, params.BackupId)

	case BackupFinish:
		eventRequest.Name = "backup:finish"
		eventRequest.CalibrationTime = params.FinishedAt
		eventRequest.Payload["summary"] = fmt.Sprintf("%s backup finished(%d) task", params.BackupType, params.BackupId)
	default:
		return nil
	}

	return clinic_event.SendEvent(eventRequest)
}

func (params RestoreTemplateParams) SendEvent(eventType EventType) error {
	eventRequest := clinic_event.EventRequest{
		ApplicationID: fmt.Sprintf("%d", params.TenantId),
		TargetID:      fmt.Sprintf("%d", params.ClusterId),
		Catalog:       "restore",
		SeverityLevel: int(clinic_event.Info),
		Payload:       make(map[string]interface{}),
		ContextID:     fmt.Sprintf("restore-%d-%d", params.ClusterId, params.RestoreId),
	}

	// gen payload
	payloadByte, err := json.Marshal(params)
	if err != nil {
		return err
	}
	payloadDecoder := json.NewDecoder(bytes.NewBuffer(payloadByte))
	payloadDecoder.UseNumber()
	payloadDecoder.Decode(&eventRequest.Payload)

	switch eventType {
	case RestoreStart: /*  */
		eventRequest.Name = "restore:start"
		eventRequest.CalibrationTime = params.CreatedAt
		eventRequest.Payload["summary"] = fmt.Sprintf("Starting to restore(%d)", params.RestoreId)

	case RestoreFinish:
		eventRequest.Name = "restore:finish"
		eventRequest.CalibrationTime = params.FinishedAt
		eventRequest.Payload["summary"] = fmt.Sprintf("Cluster restored (%d)", params.RestoreId)
	default:
		return nil
	}

	return clinic_event.SendEvent(eventRequest)
}

func (params ImportTemplateParams) SendEvent(eventType EventType) error {

	eventRequest := clinic_event.EventRequest{
		ApplicationID: fmt.Sprintf("%d", params.TenantId),
		TargetID:      fmt.Sprintf("%d", params.ClusterId),
		Catalog:       "import",
		SeverityLevel: int(clinic_event.Info),
		Payload:       make(map[string]interface{}),
		ContextID:     fmt.Sprintf("import-%d-%d", params.ClusterId, params.ImportId),
	}

	// gen payload
	payloadByte, err := json.Marshal(params)
	if err != nil {
		return err
	}
	payloadDecoder := json.NewDecoder(bytes.NewBuffer(payloadByte))
	payloadDecoder.UseNumber()
	payloadDecoder.Decode(&eventRequest.Payload)

	switch eventType {
	case ImportStart:
		eventRequest.Name = "import:start"
		eventRequest.CalibrationTime = params.CreatedAt
		eventRequest.Payload["summary"] = fmt.Sprintf("Starting to import(%d)", params.ImportId)

	case ImportFinish:
		eventRequest.Name = "import:finish"
		eventRequest.CalibrationTime = params.FinishedAt
		eventRequest.Payload["summary"] = fmt.Sprintf("Import task finished(%d)", params.ImportId)
	default:
		return nil
	}

	return clinic_event.SendEvent(eventRequest)
}

func (params ClusterOperationTemplateParams) SendEvent(eventType EventType) error {

	eventRequest := clinic_event.EventRequest{
		ApplicationID: fmt.Sprintf("%d", params.TenantId),
		TargetID:      fmt.Sprintf("%d", params.ClusterId),
		Catalog:       params.ClusterOperationType,
		SeverityLevel: int(clinic_event.Info),
		Payload:       make(map[string]interface{}),
		ContextID:     fmt.Sprintf("%s-%d-%d", params.ClusterOperationType, params.ClusterId, params.ClusterOperationId),
	}

	// gen payload
	payloadByte, err := json.Marshal(params)
	if err != nil {
		return err
	}
	payloadDecoder := json.NewDecoder(bytes.NewBuffer(payloadByte))
	payloadDecoder.UseNumber()
	payloadDecoder.Decode(&eventRequest.Payload)

	switch eventType {
	case ClusterOperationStart:
		eventRequest.Name = fmt.Sprintf("%s:start", params.ClusterOperationType)
		eventRequest.CalibrationTime = params.CreatedAt
		eventRequest.Payload["summary"] = fmt.Sprintf("Starting to %s(%d)", params.ClusterOperationType, params.ClusterOperationId)

	case ClusterOperationFinish:
		eventRequest.Name = fmt.Sprintf("%s:finish", params.ClusterOperationType)
		eventRequest.CalibrationTime = params.CompletedAt
		eventRequest.Payload["summary"] = fmt.Sprintf("Cluster %sd(%d)", params.ClusterOperationType, params.ClusterOperationId)
	default:
		return nil
	}

	return clinic_event.SendEvent(eventRequest)
}

// cluster create Event not need send
func (params ClusterCreationTemplateParams) SendEvent(eventType EventType) error {

	return nil
}

// Tenant create Event not need send
func (params NewTenantTemplateParams) SendEvent(eventType EventType) error {

	return nil
}

//  Empty return nil
func (params EmptyTemplateParams) SendEvent(eventType EventType) error {

	return nil
}

// Currently we do nothing about clinic for df jobs
func (params DFJobTemplateParams) SendEvent(_ EventType) error {
	return nil
}
