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

import (
	"encoding/json"
	"time"
)

type TxMetadata struct {
	FasterPayment string `json:"faster_payment"`
	FpsPaymentId  string `json:"fps_payment_id"`
	Insertion     string `json:"insertion"`
	Notes         string `json:"notes"`
	Trn           string `json:"trn"`
}

type TxCounterparty struct {
	AccountNumber string `json:"account_number"`
	Name          string `json:"name"`
	SortCode      string `json:"sort_code"`
	UserId        string `json:"user_id"`
}

type Transaction struct {
	Id                         string    `json:"id"`
	Created                    time.Time `json:"created"`
	Description                string    `json:"description"`
	Amount                     int       `json:"amount"`
	Currency                   string    `json:"currency"`
	Notes                      string    `json:"notes"`
	Metadata                   TxMetadata
	AccountBalance             int            `json:"account_balance"`
	International              interface{}    `json:"international"`
	Category                   string         `json:"category"`
	IsLoad                     bool           `json:"is_load"`
	Settled                    time.Time      `json:"settled"`
	LocalAmount                int            `json:"local_amount"`
	LocalCurrency              string         `json:"local_currency"`
	Updated                    time.Time      `json:"updated"`
	AccountId                  string         `json:"account_id"`
	UserId                     string         `json:"user_id"`
	Counterparty               TxCounterparty `json:"counterparty"`
	Scheme                     string         `json:"scheme"`
	DedupeId                   string         `json:"dedupe_id"`
	Originator                 bool           `json:"originator"`
	IncludeInSpending          bool           `json:"include_in_spending"`
	CanBeExcludedFromBreakdown bool           `json:"can_be_excluded_from_breakdown"`
	CanBeMadeSubscription      bool           `json:"can_be_made_subscription"`
	CanSplitTheBill            bool           `json:"can_split_the_bill"`
	CanAddToTab                bool           `json:"can_add_to_tab"`
	AmountIsPending            bool           `json:"amount_is_pending"`
	// Fees interface{} `json:"fees"`
	// Merchant interface `json:"merchant"`
	// Labels interface{} `json:"labels"`
	// Attachments interface{} `json:"attachments"`
	// Categories interface{} `json:"categories"`
}

// Attempts to encode a Monzo transaction struct 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
// Monzo server.
func deserializeTx(x string) (*Transaction, error) {
	target := &Transaction{}
	err := json.Unmarshal([]byte(x), target)
	return target, err
}
