"""Tests for extension directory parsing and search functionality."""

import pytest
from conftest import MockSession

# Import the class under test
from qwen_pipeline_server import PipelineSession


class TestParseLegacyExtensions:
    """Tests for PipelineSession._parse_legacy_extensions()."""

    def test_parse_full_directory(self, sample_legacy_agent_data):
        extensions, cleaned = PipelineSession._parse_legacy_extensions(
            sample_legacy_agent_data)
        assert len(extensions) == 31

    def test_statuses_merged(self, sample_legacy_agent_data):
        extensions, _ = PipelineSession._parse_legacy_extensions(
            sample_legacy_agent_data)
        by_name = {e['name']: e for e in extensions}
        assert by_name['Benny Toh']['status'] == 'ONLINE'
        assert by_name['Benny Toh']['hours'] == '09:00-22:00'
        assert by_name['Jeremy Ng']['status'] == 'OFFLINE'
        assert by_name['Zack Jong']['status'] == 'ONLINE'
        assert by_name['Timmy Ting']['status'] == 'ONLINE'
        assert by_name['Timmy Ting']['hours'] == '07:00-17:00'

    def test_extensions_parsed(self, sample_legacy_agent_data):
        extensions, _ = PipelineSession._parse_legacy_extensions(
            sample_legacy_agent_data)
        by_name = {e['name']: e for e in extensions}
        assert by_name['Benny Toh']['ext'] == '8000'
        assert by_name['Zack Jong']['ext'] == '8703'
        assert by_name['Jeremy Ng']['ext'] == '8702'
        assert by_name['Timmy Ting']['ext'] == '8500'

    def test_entries_without_extension(self, sample_legacy_agent_data):
        extensions, _ = PipelineSession._parse_legacy_extensions(
            sample_legacy_agent_data)
        by_name = {e['name']: e for e in extensions}
        assert 'ext' not in by_name['Askey Puah']
        assert 'status' not in by_name['Askey Puah']
        assert 'ext' not in by_name['Shoban']

    def test_departments_parsed(self, sample_legacy_agent_data):
        extensions, _ = PipelineSession._parse_legacy_extensions(
            sample_legacy_agent_data)
        by_name = {e['name']: e for e in extensions}
        assert by_name['Benny Toh']['department'] == 'Management'
        assert by_name['Zack Jong']['department'] == 'Artificial Intelligent (AI)'
        assert by_name['May']['department'] == 'Accounts & Finance'

    def test_auto_answer_parsed(self, sample_legacy_agent_data):
        extensions, _ = PipelineSession._parse_legacy_extensions(
            sample_legacy_agent_data)
        by_name = {e['name']: e for e in extensions}
        assert by_name['Benny Toh']['autoAnswer'] is False
        assert by_name['Zack Jong']['autoAnswer'] is False

    def test_cleaned_agent_data_no_directory(self, sample_legacy_agent_data):
        _, cleaned = PipelineSession._parse_legacy_extensions(
            sample_legacy_agent_data)
        assert 'EXTENSIONS DIRECTORY' not in cleaned
        assert 'EXTENSION STATUS' not in cleaned
        assert 'STATUS KEY' not in cleaned

    def test_cleaned_agent_data_keeps_other_fields(self, sample_legacy_agent_data):
        _, cleaned = PipelineSession._parse_legacy_extensions(
            sample_legacy_agent_data)
        assert 'CURRENT TIME: Thursday 16:30' in cleaned
        assert 'CALLER PHONE: unknown' in cleaned

    def test_empty_agent_data(self):
        extensions, cleaned = PipelineSession._parse_legacy_extensions('')
        assert extensions == []
        assert cleaned == ''

    def test_no_extension_sections(self):
        data = "CURRENT TIME: Monday 10:00\nCALLER PHONE: 0123456789"
        extensions, cleaned = PipelineSession._parse_legacy_extensions(data)
        assert extensions == []
        assert cleaned == data


class TestHandleSearchExtension:
    """Tests for PipelineSession._handle_search_extension()."""

    def _make_session(self, extensions):
        session = MockSession(extensions_directory=extensions)
        return session

    def test_search_by_exact_name(self, sample_extensions):
        session = self._make_session(sample_extensions)
        result = PipelineSession._handle_search_extension(session, {'name': 'Zack Jong'})
        assert 'Found 1 result' in result
        assert 'Zack Jong' in result

    def test_search_by_partial_name(self, sample_extensions):
        session = self._make_session(sample_extensions)
        result = PipelineSession._handle_search_extension(session, {'name': 'Zack'})
        assert 'Zack Jong' in result

    def test_search_case_insensitive(self, sample_extensions):
        session = self._make_session(sample_extensions)
        result = PipelineSession._handle_search_extension(session, {'name': 'zack'})
        assert 'Zack Jong' in result

    def test_search_by_department(self, sample_extensions):
        session = self._make_session(sample_extensions)
        result = PipelineSession._handle_search_extension(
            session, {'department': 'Artificial Intelligent'})
        assert 'Shoban' in result
        assert 'Jeremy Ng' in result
        assert 'Zack Jong' in result
        assert 'Joanne Chen' in result

    def test_search_by_partial_department(self, sample_extensions):
        session = self._make_session(sample_extensions)
        result = PipelineSession._handle_search_extension(session, {'department': 'AI'})
        assert 'Artificial Intelligent' in result

    def test_search_combined_name_and_dept(self, sample_extensions):
        session = self._make_session(sample_extensions)
        result = PipelineSession._handle_search_extension(
            session, {'name': 'Benny', 'department': 'AI'})
        # OR logic: matches Benny (by name) and all AI dept members
        assert 'Benny Toh' in result
        assert 'Zack Jong' in result

    def test_search_no_matches_name(self, sample_extensions):
        session = self._make_session(sample_extensions)
        result = PipelineSession._handle_search_extension(
            session, {'name': 'Nonexistent Person'})
        assert 'No person found' in result

    def test_search_no_matches_department(self, sample_extensions):
        session = self._make_session(sample_extensions)
        result = PipelineSession._handle_search_extension(
            session, {'department': 'Marketing'})
        assert 'No department found' in result

    def test_search_empty_query(self, sample_extensions):
        session = self._make_session(sample_extensions)
        result = PipelineSession._handle_search_extension(session, {})
        assert 'Please provide' in result

    def test_result_includes_ext_and_status(self, sample_extensions):
        session = self._make_session(sample_extensions)
        result = PipelineSession._handle_search_extension(session, {'name': 'Zack'})
        assert 'Ext: 8703' in result
        assert 'Status: ONLINE' in result
        assert 'Hours: 09:00-17:00' in result

    def test_result_includes_leader_flag(self, sample_extensions):
        session = self._make_session(sample_extensions)
        result = PipelineSession._handle_search_extension(session, {'name': 'Shoban'})
        assert 'LEADER' in result

    def test_entry_without_extension(self, sample_extensions):
        session = self._make_session(sample_extensions)
        result = PipelineSession._handle_search_extension(session, {'name': 'Askey'})
        assert 'No extension' in result

    def test_multiple_john_matches(self, sample_extensions):
        session = self._make_session(sample_extensions)
        result = PipelineSession._handle_search_extension(session, {'name': 'John'})
        assert 'John Kum' in result
        assert 'John Hoo' in result
        # Jonathan also contains "John"
        assert 'Jonathan Yong' not in result or 'Found' in result

    def test_department_count(self, sample_extensions):
        session = self._make_session(sample_extensions)
        result = PipelineSession._handle_search_extension(
            session, {'department': 'Mobile Team'})
        assert 'Found 3 result' in result
