# Импортируем нужные классы из библиотек
from fastapi import FastAPI
from fastapi.responses import HTMLResponse, JSONResponse
import subprocess
import psutil
# Создаём объект приложения
app = FastAPI()
# Обработчик GET-запросов по адресу / (корневой каталог)
@app.get('/', response_class=HTMLResponse)
async def index():
    return '
MT5 Manager
'
# Обработчик POST /start - запуск терминала
@app.post('/start')
async def start_instance():
    result = start_mt5()
    return JSONResponse(result)
# Обработчик POST /stop - остановка терминала
@app.post('/stop', response_class=JSONResponse)
async def stop_instance():
    result = stop_mt5()
    return JSONResponse(result)
# Путь к запускаемому файлу терминала
MT5_PATH = 'C:/Program Files/MetaTrader 5/terminal64.exe'
# Словарь для хранения информации о запущенном терминале
instances = {}
# Запуск терминала
def start_mt5():
    # Запускаем новый процесс
    process = subprocess.Popen([MT5_PATH])
    # Идентификатор запущенного процесса
    pid = process.pid
    # Запоминаем идентификатор и статус процесса
    instances['default'] = {'pid': pid, 'status': 'running'}
    
    # Возвращаем результат - успешный запуск
    return {'instance': 'default', 'pid': pid}
# Остановка терминала
def stop_mt5():
    # Если ранее терминал был запущен 
    if 'default' in instances:
        # Берём идентификатор его процесса
        pid = instances['default']['pid']
        try:
            # Получаем объект процесса терминала
            p = psutil.Process(pid)
            # Останавливаем процесс
            p.terminate()
            # Удаляем информацию о запущенном ранее процессе
            del instances['default']
            # Возвращаем результат - успешная остановка
            return {'status': 'stopped', 'instance': 'default'}
        except psutil.NoSuchProcess:
            # Если процесс не найден, то
            # удаляем информацию о запущенном ранее процессе
            del instances['default']
    
    # Возвращаем результат - процесс не найден
    return {'status': 'not found', 'instance': 'default'}