U
    HiD                     @   s2   d dl Z d dlmZ d dlmZ G dd dZdS )    N)Optional)Configc                   @   sL  e Zd ZdZed(eeedddZeeeedddZeeed	d
dZ	ed)eee
edddZeeed	ddZeeee dddZeeee dddZeeee dddZeeee dddZeeee dddZeee
ddd Zeee
dd!d"Zeee
dd#d$Zeeee d%d&d'ZdS )*McubeServiceaq  
    Provides all Mcube call service integration logic for the application.
    
    - Handles Mcube WebSocket protocol for incoming calls
    - Creates Mcube-compatible messages (playAudio, checkpoint, clearAudio, transfer, terminate)
    - Extracts and interprets Mcube event payloads
    
    This class is the main entry point for all Mcube-related operations.
    N)audio_payloadnamereturnc                 C   s8   |dkr dt  jdd  }dtjtj| |ddS )a:  
        Create a Mcube playAudio message with audio payload.
        
        Args:
            audio_payload: Base64 encoded audio data
            name: Unique name for the audio segment (generated if not provided)
            
        Returns:
            Dictionary containing Mcube playAudio message
        Naudio_   	playAudio)contentType
sampleRatepayloadr   )eventmedia)uuiduuid4hexr   MCUBE_AUDIO_FORMATMCUBE_SAMPLE_RATE)r   r    r   ;/var/www/html/live_calls/homebook/services/mcube_service.pycreate_play_audio_message   s    z&McubeService.create_play_audio_message)	stream_idr   r   c                 C   s   d| |dS )a'  
        Create a Mcube checkpoint message for audio synchronization.
        
        Args:
            stream_id: Mcube stream identifier
            name: Name of the audio segment to checkpoint
            
        Returns:
            Dictionary containing Mcube checkpoint message
        
checkpoint)r   streamIdr   r   )r   r   r   r   r   create_checkpoint_message*   s    z&McubeService.create_checkpoint_message)r   r   c                 C   s
   d| dS )z
        Create a Mcube clearAudio message to clear audio buffer.
        
        Args:
            stream_id: Mcube stream identifier
            
        Returns:
            Dictionary containing Mcube clearAudio message
        
clearAudior   r   r   r   r   r   r   create_clear_audio_message<   s    z'McubeService.create_clear_audio_messageT)r   transfer_toshow_original_caller_idr   c                 C   s   d| ||dS )a  
        Create a Mcube transfer message to transfer the call.
        
        Args:
            stream_id: Mcube stream identifier
            transfer_to: Phone number to transfer call to in E.164 format
            show_original_caller_id: Whether to show caller's phone number as callerId
            
        Returns:
            Dictionary containing Mcube transfer message
        Ztransfer)r   r   Z
transferToZshowOriginalCallerIdr   )r   r    r!   r   r   r   create_transfer_messageL   s
    z$McubeService.create_transfer_messagec                 C   s
   d| dS )z
        Create a Mcube terminate message to end the call.
        
        Args:
            stream_id: Mcube stream identifier
            
        Returns:
            Dictionary containing Mcube terminate message
        	terminater   r   r   r   r   r   create_terminate_message`   s    z%McubeService.create_terminate_message)start_event_datar   c              	   C   s.   z| d d W S  t tfk
r(   Y dS X dS )z
        Extract call ID from Mcube start event data.
        
        Args:
            start_event_data: Mcube start event data
            
        Returns:
            Call ID if found, None otherwise
        startZcallIdNKeyError	TypeErrorr%   r   r   r   extract_call_idq   s    zMcubeService.extract_call_idc              	   C   s.   z| d d W S  t tfk
r(   Y dS X dS )z
        Extract stream ID from Mcube start event data.
        
        Args:
            start_event_data: Mcube start event data
            
        Returns:
            Stream ID if found, None otherwise
        r&   r   Nr'   r*   r   r   r   extract_stream_id   s    zMcubeService.extract_stream_id)media_event_datar   c              	   C   s.   z| d d W S  t tfk
r(   Y dS X dS )z
        Extract audio payload from Mcube media event data.
        
        Args:
            media_event_data: Mcube media event data
            
        Returns:
            Audio payload if found, None otherwise
        r   r   Nr'   r-   r   r   r   extract_media_payload   s    z"McubeService.extract_media_payloadc              	   C   s.   z| d d W S  t tfk
r(   Y dS X dS )z
        Extract timestamp from Mcube media event data.
        
        Args:
            media_event_data: Mcube media event data
            
        Returns:
            Timestamp if found, None otherwise
        r   	timestampNr'   r.   r   r   r   extract_media_timestamp   s    z$McubeService.extract_media_timestampc              	   C   s.   z| d d W S  t tfk
r(   Y dS X dS )z
        Extract track from Mcube media event data.
        
        Args:
            media_event_data: Mcube media event data
            
        Returns:
            Track if found, None otherwise
        r   ZtrackNr'   r.   r   r   r   extract_media_track   s    z McubeService.extract_media_track)
event_datar   c                 C   s   |  ddkS )z3Check if event data represents a Mcube media event.r   r   getr3   r   r   r   is_media_event   s    zMcubeService.is_media_eventc                 C   s   |  ddkS )z3Check if event data represents a Mcube start event.r   r&   r4   r6   r   r   r   is_start_event   s    zMcubeService.is_start_eventc                 C   s   |  ddkS )z:Check if event data represents a Mcube playedStream event.r   ZplayedStreamr4   r6   r   r   r   is_played_stream_event   s    z#McubeService.is_played_stream_event)played_stream_event_datar   c              	   C   s*   z
| d W S  t tfk
r$   Y dS X dS )z
        Extract name from Mcube playedStream event data.
        
        Args:
            played_stream_event_data: Mcube playedStream event data
            
        Returns:
            Name if found, None otherwise
        r   Nr'   )r:   r   r   r   extract_played_stream_name   s    
z'McubeService.extract_played_stream_name)N)T)__name__
__module____qualname____doc__staticmethodstrdictr   r   r   boolr"   r$   r   r+   r,   r/   r1   r2   r7   r8   r9   r;   r   r   r   r   r      s:   
r   )r   typingr   configr   r   r   r   r   r   <module>   s   