package persona

// VideoSpec defines a single video generation spec for one of the 4 motion types.
type VideoSpec struct {
	// MotionType describes the scenario and movement style.
	MotionType MotionType `json:"motion_type" yaml:"motion_type"`

	// Prompt is the assembled Veo generation prompt.
	// Set by the videogen pipeline before calling the video provider.
	Prompt string `json:"prompt,omitempty" yaml:"prompt,omitempty"`

	// URL is the storage URL of the generated video.
	// Set after successful video generation and upload.
	URL string `json:"url,omitempty" yaml:"url,omitempty"`

	// Status is the current generation status.
	Status VideoStatus `json:"status" yaml:"status"`

	// Duration is the target video duration (e.g., "5s", "8s").
	Duration string `json:"duration" yaml:"duration"`

	// AspectRatio is the target aspect ratio ("9:16" vertical, "16:9" horizontal).
	AspectRatio string `json:"aspect_ratio" yaml:"aspect_ratio"`
}

// MotionType represents the scenario and movement type for a persona video.
type MotionType string

const (
	// MotionSmileReveal is a brief, warm smile moment — ideal for first impressions.
	MotionSmileReveal MotionType = "smile_reveal"

	// MotionPersonality is an expressive personality showcase moment.
	MotionPersonality MotionType = "personality_moment"

	// MotionLifestyle is a contextual lifestyle shot showing the persona in their world.
	MotionLifestyle MotionType = "lifestyle"

	// MotionInvitation is a direct-address invitation or call-to-action moment.
	MotionInvitation MotionType = "invitation"
)

// IsValid returns true if the motion type is recognized.
func (m MotionType) IsValid() bool {
	switch m {
	case MotionSmileReveal, MotionPersonality, MotionLifestyle, MotionInvitation:
		return true
	default:
		return false
	}
}

// VideoStatus represents the generation status of a video.
type VideoStatus string

const (
	VideoStatusPending  VideoStatus = "pending"
	VideoStatusQueued   VideoStatus = "queued"
	VideoStatusComplete VideoStatus = "complete"
	VideoStatusFailed   VideoStatus = "failed"
)

// DefaultVideoMatrix returns the 4 standard video specs with default durations and aspect ratios.
// Prompts are empty — populated by the videogen pipeline.
func DefaultVideoMatrix() []VideoSpec {
	return []VideoSpec{
		{
			MotionType:  MotionSmileReveal,
			Duration:    "5s",
			AspectRatio: "9:16",
			Status:      VideoStatusPending,
		},
		{
			MotionType:  MotionPersonality,
			Duration:    "8s",
			AspectRatio: "9:16",
			Status:      VideoStatusPending,
		},
		{
			MotionType:  MotionLifestyle,
			Duration:    "8s",
			AspectRatio: "16:9",
			Status:      VideoStatusPending,
		},
		{
			MotionType:  MotionInvitation,
			Duration:    "5s",
			AspectRatio: "9:16",
			Status:      VideoStatusPending,
		},
	}
}
