// 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 commands

import (
	"go.chromium.org/chromiumos/test/provision/v2/cros-provision/service"
	"context"
	"fmt"
	"log"

	"go.chromium.org/chromiumos/config/go/test/api"
)

type EnableChargeLimitCommand struct {
	ctx context.Context
	cs  *service.CrOSService
}

func NewEnableChargeLimitCommand(ctx context.Context, cs *service.CrOSService) *EnableChargeLimitCommand {
	return &EnableChargeLimitCommand{
		ctx: ctx,
		cs:  cs,
	}
}

func (c *EnableChargeLimitCommand) Execute(log *log.Logger) error {
	log.Printf("Start EnableChargeLimitCommand Execute")

	// If this is run on a DUT without a battery (or even just a backup battery
	// for Chromebases), this will effectively do nothing.
	if _, err := c.cs.Connection.RunCmd(c.ctx, "echo", []string{"\"1\"", ">", "/var/lib/power_manager/charge_limit_enabled"}); err != nil {
		return fmt.Errorf("failed to create charge_limit_enabled pref, %s", err)
	}

	if _, err := c.cs.Connection.RunCmd(c.ctx, "echo", []string{"\"3\"", ">", "/var/lib/power_manager/adaptive_charging_hold_delta_percent"}); err != nil {
		return fmt.Errorf("failed to create adaptive_charging_hold_delta_percent pref, %s", err)
	}

	if _, err := c.cs.Connection.RunCmd(c.ctx, "stop", []string{"powerd"}); err != nil {
		log.Printf("failed to stop powerd, %s", err)
	}

	if _, err := c.cs.Connection.RunCmd(c.ctx, "start", []string{"powerd"}); err != nil {
		return fmt.Errorf("failed to start powerd, %s", err)
	}

	log.Printf("EnableChargeLimitCommand Success")

	return nil
}

func (c *EnableChargeLimitCommand) Revert() error {
	log.Printf("Start EnableChargeLimitCommand Revert")

	if _, err := c.cs.Connection.RunCmd(c.ctx, "rm", []string{"/var/lib/power_manager/charge_limit_enabled"}); err != nil {
		return fmt.Errorf("failed to remove charge_limit_enabled pref, %s", err)
	}

	if _, err := c.cs.Connection.RunCmd(c.ctx, "rm", []string{"/var/lib/power_manager/adaptive_charging_hold_delta_percent"}); err != nil {
		return fmt.Errorf("failed to remove adaptive_charging_hold_delta_percent pref, %s", err)
	}

	if _, err := c.cs.Connection.RunCmd(c.ctx, "stop", []string{"powerd"}); err != nil {
		log.Printf("failed to stop powerd, %s", err)
	}

	if _, err := c.cs.Connection.RunCmd(c.ctx, "start", []string{"powerd"}); err != nil {
		return fmt.Errorf("failed to start powerd, %s", err)
	}

	log.Printf("EnableChargeLimitCommand Revert Success")

	return nil
}

func (c *EnableChargeLimitCommand) GetErrorMessage() string {
	return "failed to get enable Charge Limit"
}

func (c *EnableChargeLimitCommand) GetStatus() api.InstallResponse_Status {
	return api.InstallResponse_STATUS_PROVISIONING_FAILED
}
