o
    | 8i$                     @   s   d dl mZmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ ddlmZ dd	lmZmZ d d
lmZ G dd dejZdS )    )viewsetsstatus)action)Response)IsAuthenticated)get_object_or_404)Q   )Senior)SeniorSerializerSeniorDetailSerializer)initiate_call_taskc                   @   s   e Zd ZdZg Zdd Zdd Zdd Zedd	gd
dddZ	eddgd
dddZ
eddgd
dddZeddgd
dddZeddgd
dd ZdS )SeniorViewSetz
    ViewSet for managing senior profiles.
    
    Provides CRUD operations for senior profiles and additional actions
    for initiating calls and retrieving conversation history.
    c                 C   s   t jjddS )z%Return all active seniors for testingT)	is_active)r
   objectsfilterself r   &/var/www/html/philips/seniors/views.pyget_queryset   s   zSeniorViewSet.get_querysetc                 C   s   | j dkrtS tS )z-Return appropriate serializer based on actionretrieve)r   r   r   r   r   r   r   get_serializer_class   s   
z"SeniorViewSet.get_serializer_classc                 C   s4   ddl m} |jjdddid\}}|j|d dS )	z&Create senior with a default test userr   )Usertestuseremailztest@example.com)usernamedefaults)	caregiverN)django.contrib.auth.modelsr   r   get_or_createsave)r   
serializerr   	test_usercreatedr   r   r   perform_create!   s   
zSeniorViewSet.perform_createTpost)detailmethodsNc                 C   s  |   }|jjg dd }|rtdditjdS |jdd}|jd}|jd	}|rWd
dl	m
} z
|jj|dd}	W n |jyV   tdd| ditjd Y S w |sd
dl	m}
 z|
jj|jd}|jj}W n |
jy   tdditjd Y S w d
dl	m} z
|jj|dd}W n |jy   tdd| ditjd Y S w t|j||jj||}td|j|j|j|jdt|jdtjdS )a  
        Initiate a call to the senior.
        
        POST /api/seniors/{id}/initiate_call/
        Body: {
            "purpose": "general_checkin",
            "prompt_id": 1,  // optional
            "assistant_id": 1  // optional, falls back to user preference
        }
        )	initiatedringingzin-progress)twilio_status__inerrorz.There is already an active call to this seniorr   purposegeneral_checkin	prompt_idassistant_idr   )
CallPromptT)idr   zPrompt with ID z not found or inactive)UserAssistantPreference)userz]No assistant selected. Please select an assistant first using /api/calls/set_user_preference/)VapiAssistantzAssistant with ID zCall initiation started)r3   name)messagetask_id	senior_id	assistantsenior)
get_objectcallsr   firstr   r   HTTP_400_BAD_REQUESTdatagetcalls.modelsr2   r   DoesNotExistr4   r   r;   r3   r6   r   delayr7   r   HTTP_202_ACCEPTED)r   requestpkr<   active_callcall_purposer0   r1   r2   promptr4   
preferencer6   r;   taskr   r   r   initiate_call*   sl   


zSeniorViewSet.initiate_callrB   c           	      C   s   |   }t|jdd}t|jdd}|jjdddd|||  }g }|D ]}||j	|j
|jj|j|j|j|jd	 q-t||j|jd
S )zw
        Get conversation history for the senior.
        
        GET /api/seniors/{id}/conversation_history/
        limit
   offsetr   	completed)call__statuscall-created_at)r3   datedurationsummarytopicssentiment_scoreengagement_level)conversationstotal_callslast_call_date)r=   intquery_paramsrB   r\   r   select_relatedorder_byappendr3   
created_atrT   formatted_durationrX   topics_discussedrZ   r[   r   r]   r^   )	r   rG   rH   r<   rO   rQ   r\   conversation_dataconvr   r   r   conversation_historyx   s0   

z"SeniorViewSet.conversation_historyc           
      C   s   |   }|jd}t|jdd}|j }|r |j|d}|ddd| }g }|D ]}	||	j	|	j
|	j|	j|	j|	j|	j|	jd q.t||j d	S )
z_
        Get memories for the senior.
        
        GET /api/seniors/{id}/memories/
        typerO      )memory_typez-importance_scorerU   N)r3   rj   titlecontentimportance_scoretagstimes_referencedrd   )memoriestotal_memories)r=   r`   rB   r_   rr   allr   rb   rc   r3   rl   rm   rn   ro   rp   rq   rd   r   count)
r   rG   rH   r<   rl   rO   memories_queryrr   memory_datamemoryr   r   r   rr      s.   

zSeniorViewSet.memoriesc           
      C   s   |   }|jd}t|jdd}|j }|r |j|d}|ddd| }g }|D ]}	||	j	|	j
|	j|	j|	j|	j|	jd q.t||j d	S )
z_
        Get insights for the senior.
        
        GET /api/seniors/{id}/insights/
        rj   rO   rP   )insight_typez-confidence_scorerU   N)r3   rj   rm   descriptionconfidence_scorerA   rd   )insightstotal_insights)r=   r`   rB   r_   r|   rt   r   rb   rc   r3   ry   rm   rz   r{   rA   rd   r   ru   )
r   rG   rH   r<   ry   rO   insights_queryr|   insight_datainsightr   r   r   r|      s,   


zSeniorViewSet.insightsFc                 C   sd   |j dd}|stdditjdS |  t|dt|dB }| j|dd	}t|j	|
 d
S )zq
        Search seniors by name or phone number.
        
        GET /api/seniors/search/?q=search_term
        q r,   zQuery parameter "q" is requiredr-   )name__icontains)phone_number__icontainsT)many)seniorsru   )r`   rB   r   r   r@   r   r   r   get_serializerrA   ru   )r   rG   queryr   r"   r   r   r   search   s   zSeniorViewSet.search)N)__name__
__module____qualname____doc__permission_classesr   r   r%   r   rN   ri   rr   r|   r   r   r   r   r   r      s     	M$&%r   N)rest_frameworkr   r   rest_framework.decoratorsr   rest_framework.responser   rest_framework.permissionsr   django.shortcutsr   django.db.modelsr   modelsr
   serializersr   r   calls.tasksr   ModelViewSetr   r   r   r   r   <module>   s    