#!/usr/bin/env python3
"""
JARVIS System Daemon
Main entry point for JARVIS when running as a system service.
Supports dual input: voice + socket (jarvis send).
"""

import asyncio
import logging
import os
import signal
import sys
from pathlib import Path

# Add JARVIS to Python path
sys.path.insert(0, '/usr/lib/jarvis')

from jarvis.config import Config
from jarvis.main import Jarvis


class JarvisDaemon:
    def __init__(self):
        self.jarvis = None
        self.running = False
        self.setup_logging()
        
    def setup_logging(self):
        """Setup system logging"""
        log_dir = Path(os.environ.get('JARVIS_LOG_DIR', '/var/log/jarvis'))
        log_dir.mkdir(parents=True, exist_ok=True)
        
        logging.basicConfig(
            level=logging.INFO,
            format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
            handlers=[
                logging.FileHandler(log_dir / 'jarvis.log'),
                logging.StreamHandler()
            ]
        )
        self.logger = logging.getLogger('jarvis-daemon')
        
    def signal_handler(self, signum, frame):
        """Handle system signals"""
        self.logger.info(f"Received signal {signum}, shutting down gracefully...")
        self.running = False
        if self.jarvis:
            self.jarvis.stop()
            
    def setup_environment(self):
        """Setup environment for system service"""
        data_dir = Path(os.environ.get('JARVIS_DATA_DIR', '/var/lib/jarvis'))
        models_dir = Path(os.environ.get('JARVIS_MODELS_DIR', str(data_dir / 'models')))
        log_dir = Path(os.environ.get('JARVIS_LOG_DIR', '/var/log/jarvis'))
        for d in (data_dir, models_dir, log_dir):
            d.mkdir(parents=True, exist_ok=True)
        # Do not override model paths — user selects via config/app
            
    def run(self):
        """Main daemon loop"""
        self.logger.info("Starting JARVIS daemon...")

        # Setup signal handlers
        signal.signal(signal.SIGTERM, self.signal_handler)
        signal.signal(signal.SIGINT, self.signal_handler)
        signal.signal(signal.SIGHUP, self.signal_handler)

        try:
            # Setup environment
            self.setup_environment()

            # Initialize JARVIS
            self.logger.info("Initializing JARVIS...")
            self.jarvis = Jarvis()

            self.running = True
            self.logger.info("JARVIS daemon started successfully (dual input: voice + socket)")

            asyncio.run(self.jarvis.run())

        except Exception as e:
            self.logger.error(f"Fatal error starting JARVIS: {e}", exc_info=True)
            return 1
        finally:
            self.logger.info("JARVIS daemon stopped")

        return 0

if __name__ == '__main__':
    daemon = JarvisDaemon()
    sys.exit(daemon.run())
