#!/usr/bin/env python3
"""
Unit tests for transfer_data.py script
Tests the data transfer functionality and argument parsing
"""

import unittest
import sys
import os
from unittest.mock import Mock, patch, MagicMock
from io import StringIO

sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'datapush'))

from transfer_data import main


class TestTransferData(unittest.TestCase):
    """Test cases for transfer_data module"""

    @patch('transfer_data.CallHistoryAPI')
    def test_main_with_default_limit(self, mock_api_class):
        """Test main function with default limit of 100"""
        mock_api_instance = MagicMock()
        mock_api_class.return_value = mock_api_instance
        mock_api_instance.process_and_transfer_data.return_value = {
            'success': True,
            'message': 'Data transfer completed',
            'records_processed': 100
        }
        
        sys.argv = ['transfer_data.py']
        
        with patch('sys.exit') as mock_exit:
            with patch('builtins.print'):
                main()
                mock_api_instance.process_and_transfer_data.assert_called_once_with(100)
                mock_exit.assert_called_once_with(0)

    @patch('transfer_data.CallHistoryAPI')
    def test_main_with_custom_limit(self, mock_api_class):
        """Test main function with custom record limit"""
        mock_api_instance = MagicMock()
        mock_api_class.return_value = mock_api_instance
        mock_api_instance.process_and_transfer_data.return_value = {
            'success': True,
            'message': 'Data transfer completed',
            'records_processed': 50
        }
        
        sys.argv = ['transfer_data.py', '50']
        
        with patch('sys.exit') as mock_exit:
            with patch('builtins.print'):
                main()
                mock_api_instance.process_and_transfer_data.assert_called_once_with(50)
                mock_exit.assert_called_once_with(0)

    @patch('transfer_data.CallHistoryAPI')
    def test_main_with_invalid_limit(self, mock_api_class):
        """Test main function with invalid (non-integer) limit argument"""
        mock_api_instance = MagicMock()
        mock_api_class.return_value = mock_api_instance
        mock_api_instance.process_and_transfer_data.return_value = {
            'success': True,
            'message': 'Data transfer completed',
            'records_processed': 100
        }
        
        sys.argv = ['transfer_data.py', 'invalid']
        
        with patch('sys.exit') as mock_exit:
            with patch('builtins.print'):
                main()
                mock_api_instance.process_and_transfer_data.assert_called_once_with(100)
                mock_exit.assert_called_once_with(0)

    @patch('transfer_data.CallHistoryAPI')
    def test_main_transfer_failure(self, mock_api_class):
        """Test main function when data transfer fails"""
        mock_api_instance = MagicMock()
        mock_api_class.return_value = mock_api_instance
        mock_api_instance.process_and_transfer_data.return_value = {
            'success': False,
            'message': 'Database connection failed',
            'records_processed': 0
        }
        
        sys.argv = ['transfer_data.py']
        
        with patch('sys.exit') as mock_exit:
            with patch('builtins.print'):
                main()
                mock_exit.assert_called_once_with(1)

    @patch('transfer_data.CallHistoryAPI')
    def test_main_keyboard_interrupt(self, mock_api_class):
        """Test main function when user interrupts (Ctrl+C)"""
        mock_api_instance = MagicMock()
        mock_api_class.return_value = mock_api_instance
        mock_api_instance.process_and_transfer_data.side_effect = KeyboardInterrupt()
        
        sys.argv = ['transfer_data.py']
        
        with patch('sys.exit') as mock_exit:
            with patch('builtins.print'):
                main()
                mock_exit.assert_called_once_with(1)

    @patch('transfer_data.CallHistoryAPI')
    def test_main_unexpected_exception(self, mock_api_class):
        """Test main function when an unexpected exception occurs"""
        mock_api_instance = MagicMock()
        mock_api_class.return_value = mock_api_instance
        mock_api_instance.process_and_transfer_data.side_effect = Exception('Unexpected error')
        
        sys.argv = ['transfer_data.py']
        
        with patch('sys.exit') as mock_exit:
            with patch('builtins.print'):
                main()
                mock_exit.assert_called_once_with(1)


if __name__ == '__main__':
    unittest.main()
