#!/usr/bin/env python2
# -*- coding: utf-8 -*-

""" pySim: card handler utilities
"""

#
# (C) 2019 by Sysmocom s.f.m.c. GmbH
# All Rights Reserved
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#


import subprocess
import sys
import yaml

# Manual card handler: User is prompted to insert/remove card from the reader.
class card_handler:

	sl = None

	def __init__(self, sl):
		self.sl = sl

	def get(self, first = False):
		print("Ready for Programming: Insert card now (or CTRL-C to cancel)")
		self.sl.wait_for_card(newcardonly=not first)

	def error(self):
		print("Programming failed: Remove card from reader")
		print("")

	def done(self):
		print("Programming successful: Remove card from reader")
		print("")

# Automatic card handler: A machine is used to handle the cards.
class card_handler_auto:

	sl = None
	cmds = None
	verbose = True

	def __init__(self, sl, config_file):
		print("Card handler Config-file: " + str(config_file))
		self.sl = sl
		with open(config_file) as cfg:
			self.cmds = yaml.load(cfg, Loader=yaml.FullLoader)

		self.verbose = (self.cmds.get('verbose') == True)

	def __print_outout(self,out):
		print("")
		print("Card handler output:")
		print("---------------------8<---------------------")
		stdout = out[0].strip()
		if len(stdout) > 0:
			print("stdout:")
			print(stdout)
		stderr = out[1].strip()
		if len(stderr) > 0:
			print("stderr:")
			print(stderr)
		print("---------------------8<---------------------")
		print("")

	def __exec_cmd(self, command):
		print("Card handler Commandline: " + str(command))

		proc = subprocess.Popen([command], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
		out = proc.communicate()
		rc = proc.returncode

		if rc != 0 or self.verbose:
			self.__print_outout(out)

		if rc != 0:
			print("")
			print("Error: Card handler failure! (rc=" + str(rc) + ")")
			sys.exit(rc)

	def get(self, first = False):
		print("Ready for Programming: Transporting card into the reader-bay...")
		self.__exec_cmd(self.cmds['get'])
		self.sl.connect()

	def error(self):
		print("Programming failed: Transporting card to the error-bin...")
		self.__exec_cmd(self.cmds['error'])
		print("")

	def done(self):
		print("Programming successful: Transporting card into the collector bin...")
		self.__exec_cmd(self.cmds['done'])
		print("")
