// Copyright 2019 Yunion
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package command

import (
	"fmt"
	"os/exec"
	"strings"

	"yunion.io/x/log"

	"yunion.io/x/onecloud/pkg/mcclient"
	o "yunion.io/x/onecloud/pkg/webconsole/options"
)

type IpmiInfo struct {
	IpAddr   string `json:"ip_addr"`
	Username string `json:"username"`
	Password string `json:"password"`
	Present  bool   `json:"present"`
}

type IpmitoolSol struct {
	*BaseCommand
	Info *IpmiInfo
	s    *mcclient.ClientSession
}

func NewIpmitoolSolCommand(info *IpmiInfo, s *mcclient.ClientSession) (*IpmitoolSol, error) {
	if info.IpAddr == "" {
		return nil, fmt.Errorf("Empty host ip address")
	}
	if info.Username == "" {
		return nil, fmt.Errorf("Empty username")
	}
	if info.Password == "" {
		return nil, fmt.Errorf("Empty password")
	}
	name := o.Options.IpmitoolPath
	solArgs := []string{
		"-I", "lanplus",
		"-H", info.IpAddr,
		"-U", info.Username,
		"-P", info.Password,
		"sol",
	}
	cmd := NewBaseCommand(s, name, solArgs...)
	cmd.AppendArgs("activate")
	tool := &IpmitoolSol{
		BaseCommand: cmd,
		Info:        info,
	}
	deactiveCmd := exec.Command(name, solArgs...)
	deactiveCmd.Args = append(deactiveCmd.Args, "deactivate")
	if err := deactiveCmd.Run(); err != nil {
		log.Errorf("ipmitool sol deactive %q error: %v", info.IpAddr, err)
	}
	return tool, nil
}

func (c *IpmitoolSol) GetCommand() *exec.Cmd {
	return c.BaseCommand.GetCommand()
}

func (c *IpmitoolSol) GetSafeCommandString() string {
	cmd := []string{c.BaseCommand.name}
	i := 0
	for i < len(c.BaseCommand.args) {
		cmd = append(cmd, c.BaseCommand.args[i])
		if c.BaseCommand.args[i] == "-P" {
			cmd = append(cmd, "******")
			i += 1
		}
		i += 1
	}
	return strings.Join(cmd, " ")
}

func (c IpmitoolSol) GetProtocol() string {
	return PROTOCOL_TTY
}