import configparser
import logging
import servicemanager
import socketserver
import os
from http.server import HTTPServer, BaseHTTPRequestHandler
import subprocess
#import win32api -on last version python not required
import datetime
import json
#import win32print -on last version python not required
from os.path import exists
import time

class MyRequestHandler(BaseHTTPRequestHandler):

  def do_OPTIONS(self):
      self.send_response(200, 'OK')
      self.send_header('Access-Control-Allow-Origin', '*')
      self.send_header('Access-Control-Allow-Headers', '*')
      self.end_headers()
      logging.info('call OPTIONS' + '\n')

  def do_GET(self):
      self.send_response(200)
      self.send_header('Access-Control-Allow-Origin', '*')
      self.send_header('Access-Control-Allow-Headers', '*')
      self.end_headers()
      self.wfile.write(b'Printer bridnge running\nOK')
      logging.info('call GET' + '\n')

  def do_POST(self):
      content_length = int(self.headers['Content-Length'])
      pdf = self.rfile.read(content_length)
      self.send_response(200)
      self.send_header('Access-Control-Allow-Origin', '*')
      self.end_headers()
      self.wfile.write(b'OK')
      filename = path + datetime.datetime.now().strftime("%y%m%d_%H%M%S") + ".pdf"
      filepdf = open(filename, "wb")
      filepdf.write(pdf)
      filepdf.close()

      if  not exists(filename) :
        logging.info('error, saved pdf not exist: ' + filename + '\n')

      logging.info('get filename: ' + filename + '\n')
      printer = config.get('CONFIG', 'Printer')
      if printer:
          subprocess.run([driver, '/print:printer=' + printer, filename])
          logging.info('print: ' + ' ' + driver + ' /print:printer=' + printer + ' ' + filename + '\n')
      else:
          subprocess.run([driver, '/print', filename])
          logging.info('print: ' + ' ' + driver + ' /print" ' + filename + '\n')

      time.sleep(2)

      if exists(filename):
         os.remove(filename)

  def log_message(self, format, *args):
      logging.info(format, *args)
      pass

class MyHTTPserver(HTTPServer):

  def log_message(self, format, *args):
      logging.info(format, *args)
      pass

class AppHTTPServer (socketserver.ThreadingMixIn, MyHTTPserver):
  def serve_forever(self):
      self.stop_serving = False
      while not self.stop_serving:
          self.handle_request()

  def stop (self):
      self.stop_serving = True

config = configparser.ConfigParser()
config.read('PrinterBirdge.ini')
printer = config.get('CONFIG', 'Printer')
driver = config.get('CONFIG', 'Driver')
path = config.get('CONFIG', 'PathToTemp')

if not exists(driver) :
  print('Nenalezen program pro tisk pdf na tiskárnu ' + driver)
  exit(1)

logging.basicConfig(filename=path + 'logging.log', level=logging.INFO, format='%(asctime)s %(message)s')
httpd =  AppHTTPServer(('localhost', 9100), MyRequestHandler)
logging.info('Starting httpd...\n')
try:
    httpd.serve_forever()
except KeyboardInterrupt:
    httpd.stop()
    pass
httpd.server_close()
logging.info('Stopping httpd...\n')