package phase

import (
	"fmt"
	"net/url"

	"github.com/tidbcloud/devops/entity"
	rmapi "github.com/tidbcloud/devops/pkg/service/remediationticket/api"
)

type PhaseRDGSLAOwner struct {
	*basePhase
}

func (p *PhaseRDGSLAOwner) PhaseName() string {
	return p.basePhase.phaseName
}

func (p *PhaseRDGSLAOwner) PhaseNo() uint {
	return p.basePhase.phaseNum
}

func (*PhaseRDGSLAOwner) Successors() []*Phase {
	return nil
}

func (*PhaseRDGSLAOwner) Predecessors() []*Phase {
	return nil
}

func (p *PhaseRDGSLAOwner) IsFinalized() bool {
	return p.basePhase.isFinalized
}

func (*PhaseRDGSLAOwner) RequiresInput() bool {
	return true
}

func (p *PhaseRDGSLAOwner) Validate(context Context) error {
	return nil
}

func (p *PhaseRDGSLAOwner) ValidateAndUpdateTicket(origin *entity.RemediationTicket, patch rmapi.TransferTicketParam) error {
	if len(patch.RootCauseFromRDG) == 0 {
		return fmt.Errorf("root cause from rdg cannot be empty")
	}
	origin.RootCauseFromRDG = patch.RootCauseFromRDG

	if len(patch.AccidentReportLink) == 0 {
		return fmt.Errorf("accident report link cannot be empty")
	}
	if _, err := url.Parse(patch.AccidentReportLink); err != nil {
		return fmt.Errorf("parse accident report url %s failed: %w", patch.AccidentReportLink, err)
	}
	origin.AccidentReportLink = patch.AccidentReportLink

	return nil
}

func (p *PhaseRDGSLAOwner) Next(context Context) (Phase, error) {
	err := p.Validate(context)
	if err != nil {
		return nil, fmt.Errorf("validation failed in %s: %w", p.basePhase.phaseName, err)
	}

	nextPhaseName, err := ResolveNextPhase(entity.RemediationTicketPhaseRDGSLAOwner, &context.TicketInstance)
	if err != nil {
		return nil, fmt.Errorf("resolve next phase failed in %s: %w", p.basePhase.phaseName, err)
	}

	nextPhase, err := GetPhaseByName(nextPhaseName)
	if err != nil {
		return nil, fmt.Errorf("get next phase failed in %s: %w", p.basePhase.phaseName, err)
	}

	return nextPhase, nil
}
