package service

import (
	"context"
	"time"

	"github.com/pingcap/agent-git-service/internal/service/internal/repositorymutation"
)

var (
	ErrRepositoryMigrationSealed      = repositorymutation.ErrRepositoryMutationSealed
	ErrRepositoryMigrationConflict    = repositorymutation.ErrRepositoryMigrationConflict
	ErrRepositoryMigrationProof       = repositorymutation.ErrRepositoryMigrationProof
	ErrRepositoryMigrationUnavailable = repositorymutation.ErrRepositoryMigrationUnavailable
)

type RepositoryMigrationReleaseFact struct {
	ReleaseID uint
	TagName   string
	CommitSHA string
}

type RepositoryMigrationFacts struct {
	RepositoryID       uint
	RepositoryFullName string
	DefaultBranch      string
	TargetBranch       string
	BranchHeadSHA      string
	Epoch              uint64
	Releases           []RepositoryMigrationReleaseFact
	ManifestSHA        string
}

// RepositoryMigrationProof remains as a compatibility type while repository
// migration sealing is disabled. No proof can be issued or validated.
type RepositoryMigrationProof struct{}

type RepositoryMigrationAbortCapability struct{}

type RepositoryMigrationSealingError struct {
	cause      error
	capability *RepositoryMigrationAbortCapability
}

func (failure *RepositoryMigrationSealingError) Error() string {
	if failure == nil || failure.cause == nil {
		return "repository migration sealing failed"
	}
	return failure.cause.Error()
}

func (failure *RepositoryMigrationSealingError) Unwrap() error {
	if failure == nil {
		return nil
	}
	return failure.cause
}

func (failure *RepositoryMigrationSealingError) AbortCapability() *RepositoryMigrationAbortCapability {
	if failure == nil {
		return nil
	}
	return failure.capability
}

func (*RepositoryMigrationProof) Facts() RepositoryMigrationFacts { return RepositoryMigrationFacts{} }
func (*RepositoryMigrationProof) ExpiresAt() time.Time            { return time.Time{} }

// SealRepositoryForMigration is disabled while AGS has no repository-level
// coordination primitive. Returning an explicit error prevents callers from
// treating an unfenced snapshot as a valid migration proof.
func (*Service) SealRepositoryForMigration(context.Context, uint, string) (*RepositoryMigrationProof, error) {
	return nil, ErrRepositoryMigrationUnavailable
}

func (*Service) RenewRepositoryMigrationProof(context.Context, *RepositoryMigrationProof) (*RepositoryMigrationProof, error) {
	return nil, ErrRepositoryMigrationUnavailable
}

func (*Service) ValidateRepositoryMigrationProof(context.Context, *RepositoryMigrationProof) error {
	return ErrRepositoryMigrationUnavailable
}

func (*Service) AbortRepositoryMigrationSealBeforeImport(context.Context, *RepositoryMigrationProof) error {
	return ErrRepositoryMigrationUnavailable
}

func (*Service) AbortFailedRepositorySeal(context.Context, *RepositoryMigrationAbortCapability) error {
	return ErrRepositoryMigrationUnavailable
}
