
    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GZLAsJr)   r   z
/forecastsN2   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UA-DPSTZ\]P^_F,-!xFGsxy#t\\% FTNvhWY_`adeE$ %+8+h	l 	E U++r)   z/forecasts/seasonsc                6    t        ||        t        |d| f      S )NzSELECT 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;(EE%EE%T#ilwkyzAjM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    !!&&1H fZ01Aq 6;xPZG[\]G^_kGlz{  }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[[&1Fdnn.@.PRVRaRacgcocoqtuxy}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MPST_P`ObcdlmF&)-&8s=!"ceGc+.0B3x=RX0Y[^_k[lnqr{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<dos "!PXHYhop|h},,,/,;E,ae, ,6  !/6x/@wWcOd  " &'6=h6GV]^jVk  ( Z/6x/@wWcOd J J $%&'GH<M\cdp\q [ &[r)   