#!/root/projects/butler/venv/bin/python
import os

import shutil
import tempfile
import unittest
from unittest.mock import MagicMock, patch
import sys

# Add workspace root to sys.path
root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, root_dir)

from slack_bot.obsidian.indexer import ObsidianIndexer

from slack_bot.obsidian.generators import WritingAssistant, ReplyGenerator, DecisionSupport

class TestObsidianModule(unittest.TestCase):
    def setUp(self):
        # Create a temp vault
        self.test_dir = tempfile.mkdtemp()
        
        # Create some notes
        self.create_note("normal_note.md", "Just a normal note about Cloud Native.")
        self.create_note("writing_sample.md", "This is a great article. #writing_sample\nIt has style.")
        self.create_note("reply_sample.md", "Dear Customer, sorry via email. #reply_sample")
        self.create_note("mixed_note.md", "Contains keyword Cloud Native and #writing_sample.")

    def tearDown(self):
        shutil.rmtree(self.test_dir)

    def create_note(self, filename, content):
        with open(os.path.join(self.test_dir, filename), "w", encoding="utf-8") as f:
            f.write(content)

    def test_indexer_scan(self):
        indexer = ObsidianIndexer(self.test_dir)
        indexer.scan_vault()
        
        self.assertEqual(indexer.files_scanned, 4)
        self.assertEqual(len(indexer.writing_samples), 2)  # writing_sample.md, mixed_note.md
        self.assertEqual(len(indexer.reply_samples), 1)    # reply_sample.md
        
    def test_indexer_search(self):
        indexer = ObsidianIndexer(self.test_dir)
        indexer.scan_vault()
        
        results = indexer.search("Cloud Native")
        self.assertEqual(len(results), 2)
        self.assertTrue(any("normal_note.md" in r for r in results))

    @patch("slack_bot.obsidian.generators.GeminiLLM")
    def test_writing_assistant_context(self, MockLLM):
        # Mock LLM response
        mock_instance = MockLLM.return_value
        mock_instance.generate_response.return_value = ("Generated Content", None)
        
        indexer = ObsidianIndexer(self.test_dir)
        indexer.scan_vault()
        
        assistant = WritingAssistant(indexer)
        # Mock reading methodology/style files since they are in workspace root
        with patch.object(assistant, "_read_file", return_value="Mock Content"):
            assistant.generate("Cloud Native")
            
        # Verify call args
        call_args = mock_instance.generate_response.call_args[0][0]
        self.assertIn("=== YOUR WRITING SAMPLES", call_args)
        self.assertIn("#writing_sample", call_args)  # Should contain content from sample note

if __name__ == "__main__":
    unittest.main()
