// This package hosts the serialization and deserialization logic for all of the
// data types with which our application interacts from the YNAB API.
package ynabSerde

import (
	"encoding/json"
	"time"
)

type Transaction struct {
	Id           string    `json:"id"`
	Date         time.Time `json:"date"`
	Amount       int       `json:"amount"`
	Memo         string    `json:"memo"`
	Cleared      string    `json:"cleared"`
	Approved     bool      `json:"approved"`
	FlagColor    string    `json:"flag_color"`
	AccountId    string    `json:"account_id"`
	AccountName  string    `json:"account_name"`
	PayeeId      string    `json:"payeed_id"`
	PayeeName    string    `json:"payee_name"`
	CategoryId   string    `json:"category_id"`
	CategoryName string    `json:"category_name"`
	Deleted      bool      `json:"deleted"`
	// TransferAccountId interface{} `json:"transfer_account_id"`
	// TransferTransactionId interface{} `json:"transfer_transaction_id"`
	// MatchedTransactionId interface{} `json:"matched_transaction_id"`
	// ImportId interface{} `json:"import_id"`
	// Subtransactions interface{} `json:"subtransactions"`
}

// Attempts to encode a YNAB transaction into a string.
func serializeTx(tx *Transaction) (string, error) {
	x, err := json.Marshal(tx)
	return string(x), err
}

// Attempts to parse a string encoding a transaction presumably sent from a
// YNAB server.
func deserializeTx(x string) (*Transaction, error) {
	target := &Transaction{}
	err := json.Unmarshal([]byte(x), target)
	return target, err
}
