package linter

import (
	"olexsmir.xyz/clerk/internal/analyzer"
	"olexsmir.xyz/clerk/journal/ast"
)

const OrderDateID RuleID = "orderdate"

// OrderDate checks that transactions are in chronological order by date.
type OrderDate struct{}

func (OrderDate) ID() RuleID { return OrderDateID }
func (o *OrderDate) CheckJournal(an *analyzer.Analysis) []Find {
	var finds []Find
	var anchor *ast.Date
	var anchorStr string
	for _, pf := range an.Files {
		for _, entry := range pf.Ast.Entries {
			txn, ok := entry.(*ast.Transaction)
			if !ok {
				continue
			}
			if anchor != nil && txn.Date.Compare(*anchor) < 0 {
				finds = append(finds, Find{
					Code:    o.ID(),
					Message: "transaction is out of chronological order (date " + txn.Date.String() + " before " + anchorStr + ")",
					Span:    txn.Date.Span,
				})
				continue
			}
			anchor = &txn.Date
			anchorStr = anchor.String()
		}
	}
	return finds
}
