package cron

import "encoding/json/v2"

// Job defines a single registered cron job.
type Job struct {
	fn       func()
	schedule *Schedule
	id       string
}

// Id returns the cron job id.
func (j *Job) Id() string {
	return j.id
}

// Expression returns the plain cron job schedule expression.
func (j *Job) Expression() string {
	return j.schedule.rawExpr
}

// Run runs the cron job function.
func (j *Job) Run() {
	if j.fn != nil {
		j.fn()
	}
}

// MarshalJSON implements [json.Marshaler] and export the current
// jobs data into valid JSON.
func (j Job) MarshalJSON() ([]byte, error) {
	plain := struct {
		Id         string `json:"id"`
		Expression string `json:"expression"`
	}{
		Id:         j.Id(),
		Expression: j.Expression(),
	}

	return json.Marshal(plain)
}
