#!/usr/bin/env python

import glob
import os
import sys

from aman.com import AircraftReport_pb2
from aman.com.Euroscope import Euroscope
from aman.com.Weather import Weather
from aman.config.AircraftPerformance import AircraftPerformance
from aman.config.Airport import Airport
from aman.config.System import System
from aman.sys.Worker import Worker

class AMAN:
    def findConfigPath():
        envvar = os.environ.get('AMAN_CONFIG_PATH')
        if None == envvar:
            print('No AMAN_CONFIG_PATH in environment variables found. Using execution directory.')
            path = os.getcwd()
        else:
            print('AMAN_CONFIG_PATH found.')
            path = envvar

        print('Config-path: ' + path)
        return path

    def __init__(self):
        # default initialization of members
        self.systemConfig = None
        self.aircraftPerformance = None
        self.receiver = None
        self.weather = None
        self.workers = []
        self.inbounds = {}

    def __del__(self):
        self.release()

    def aquire(self):
        configPath = AMAN.findConfigPath()

        # read all system relevant configuration files
        self.systemConfig = System(os.path.join(configPath, 'System.ini'))
        print('Parsed System.ini')

        # read the aircraft performance data
        self.aircraftPerformance = AircraftPerformance(os.path.join(configPath, 'PerformanceData.ini'))
        if None == self.aircraftPerformance:
            sys.stderr.write('No aircraft performance data found!')
            sys.exit(-1)
        else:
            print('Parsed PerformanceData.ini. Extracted ' + str(len(self.aircraftPerformance.aircrafts)) + ' aircrafts')

        self.weather = Weather()
        self.weather.acquire(self.systemConfig.Weather)

        # find the airport configurations and create the workers
        airportsPath = os.path.join(os.path.join(configPath, 'airports'), '*.ini')
        for file in glob.glob(airportsPath):
            icao = os.path.splitext(os.path.basename(file))[0]

            print('Parsing planner configuration for ' + icao)
            airportConfig = Airport(file, icao)

            # initialize the worker thread
            worker = Worker()
            worker.acquire(icao, airportConfig)
            self.workers.append(worker)
            print('Started worker for ' + icao)

        # create the EuroScope receiver
        self.receiver = Euroscope()
        self.receiver.acquire(configPath, self.systemConfig.Server, self)

    def release(self):
        if None != self.receiver:
            self.receiver.release()
        self.receiver = None

        if None != self.weather:
            self.weather.release()
        self.weather = None

        if None != self.workers:
            for worker in self.workers:
                worker.release()
        self.workers = None

    def updateAircraftReport(self, report : AircraftReport_pb2.AircraftReport):
        # find the correct worker for the inbound
        for worker in self.workers:
            if worker.icao == report.destination:
                worker.acquireLock()
                worker.reportQueue[report.aircraft.callsign] = report
                worker.releaseLock()
                break