// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Package state_machine - Pre check for CrOSInstall State Machine. Responsible for checking image status and possibly skipping provision.
package state_machine

import (
	common_utils "go.chromium.org/chromiumos/test/provision/v2/common-utils"
	"go.chromium.org/chromiumos/test/provision/v2/cros-provision/service"
	"go.chromium.org/chromiumos/test/provision/v2/cros-provision/state-machine/commands"
	"context"
	"fmt"
	"log"

	"go.chromium.org/chromiumos/config/go/test/api"
	"google.golang.org/protobuf/types/known/anypb"
)

// CrOSResetDeviceState can be thought of as the constructor state, which initializes
// variables in CrOSService
type CrOSResetDeviceState struct {
	service    *service.CrOSService
	shouldSkip bool
}

// NewCrOSResetDeviceState provides an interface to CrOSResetDeviceState.
func NewCrOSResetDeviceState(service *service.CrOSService) common_utils.ServiceState {
	return CrOSResetDeviceState{
		service: service,
	}
}

// Execute executes the steps needed to support CrOSResetDeviceState.
func (s CrOSResetDeviceState) Execute(ctx context.Context, log *log.Logger) (*anypb.Any, api.InstallResponse_Status, error) {
	log.Printf("State: Execute CrOSResetDeviceState")
	comms := []common_utils.CommandInterface{
		commands.NewStopSystemDaemonsCommand(ctx, s.service),
		commands.NewProvisionStatefulCommand(ctx, s.service),
		commands.NewClearTPMCommand(ctx, s.service),
		commands.NewRebootCommand(ctx, s.service),
		commands.NewEnableChargeLimitCommand(ctx, s.service),
	}

	for _, comm := range comms {
		err := comm.Execute(log)
		if err != nil {
			return nil, comm.GetStatus(), fmt.Errorf("%s, %s", comm.GetErrorMessage(), err)
		}
	}

	log.Printf("State: CrOSResetDeviceState Completed")
	return nil, api.InstallResponse_STATUS_SUCCESS, nil
}

// Nothing to do for Next.
func (s CrOSResetDeviceState) Next() common_utils.ServiceState {
	return nil
}

// Name of the step.
func (s CrOSResetDeviceState) Name() string {
	return "CrOS Init"
}
