#!/bin/bash

# Set power state (1=ON, 0=OFF) for specified port or all ports

# Source hardware configuration
source "/usr/share/rpi-power-hat/scripts/hardware-reader.sh"

print_usage() {
	echo "Usage: rpi-power-hat set <port|all> <state>"
	echo
	echo "Ports: B1, B2, T1, T2, all"
	echo "State: 1 (ON), 0 (OFF)"
	echo
	echo "Examples:"
	echo "  rpi-power-hat set B1 1      # Turn ON port B1"
	echo "  rpi-power-hat set T2 0      # Turn OFF port T2"
	echo "  rpi-power-hat set all 1     # Turn ON all ports (ALL|A also accepted)"
}

# Set power state
set_power_state() {
	local port="$1"
	local state="$2"  # 1=on, 0=off
	local gpio_line_name
	gpio_line_name="$(get_gpio_line_name "$port")"
	
	if [[ -z "$gpio_line_name" ]]; then
		echo "Error: Unable to get GPIO line name for port $port" >&2
		return 1
	fi
	
	gpioset -t0 "$gpio_line_name=$state" 2>/dev/null
	if [[ $? -ne 0 ]]; then
		echo "Error: Failed to set GPIO line $gpio_line_name" >&2
		return 1
	fi
	
	return 0
}

# Turn power on
power_on() {
	local port="$1"
	echo "Turning ON port $port..."
	
	if set_power_state "$port" 1; then
		echo "Port $port is ON"
	else
		echo "Failed to turn ON port $port"
		return 1
	fi
}

# Turn power off
power_off() {
	local port="$1"
	echo "Turning OFF port $port..."
	
	if set_power_state "$port" 0; then
		echo "Port $port is OFF"
	else
		echo "Failed to turn OFF port $port"
		return 1
	fi
}

# Set power for all ports
set_all_power() {
	local state="$1"
	local action=""
	
	if [[ "$state" = "1" ]]; then
		action="ON"
	else
		action="OFF"
	fi
	
	echo "Turning $action all ports..."
	
	local success=true
	for port in B1 B2 T1 T2; do
		if [[ "$state" = "1" ]]; then
			if ! power_on "$port"; then
				success=false
			fi
		else
			if ! power_off "$port"; then
				success=false
			fi
		fi
	done
	
	if [[ "$success" = "true" ]]; then
		echo "All ports turned $action successfully"
	else
		echo "Some ports failed to turn $action"
		return 1
	fi
}

# Check dependencies
check_dependencies() {
	if ! command -v gpioset &> /dev/null; then
		echo "Error: gpioset not found. Please install: sudo apt install gpiod" >&2
		return 1
	fi
	return 0
}

# Main function
main() {
	local port="$1"
	local state="$2"
	
	if ! check_dependencies; then
		exit 1
	fi
	
	if [[ -z "$port" ]] || [[ "$port" = "-h" ]] || [[ "$port" = "--help" ]] || [[ "$port" = "-help" ]] || [[ -z "$state" ]]; then
		if [[ "$port" = "-h" ]] || [[ "$port" = "--help" ]] || [[ "$port" = "-help" ]]; then
			print_usage
			exit 0
		else
			echo "Error: Both port and state are required" >&2
			print_usage
			exit 1
		fi
	fi
	
	# Validate state
	if [[ "$state" != "1" && "$state" != "0" ]]; then
		echo "Error: State must be 1 (ON) or 0 (OFF)" >&2
		print_usage
		exit 1
	fi
	
	# Handle 'all' variations
	case "$port" in
		"all"|"ALL"|"A")
			set_all_power "$state"
			;;
		*)
			if ! validate_port "$port"; then
				echo "Error: Invalid port '$port'. Valid ports are: $(list_ports)" >&2
				exit 1
			fi
			
			if [[ "$state" = "1" ]]; then
				power_on "$port"
			else
				power_off "$port"
			fi
			;;
	esac
}

main "$@"
