// Copyright (C) 2023 Opsmate, Inc.
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License, v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
//
// This software is distributed WITHOUT A WARRANTY OF ANY KIND.
// See the Mozilla Public License for details.

package monitor

import (
	"encoding/json"
	"fmt"
	"os"
	"software.sslmate.com/src/certspotter/ct"
	"software.sslmate.com/src/certspotter/merkletree"
	"time"
)

type stateFile struct {
	DownloadPosition *merkletree.CollapsedTree `json:"download_position"`
	VerifiedPosition *merkletree.CollapsedTree `json:"verified_position"`
	VerifiedSTH      *ct.SignedTreeHead        `json:"verified_sth"`
	LastSuccess      time.Time                 `json:"last_success"`
}

func loadStateFile(filePath string) (*stateFile, error) {
	fileBytes, err := os.ReadFile(filePath)
	if err != nil {
		return nil, err
	}
	file := new(stateFile)
	if err := json.Unmarshal(fileBytes, file); err != nil {
		return nil, fmt.Errorf("error parsing %s: %w", filePath, err)
	}
	return file, nil
}

func (file *stateFile) store(filePath string) error {
	fileBytes, err := json.Marshal(file)
	if err != nil {
		return err
	}
	fileBytes = append(fileBytes, '\n')
	return writeFile(filePath, fileBytes, 0666)
}