package model

import (
	"encoding/json"
	"time"
)

type AuditEventType int32

// User clicked "Submit", "Accept" etc
const AuditEventTypeAction    AuditEventType = 0
type AuditEventDataAction struct {
	TargetStatus uint32 `json:"target_status"`
}

// User wrote a comment
const AuditEventTypeComment   AuditEventType = 1
type AuditEventDataComment struct {
	Comment string `json:"comment"`
}

// User changed Model
const AuditEventTypeChangeModel AuditEventType = 2
type AuditEventDataChangeModel struct {
	OldModelID      uint64 `json:"old_model_id"`
	OldModelVersion uint64 `json:"old_model_version"`
	NewModelID      uint64 `json:"new_model_id"`
	NewModelVersion uint64 `json:"new_model_version"`
}
// Validator validates model
const AuditEventTypeChangeValidatedModel AuditEventType = 3
type AuditEventDataChangeValidatedModel struct {
	ValidatedModelID      uint64 `json:"validated_model_id"`
	ValidatedModelVersion uint64 `json:"validated_model_version"`
}

// User changed DisplayName / Creator
const AuditEventTypeChangeDisplayName AuditEventType = 4
const AuditEventTypeChangeCreator AuditEventType = 5
type AuditEventDataChangeName struct {
	OldName string `json:"old_name"`
	NewName string `json:"new_name"`
}

// Validator had an error
const AuditEventTypeError   AuditEventType = 6
type AuditEventDataError struct {
	Error string `json:"error"`
}

type AuditEvent struct {
	ID           int64 `gorm:"primaryKey"`
	CreatedAt    time.Time
	User         uint64
	ResourceType ResourceType // is this a submission or is it a mapfix
	ResourceID   int64 // submission / mapfix / map ID
	EventType    AuditEventType
	EventData    json.RawMessage `gorm:"type:jsonb"`
}