Files
fm_be/internal/domain/mission/status.go
2026-07-16 22:16:45 +07:00

116 lines
2.4 KiB
Go

package mission
import (
"sort"
"strings"
sharedconst "wucher/internal/shared/const"
)
const (
StatusDraft = "draft"
StatusInProgress = "in_progress"
StatusCompleted = "completed"
)
const (
FormKeyFlightData = "flight_data"
FormKeyPatientData = "patient_data"
)
var missionTypeForms = map[string][]string{
sharedconst.MissionTypeHEMS: []string{FormKeyFlightData, FormKeyPatientData},
sharedconst.MissionTypeCAT: []string{FormKeyFlightData},
sharedconst.MissionTypeSPO: []string{FormKeyFlightData},
sharedconst.MissionTypeNCO: []string{FormKeyFlightData},
}
type FormFacts map[string]string
type FormStatus struct {
Key string
Status string
}
func BuildForms(missionType string, facts FormFacts) []FormStatus {
keys := missionFormsForType(missionType)
if len(keys) == 0 {
keys = sortedFactKeys(facts)
}
out := make([]FormStatus, 0, len(keys))
if len(keys) == 0 {
return out
}
for _, key := range keys {
out = append(out, formStatus(key, facts[key]))
}
return out
}
func missionFormsForType(missionType string) []string {
missionType = strings.ToUpper(strings.TrimSpace(missionType))
if forms, ok := missionTypeForms[missionType]; ok && len(forms) > 0 {
out := make([]string, len(forms))
copy(out, forms)
return out
}
return nil
}
func sortedFactKeys(facts FormFacts) []string {
keys := make([]string, 0, len(facts))
for key := range facts {
keys = append(keys, key)
}
sort.Strings(keys)
return keys
}
// ComputeStatus derives the mission state from its forms so new forms can be
// added later without reworking mission-level branching.
func ComputeStatus(forms []FormStatus) string {
if len(forms) == 0 {
return StatusDraft
}
completed := 0
inProgress := 0
for i := range forms {
switch forms[i].Status {
case StatusCompleted:
completed++
case StatusInProgress:
inProgress++
}
}
switch {
case completed == 0:
if inProgress > 0 {
return StatusInProgress
}
return StatusDraft
case completed == len(forms):
return StatusCompleted
default:
return StatusInProgress
}
}
func formStatus(key, status string) FormStatus {
return FormStatus{Key: key, Status: normalizeFormStatus(status)}
}
func normalizeFormStatus(status string) string {
switch strings.ToLower(strings.TrimSpace(status)) {
case StatusCompleted:
return StatusCompleted
case StatusInProgress:
return StatusInProgress
default:
return StatusDraft
}
}