import os
import sys
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
from dotenv import load_dotenv

# Add project root to path
sys.path.append(os.getcwd())

from health.utils.logging_config import setup_logger
from health.utils.env_loader import load_env_with_extras
from slack_bot.obsidian.dispatcher import ObsidianDispatcher

logger = setup_logger(__name__)

# Load environment variables
load_env_with_extras()

def main():
    """Obsidian Slack Bot Entry Point."""
    
    vault_path = os.environ.get("OBSIDIAN_VAULT_PATH")
    if not vault_path:
        logger.error("OBSIDIAN_VAULT_PATH not set in .env")
        sys.exit(1)
        
    vault_path = os.path.expanduser(vault_path)

    bot_token = os.environ.get("OBSIDIAN_SLACK_BOT_TOKEN")
    app_token = os.environ.get("OBSIDIAN_SLACK_APP_TOKEN")

    if not bot_token or not app_token:
        logger.error("Missing OBSIDIAN_SLACK_BOT_TOKEN or OBSIDIAN_SLACK_APP_TOKEN in .env")
        sys.exit(1)

    app = App(token=bot_token)
    dispatcher = ObsidianDispatcher(vault_path)

    @app.event("message")
    def handle_message(message, say):
        try:
            # We don't strictly need deduplication for this bot if we use SocketMode correctly,
            # but it's safer.
            text = message.get("text", "")
            channel = message["channel"]
            user = message["user"]
            
            # Skip bot messages
            if message.get("bot_id"):
                return

            logger.info(f"Obsidian Bot received from {user}: {text[:50]}...")

            # Ack
            ack_response = say("⏳ Thinking...")
            ack_ts = ack_response["ts"]

            dispatcher.dispatch(text, channel, user, response_ts=ack_ts)
            
        except Exception as e:
            logger.error(f"Error in Obsidian bot: {e}", exc_info=True)
            say(f"🐛 Error: {e}")

    # Start Socket Mode
    try:
        handler = SocketModeHandler(app, app_token)
        logger.info("⚡️ Obsidian Bot is connected to Slack!")
        handler.start()
    except Exception as e:
        logger.error(f"Failed to start Obsidian bot: {e}")
        sys.exit(1)

if __name__ == "__main__":
    main()
