package validate

import (
	"fmt"
	"net/http"
	"strings"
	"time"

	"github.com/prometheus-community/jiralert/pkg/alertmanager"
	"github.com/prometheus-community/jiralert/pkg/client"
	"github.com/prometheus-community/jiralert/pkg/clinic"
	"github.com/prometheus-community/jiralert/pkg/notify/precheck"
)

type Validator interface {
	Validate(target precheck.Target, data *alertmanager.Data, issue *client.Issue) (string, error)
}

type ValidateHandler struct {
	clinic *clinic.Client
	client *http.Client
}

var _ Validator = &ValidateHandler{}

func NewValidateHandler(clinic *clinic.Client) *ValidateHandler {
	httpCli := &http.Client{Timeout: 10 * time.Second}
	return &ValidateHandler{client: httpCli, clinic: clinic}
}

func (v *ValidateHandler) Validate(target precheck.Target, data *alertmanager.Data, issue *client.Issue) (string, error) {
	switch target.Source {
	case precheck.APISource:
		comments, err := v.validateByAPI(target.Params, data, issue)
		if err != nil {
			comments = append(comments, fmt.Sprintf("ERROR: fail to precheck by API, %v", err))
		}
		return strings.Join(comments, "\n"), err
	case precheck.EventSource:
		comments, err := v.validateByEvent(target.Params, data, issue)
		if err != nil {
			comments = append(comments, fmt.Sprintf("ERROR: fail to precheck by EVENT, %v", err))
		}
		return strings.Join(comments, "\n"), err
	default:
		return "fail to match validate source", fmt.Errorf("cannot find target event")
	}
}

type FakeValidator struct{}

var _ Validator = &FakeValidator{}

func (f *FakeValidator) Validate(target precheck.Target, data *alertmanager.Data, issue *client.Issue) (string, error) {
	return "fake validate", nil
}
