U
    XHgaC                     @   s>   d dl mZ d dlmZ d dlmZmZmZ G dd dZdS )    )
SortedDict)
app_logger)CustomizedProgramSeq
ProgramseqExperimentConditionsc                   @   st   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )ProgramSequenceServicec                 C   sD   t j }g }|D ],}t|j|j|j|j|j|j	}|
| q|S N)r   query!get_all_sequence_by_sequence_typer   id
content_id
program_idsequence_indexdayweekappend)selfprogram_sequencesprogram_seq_listZprogram_seqpseq_obj r   R/var/www/dostadmin/dostadmin/services/program_sequence/program_sequence_service.pyget_program_type_sequences   s    
z1ProgramSequenceService.get_program_type_sequencesc           
      C   sD  t j }i }i }tj }|D ]}|||j< q |D ]}|jt jjk}d|j	 d}d }	|r|
|j}	|	st d S d|j	 d|	j d|	j }|
|jd kr|t|j|gg| d|	d krd n|	ji||j< q4||j 
|d kr*||j |t|j|gg| d|	d krd n|	ji||j< q4|||j | |j< q4|S )NM_Prog_Exp__module_length)r   r	   get_all_sequencer   get_experiment_logr   sequence_typeSequenceType
EXPERIMENTr   getexperiment_condition_idexperiment_idexperiment_group_namer   r   r   value)
r   r   formatted_program_sequenceZexperiment_conditions_dictexperiment_conditions	conditionsequenceZis_experiment_sequenceformatted_module_key_nameexperiment_conditionr   r   r   *get_module_wise_formatted_program_sequence   sh    


 
	
 
zAProgramSequenceService.get_module_wise_formatted_program_sequencec                 C   s   t j }i }|D ]}||jd krD|jt|j|ggi||j< q||j |jd kr||j |jt|j|ggi||j< q|||j |j |j< q|S r   )	r   r	   r   r#   r   r   r   r   r   )r   r   r(   r+   r   r   r   +get_content_wise_formatted_program_sequenceP   s&    
 zBProgramSequenceService.get_content_wise_formatted_program_sequencec                 C   s  |j d k	}|j }|r|jnd }|d}||j |}	d }
d| d|j }|	d kr|d krjt| n||kr|t| d S |	 D ]h}|
d kr|j	t
jjkr|}
|j	|rt
jjnt
jjkrqtj|j}|r|j |kr|j|kr|}
 qq|
s||krt| d S |
S )N,content_wise_formatted_program_sequence_dictzDProgram Sequence Service: Program Sequence not found for content id  for user number )r%   r&   r#   r   phoner   warningerrorvaluesr    r   r!   PROGRAMr"   r   r	   	get_by_idr$   )r   formatted_program_sequencesr   
experiencespecial_content_id_listis_enrolled_in_experimentr%   r&   r0   r   Zprogram_sequence_for_contenterror_messager+   r-   r   r   r   get_current_program_sequenceh   s`    




z3ProgramSequenceService.get_current_program_sequencec                 C   s   d}| d}| ||||}|d krH| |d|}|d kr@dS ||fS ||j | || }	|jd }
|	 |
}|d kr| ||jd |}|d kr| ||jd |}|rd}||fS )NF+module_wise_formatted_program_sequence_dict   )NN   T)r#   r=   get_first_sequence_of_a_weekr   .get_key_name_for_module_based_program_sequencer   r   )r   r8   previous_content_idr9   r:   Zis_module_getting_changedr>   Z#previous_delivered_program_sequencenext_sequenceZcurrent_module_sequenceZnext_sequence_indexr   r   r   get_next_program_sequence   sX       	

z0ProgramSequenceService.get_next_program_sequencec                 C   s<   d|j  d}|jtjjkr8d|j  d|j d|j }|S )Nr   r   r   r   )r   r    r   r!   r"   r%   r&   )r   r+   r9   Zkey_namer   r   r   rB      s    zEProgramSequenceService.get_key_name_for_module_based_program_sequencec                 C   s*   | d}||j  |}|d kr&dS dS )Nr0   FT)r#   r   )r   r8   r   r9   r0   Zsequences_for_contentr   r   r   $is_content_exist_in_program_sequence   s    z;ProgramSequenceService.is_content_exist_in_program_sequencec                 C   s  z|  |||sW d S |jd k	}|d}||j d| d}|rt||j d| d|j d|j }|rt|}|d krtd| d|j d|j d	 W d S tt	|}|| }	|	W S  t
k
r }
 z0td| d|j d|j d
|
  W Y d S d }
~
X Y nX d S )Nr>   r   r   r   r   zJProgram Sequence Service: First program sequence cannot be found for week z and program id r1   .z. Error message: )is_module_valid_for_experimentr%   r#   r   r&   r   r3   r2   nextiter	Exceptionr4   )r   r8   week_numberr9   r;   r>   Zmodule_sequenceZexperiment_sequenceZfirst_sequence_indexZfirst_sequence_of_weekr4   r   r   r   rA      sL      

z3ProgramSequenceService.get_first_sequence_of_a_weekc                 C   sL   d| d|j  d|j d}|d|j | }|rH|t|krHdS dS )Nr   r   r   r   r>   FT)r%   r&   r#   r   int)r   r8   rL   r9   r,   Zmax_module_for_experimentr   r   r   rH   +  s    z5ProgramSequenceService.is_module_valid_for_experimentc                 C   s\   i }i }|D ]F}|j |kr0||j  }|||j< nt|j|gg||j < |j||j< q||fS r   )r   r   r   r   )r   r   program_sequenceZcontent_sequence_mapr   Zsorted_program_seqr   r   r   create_program_seq_dicts8  s    



z/ProgramSequenceService.create_program_seq_dictsc                 C   s6   t |}|D ]$}|| }|j|kr||kr dS qdS )NTF)lenr   )r   program_sequence_listr   Zlength_of_programprogram_sequence_keyrN   r   r   r   is_last_content_of_programH  s    
z1ProgramSequenceService.is_last_content_of_programc                 C   s^   |  ||rdS |D ]D}|| }|j|kr|t|kr< dS ||d  }|jdkr dS qdS )NTr?   F)rS   r   rP   r   )r   rQ   r   rR   rN   Znext_program_sequencer   r   r   is_last_content_of_moduleS  s    

z0ProgramSequenceService.is_last_content_of_modulec           
      C   sZ   d}| | | }g }|D ]6}|d }|d }|d }|d }	|||	||f q|S )Na	  
            WITH max_module_for_program_type_sequences as (
                SELECT program_id, null::integer as experiment_id, null::integer as experiment_condition_id, null as experiment_group_name, max(week) as max_module FROM programseq
                WHERE programseq.sequence_type = 'program'
                GROUP BY 1, 2, 3, 4
            ), max_module_for_experiment_type_sequences as (
                SELECT programseq.program_id, experiment_conditions.experiment_id, programseq.experiment_condition_id, experiment_conditions.experiment_group_name, experiment_conditions.value::Integer as max_module FROM programseq
                JOIN experiment_conditions
                ON experiment_conditions.id = programseq.experiment_condition_id
                AND experiment_conditions.key = 'max_module_length'
                GROUP BY 1, 2, 3, 4, 5
            ), max_module as (
                SELECT * FROM max_module_for_program_type_sequences
                UNION ALL
                SELECT * FROM max_module_for_experiment_type_sequences
            ), max_sequence_index_module_wise as (
                SELECT
                max_module.program_id, max_module.experiment_id, max_module.experiment_group_name, max_module,
                max_module.experiment_condition_id, max(programseq.sequence_index) as max_sequence_index_for_week
                FROM max_module
                JOIN programseq
                ON programseq.program_id = max_module.program_id
                AND programseq.week = max_module
                AND CASE
                		WHEN max_module.experiment_condition_id IS NULL
                		THEN programseq.experiment_condition_id IS NULL
                		ELSE programseq.experiment_condition_id = max_module.experiment_condition_id
                	END
                GROUP BY 1, 2, 3, 4, 5
            )
            SELECT
                msimw.program_id,
                msimw.experiment_id,
                msimw.experiment_group_name,
				programseq.content_id
            FROM max_sequence_index_module_wise as msimw
            JOIN programseq
            on programseq.program_id = msimw.program_id
            	AND programseq.week = msimw.max_module
            	AND programseq.sequence_index = msimw.max_sequence_index_for_week
            	AND CASE
                		WHEN msimw.experiment_condition_id IS NULL
                		THEN programseq.experiment_condition_id IS NULL
                		ELSE programseq.experiment_condition_id = msimw.experiment_condition_id
                	END
        r   r?   r@      )executefetchallr   )
r   cursorsql	sequencesZlast_contentsr+   r   r%   Z
group_namer   r   r   r   get_last_content_for_programsb  s    .
z4ProgramSequenceService.get_last_content_for_programsN)__name__
__module____qualname__r   r.   r/   r=   rE   rB   rF   rA   rH   rO   rS   rT   r[   r   r   r   r   r      s   9=@.r   N)	sortedcontainersr   	dostadminr   dostadmin.db_modelr   r   r   r   r   r   r   r   <module>   s   