Ë
    ¡¨ja  ã            
      óz  — d Z ddlmZ ddlmZ ddlmZmZmZ ddl	m
Z
 ddlmZ ddlmZ dd	lmZmZmZ dd
lmZ ddlmZmZmZ ddlmZ ddlmZmZ  edg¬«      Z G d„ de«      ZejA                  d«      ddddd ee«       ee«      f	 	 	 	 	 	 	 d!d„«       Z!ejA                  d«       ee«       ee«      fd"d„«       Z"ejA                  d«       ee«       ee«      fd#d„«       Z#d$d„Z$ejK                  d«       ee«       ee«      fd%d„«       Z&ejA                  d«      d ee«       ee«      fd&d „«       Z'y)'zCBrowse imported / published forecasts and find analogs for a draft.é    )Úannotations)Údate)Ú	APIRouterÚDependsÚHTTPException)Ú
Connection)Ú	BaseModelé   )Úengine)ÚUserÚcurrent_userÚrequire_center)Úactive_config)ÚfetchallÚfetchoneÚget_conn)Úfind_analogsé   )Ú	_load_runÚvalidate_inputsÚ	forecasts)Útagsc                  óH   — e Zd ZU ded<   dZded<   ded<   ded	<   d
Zded<   y)ÚAnalogInÚintÚ	center_idNú
int | NoneÚzone_idr   Ú
valid_dateÚdictÚinputsé   Úk)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   r#   © ó    ú2/var/www/avy-guidance/api/app/routers/forecasts.pyr   r      s%   … ØƒNØ€GˆZÓØÓØƒLØ€A€s„Jr)   r   z
/forecastsNé2   c                ól  — t        || «       dg}| t        t        |d«      d«      t        |d«      dœ}	|r|j                  d«       ||	d<   |r|j                  d«       ||	d	<   |r|j                  d
«       ||	d<   dj	                  |«      }
t        |d|
› �|	«      d   }t        |d|
› d�|	«      }||dœS )Nzf.center_id = %(c)sr   éÈ   r   )ÚcÚlimitÚoffsetzf.season = %(season)sÚseasonz/f.tsv @@ websearch_to_tsquery('english', %(q)s)ÚqzaEXISTS (SELECT 1 FROM forecast_problems p WHERE p.forecast_id = f.id AND p.problem_type = %(pt)s)Úptz AND z1SELECT count(*)::int AS n FROM forecasts f WHERE Únau  SELECT f.id, f.valid_date, f.season, f.source, f.guidance_era, f.title, f.danger_upper, f.danger_middle,
                   f.danger_lower, f.normal_caution, left(f.bottom_line, 300) AS bottom_line,
                   (SELECT array_agg(p.problem_type ORDER BY p.rank) FROM forecast_problems p WHERE p.forecast_id = f.id) AS problem_types
            FROM forecasts f WHERE z= ORDER BY f.valid_date DESC LIMIT %(limit)s OFFSET %(offset)s)ÚtotalÚitems)r   ÚminÚmaxÚappendÚjoinr   r   )r   r1   r2   Úproblem_typer/   r0   ÚconnÚuserÚwhereÚparamsÚclauser5   r6   s                r*   Úlist_forecastsrA      sä   € ô �4˜Ô#Ø"Ð#€EØ"¬S´°U¸A³ÀÓ-DÔPSÐTZÐ\]ÓP^Ñ_€FÙØ�‰Ð,Ô-Ø!ˆˆxÑÙØ�‰ÐFÔGØˆˆs‰ÙØ�‰ÐxÔyØ#ˆˆt‰Ø�\‰\˜%Ó €FÜ�TÐNÈvÈhÐWÐY_Ó`ÐadÑe€EÜØð$ð %+ 8Ð+hð	lð 	ó€Eð  UÑ+Ð+r)   z/forecasts/seasonsc                ó6   — t        || «       t        |d| f«      S )Nz˜SELECT season, count(*)::int AS n, min(valid_date) AS first, max(valid_date) AS last FROM forecasts WHERE center_id = %s GROUP BY season ORDER BY season)r   r   )r   r<   r=   s      r*   ÚseasonsrC   9   s'   € ä�4˜Ô#ÜØð 	cØ	ˆóð r)   z/forecasts/{forecast_id}c                óÆ   — t        |d| f«      }|st        dd«      ‚t        ||d   «       |j                  dd «       |j                  dd «       t	        |d| f«      |d<   |S )	NzfSELECT f.*, z.name AS zone_name FROM forecasts f LEFT JOIN zones z ON z.id = f.zone_id WHERE f.id = %si”  zForecast not foundr   ÚtsvÚrawzDSELECT * FROM forecast_problems WHERE forecast_id = %s ORDER BY rankÚproblems)r   r   r   Úpopr   )Úforecast_idr<   r=   Úfs       r*   Úget_forecastrK   C   sw   € ä�Ðð  CNð  BPó  	Q€AÙÜ˜CÐ!5Ó6Ð6Ü�4˜˜;™Ô(Ø‡E�Eˆ%�ÔØ‡E�Eˆ%�ÔÜ˜TÐ#iÐlwÐkyÓz€A€j�MØ€Hr)   c           	     ó°   — t        j                  | |«      }t        | d   «      D ��cg c]!  \  }}|d   |d   |d   |   d   |d   d   dœ‘Œ# c}}S c c}}w )NrG   ÚtypeÚ	locationsÚ
likelihoodÚsizer8   )rM   rN   rO   Úsize_max)r   Úcompute_runÚ	enumerate)r!   ÚconfigÚcomputedÚiÚps        r*   Ú_query_from_inputsrX   O   s‡   € Ü×!Ñ! &¨&Ó1€Hô ˜f ZÑ0Ó1÷áˆAˆqð �6‘¨¨;©ÀxÐPZÑG[Ð\]ÑG^Ð_kÑGlÐz{ð  }Cñ  {Dð  EJñ  {Kó  	Lóð ùó s   ¨&Az/analogsc                ó8  — t        || j                  «       t        || j                  «      d   }t        | j                  |«      }t        || j                  t        ||«      | j                  | j                  t        t        | j                  d«      d«      «      S )NrT   r   é   )r   r   r   r   r!   r   rX   r   r   r7   r8   r#   )Úbodyr<   r=   rT   r!   s        r*   Úanalogsr\   W   s“   € ä�4˜Ÿ™Ô(Ü˜4 §¡Ó0°Ñ:€FÜ˜TŸ[™[¨&Ó1€FÜ˜˜dŸn™nÔ.@ÀÈÓ.PÐRV×RaÑRaÐcg×coÑcoÔqtÔuxÐy}×yÑyð  BCó  vDð  FHó  rIó  Jð  Jr)   z/runs/{run_id}/analogsr"   c                óä   — t        || |«      }t        |d|d   f«      d   }|d   r|d   hn	t        «       }t        ||d   t	        |d   |«      |d   |d   t        t        |d	«      d
«      |«      S )Nz/SELECT config FROM center_configs WHERE id = %sÚ	config_idrT   rI   r   r!   r   r   r   rZ   )r   r   Úsetr   rX   r7   r8   )Úrun_idr#   r<   r=   ÚrunrT   Úexcludes          r*   Úrun_analogsrc   _   s¸   € ä
�D˜& $Ó
'€CÜ�dÐMÐPSÐT_ÑP`ÐObÓcÐdlÑm€FØ&)¨-Ò&8ˆs�=Ñ!Ñ"¼c»e€GÜ˜˜c +Ñ.Ô0BÀ3ÀxÁ=ÐRXÓ0YÐ[^Ð_kÑ[lÐnqÐr{Ñn|ô  Bô  CFð  GHð  JKó  CLð  NPó  Qð  SZó  [ð  [r)   )r   r   r1   ú
str | Noner2   rd   r;   r   r/   r   r0   r   r<   r   r=   r   )r   r   r<   r   r=   r   )rI   r   r<   r   r=   r   )r!   r    rT   r    Úreturnz
list[dict])r[   r   r<   r   r=   r   )r`   r   r#   r   r<   r   r=   r   )(Ú__doc__Ú
__future__r   Údatetimer   Úfastapir   r   r   Úpsycopgr   Úpydanticr	   Ú r   Úauthr   r   r   Úconfigsr   Údbr   r   r   Ú	retrievalr   Úrunsr   r   Úrouterr   ÚgetrA   rC   rK   rX   Úpostr\   rc   r(   r)   r*   ú<module>ru      si  ðÙ Iå "å ç 5Ñ 5Ý Ý å ß 5Ñ 5Ý #ß -Ñ -Ý $ß ,á	˜˜Ô	&€ôˆyô ð ‡�ˆLÓØ8<ÈdÐosØ "°!ÉÐPXÓHYÑhoÐp|Óh}ð,Øð,Ø,/ð,Ø;Eð,Øaeò,ó ð,ð6 ‡�Ð Ó!Ù/6°xÓ/@ÉwÐWcÓOdó ó "ðð ‡�Ð&Ó'Ù6=¸hÓ6GÑV]Ð^jÓVkó ó (ðóð ‡�ˆZÓÙ/6°xÓ/@ÉwÐWcÓOdó Jó ðJð ‡�Ð$Ó%Ø&'¹GÀHÓ<MÑ\cÐdpÓ\qó [ó &ñ[r)   