// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you 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 pkg

import (
	protos "airavata-agent/protos"
	"log"
	"os/exec"
)

func ExecutePython(stream Stream, executionId string, envName string, workingDir string, code string) {
	log.Printf("[agent.go] executePython() Execution id %s\n", executionId)
	log.Printf("[agent.go] executePython() Env name %s\n", envName)
	log.Printf("[agent.go] executePython() Working Dir %s\n", workingDir)
	log.Printf("[agent.go] executePython() Code %s\n", code)
	// Run command
	cmd := exec.Command("micromamba", "run", "-n", envName, "python", "-c", code)
	cmd.Dir = workingDir
	output, err := cmd.CombinedOutput()
	responseString := string(output)
	if err != nil {
		log.Printf("[agent.go] executePython() error: %v\n", err)
	} else {
		log.Printf("[agent.go] executePython() completed: %s\n", responseString)
	}
	msg := &protos.AgentMessage{
		Message: &protos.AgentMessage_PythonExecutionResponse{
			PythonExecutionResponse: &protos.PythonExecutionResponse{
				ExecutionId:    executionId,
				ResponseString: responseString,
			},
		},
	}
	if err := stream.Send(msg); err != nil {
		log.Printf("[agent.go] executePython() failed to send result to server: %v\n", err)
	} else {
		log.Printf("[agent.go] executePython() Sent result to server: %s\n", output)
	}
}
