o
    iD                     @   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                
   @   sp  e Zd ZdZed*dededefddZedededefd	d
ZededefddZ	ed+dedede
defddZededefddZededee fddZededee fddZededee fddZededee fddZededee fddZed ede
fd!d"Zed ede
fd#d$Zed ede
fd%d&Zed'edee f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u 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_idc                 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_messagec                 C   
   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<      z'McubeService.create_clear_audio_messageTtransfer_toshow_original_caller_idc                 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
        transfer)r   r   
transferToshowOriginalCallerIdr   )r   r"   r#   r   r   r   create_transfer_messageL   s
   z$McubeService.create_transfer_messagec                 C   r   )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`   r!   z%McubeService.create_terminate_messagestart_event_datac              	   C   (   z| d d W S  t tfy   Y dS w )z
        Extract call ID from Mcube start event data.
        
        Args:
            start_event_data: Mcube start event data
            
        Returns:
            Call ID if found, None otherwise
        startcallIdNKeyError	TypeErrorr*   r   r   r   extract_call_idq   
   zMcubeService.extract_call_idc              	   C   r+   )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.   r1   r   r   r   extract_stream_id   r3   zMcubeService.extract_stream_idmedia_event_datac              	   C   r+   )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.   r5   r   r   r   extract_media_payload   r3   z"McubeService.extract_media_payloadc              	   C   r+   )z
        Extract timestamp from Mcube media event data.
        
        Args:
            media_event_data: Mcube media event data
            
        Returns:
            Timestamp if found, None otherwise
        r   	timestampNr.   r6   r   r   r   extract_media_timestamp   r3   z$McubeService.extract_media_timestampc              	   C   r+   )z
        Extract track from Mcube media event data.
        
        Args:
            media_event_data: Mcube media event data
            
        Returns:
            Track if found, None otherwise
        r   trackNr.   r6   r   r   r   extract_media_track   r3   z McubeService.extract_media_track
event_datac                 C      |  ddkS )z3Check if event data represents a Mcube media event.r   r   getr<   r   r   r   is_media_event      zMcubeService.is_media_eventc                 C   r=   )z3Check if event data represents a Mcube start event.r   r,   r>   r@   r   r   r   is_start_event   rB   zMcubeService.is_start_eventc                 C   r=   )z:Check if event data represents a Mcube playedStream event.r   playedStreamr>   r@   r   r   r   is_played_stream_event   rB   z#McubeService.is_played_stream_eventplayed_stream_event_datac              	   C   s$   z| d W S  t tfy   Y dS w )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.   )rF   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   r2   r4   r7   r9   r;   rA   rC   rE   rG   r   r   r   r   r      s<    
r   )r   typingr   configr   r   r   r   r   r   <module>   s    