
    ej'                        d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZ d dlZe j                  j                  e j                  j                  e      d      Zd Z e        dddd	d
ddddddddZd Zd Zd Zd8dZdZdZdZdZdZdZdddd Zd! Zd" Zd# Zd9d$Zd% Zd& Z d' Z!d( Z"d) Z#d* Z$d+ Z%d, Z&d:d-Z'efd.Z(d/ Z)d0 Z*d1 Z+d;d2Z,d;d3Z-d4 Z.d5 Z/d6 Z0d7 Z1y)<    N)BeautifulSoup)datetime	timedeltazriver_history.dbc                      t        j                  t              5 } | j                         }|j	                  d       | j                          ddd       y# 1 sw Y   yxY w)uw   Створює таблицю для збереження історії температур, якщо її немаєz
            CREATE TABLE IF NOT EXISTS water_temperatures (
                date_key TEXT PRIMARY KEY,
                temperature REAL
            )
        N)sqlite3connectDB_PATHcursorexecutecommit)connr
   s     B/var/www/bonuses.adamproject.app/telegram_bots/cheremosh/parser.pyinit_dbr      sL    		! T  	 	  s   2AA   СІЧ   ЛЮТ   БЕР   КВІ   ТРА   ЧЕР   ЛИП   СЕР   ВЕР   ЖОФ   ЛИС   ГРУ                        	   
         c                     	 t        j                  | d      }dddddddd	d
dddd}|j                   d||j                      S #  | cY S xY w)u5   Перетворює '09.07.2026' на '9 липня'%d.%m.%Yu
   січняu   лютогоu   березняu   квітняu   травняu   червняu
   липняu   серпняu   вересняu   жовтняu   листопадаu   грудняr    )r   strptimedaymonth)date_strdtmonthss      r   format_to_ukr_dater2   #   sk    	x43C.\n^9MSa

 &&6"((+,--s   AA Ac                  "   t        j                  d      } t        j                  |       }|j	                  d      }i }	 t        j                  t              5 }|j                         }|j                  d       |j                         D ]  }|d   ||d   <    	 d d d        ||v r|S d}ddd	d
d}		 t        j                  ||	d      }
|
j                  dk(  rd|
_        t!        |
j"                  d      }|j%                  dd      }|r|j%                  d      r |j%                  d      j'                  d      n|j'                  d      }ddddddddddddd }g }|D ]  }|j'                  d!      }t)        |      dk\  s$|d   j"                  j+                         j-                  d"d#      j/                         }|d   j"                  j+                         }t1        j2                  d$d%|      }|st5        |      }|j7                         }t)        |      dk\  s|d   d d }|d   }||v s||   }t9        |      }|d&d'|d&d'|j:                   }|||<   |j=                  ||f        |rVt        j                  t              5 }|j                         }|j?                  d(|       |jA                          d d d        |S |S # 1 sw Y   7xY w# t        $ r}Y d }~Id }~ww xY w# 1 sw Y   |S xY w# t        $ r Y |S w xY w))NEurope/Kyivr*   z4SELECT date_key, temperature FROM water_temperaturesr   r   =https://ukr.seatemperature.net/richki/water-temp-in-cheremoshoMozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/149.0.0.0 Safari/537.36`text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8#uk-UA,uk;q=0.9,en-US;q=0.8,en;q=0.7typdisplay=1; cntgo=UA)
User-AgentAcceptAccept-LanguageCookier&   headerstimeout   utf-8html.parsertabletemp-table4class_tbodytrr   r   r    r!   r"   r#   r$   r%   r'   r(   )r   r   r   r   r   r   r   r   r   r   r   r   td    r+   [^\d.] 02d.z
                            INSERT OR REPLACE INTO water_temperatures (date_key, temperature)
                            VALUES (?, ?)
                        )!pytztimezoner   nowstrftimer   r   r	   r
   r   fetchall	Exceptionrequestsgetstatus_codeencodingr   textfindfind_alllenstripreplaceupperresubfloatsplitintyearappendexecutemanyr   )kyiv_tzrR   	today_key
temps_dictr   r
   roweurlr?   ressouprD   rows
inv_monthsnew_recordscols	date_cell	temp_textcleaned_tempt_floatpartsm_strd_strm_numd_numdate_keys                              r   get_all_seatemperatures_dictr   1   s   mmM*G
,,w
CZ(IJ__W% 	,[[]FNNQR( ,%(V
3q6",	, J JC Ht@*	G1ll3<??c!"CL =9DIIgmI<E=BZZ=Puzz'*33D9V[VdVdeiVj  1QRS_`1RSUac

 ! HC<<-D4yA~$(GLL$6$6$8$@$@$M$S$S$U	$(GLL$6$6$8	')vviY'G+$"'"5 ) 1u:?$)!HRaLE$)!HE$
2(25(9(+E
.3C[%AchhZ+P7>
8 4 + 2 2Hg3F G+H0  1 &T!%** , )* & :S	, 	,  p&   so   K AKK 3CL BL #L 5AL 3K4L KK 	K1,K14K>9L >L 	LLc                  8   d} dddddddd}	 t        j                  | |d	
      }|j                  dk7  ryd|_        t	        |j
                  d      }|j                  dd      }|syt        j                         }t        |j                        }t        j                  |j                  d      }| d| j                         }|j                  d      r |j                  d      j                  d      n|j                  d      }	ddlfd}
|	D ]  }|j                  dd      }|j                  d      }t!        |      dk\  s5|d   j
                  j#                         j%                  dd      j                         }d|v s||v sy |
|d   j
                        }||c S  t'        |	      D ]=  }|j                  d      }t!        |      dk\  s# |
|d   j
                        }|;|c S  	 y# t(        $ r}t+        d|        Y d}~yd}~ww xY w)u   Парсить базову температуру води в Черемоші з урахуванням кук та правильного формату датr5   r6   r7   r8   zno-cacher9   1)r:   r;   r<   zCache-Controlr=   PragmazUpgrade-Insecure-Requestsr&   r>   rA   NrB   rC   rD   rE   rF   rM   r+   rH   rI   r   c                 z    | r| dk(  ry j                   dd|       }	 |rt        |      S dS # t        $ r Y yw xY w)u|   Допоміжна функція для очищення тексту від градусів та сміття типу Â   —NrL   rM   )rb   rc   
ValueError)rZ   cleanedra   s     r   clean_temp_valuez/get_water_temperature.<locals>.clean_temp_value   sK    45=bffYD1G)0uW~:d: s   . . 	::stylerJ   r   rK   91DBFFr   uO   Помилка парсингу температури води з сайту: )rV   rW   rX   rY   r   rZ   r[   r   rR   strr-   UKR_MONTHS_SHORTr.   r`   r\   ra   r]   r^   r_   reversedrU   print)rn   r?   ro   rp   rD   rR   day_str	month_strtarget_date_labelrq   r   rl   	row_stylert   ru   valrm   ra   s                    @r   get_water_temperaturer      s   
IC Ht@#*%(G9ell3<??c! SXX}5		'-	8llncgg,$((B7	  )k7)4::<5:ZZ5Huzz'"++D1enn]aNb		  	#C,I<<%D4yA~ GLL..088EKKM	 y(,=,J*47<<8C"
	# D> 	C<<%D4yA~&tAw||4?J	   e_`a_bcddesN   'G8 2G8 *CG8 
AG8 G8 &G8 *.G8 G8 1G8 5G8 8	HHHc                 .   	 d}| rL	 t        j                  | d      }|j                         t        j                         j                         kD  rd}t	        d|      }t        |j                  dd            }t        |dz
  d	      S #  Y ;xY w#  Y y
xY w)u   Розумний фолбек: вираховує температуру гірської річки на основі погоди ПопельниківFr*   Tmorning)target_timeis_tomorrowtempg     0@g       @r   g      -@)r   r,   daterR   get_weather_popelnykyrc   rW   round)target_date_strr   r0   weather_nowair_temps        r   get_fallback_water_tempr      s    &&
C779x||~2244"&K ,	{[67X^Q''	s#   B AB	 6B 	BB BiϤ  i_    uB   Вердикт на нічну рибалку — після 14:00r   r   z)Mozilla/5.0 (Windows NT 10.0; Win64; x64)XMLHttpRequestzFhttps://www.meteo.gov.ua/ua/Dani-avtomatichnikh-hidrolohichnikh-postiv)r:   zX-Requested-WithRefererc                     d|  d| d| }	 t        j                  |t        d      }|j                  dk7  ry |j	                         S # t
        $ r Y y w xY w)Nz3https://www.meteo.gov.ua/_/?ACT=HydroAuto&INC=DB&P=z&F=z&T=r(   r>   rA   )rV   rW   HYDRO_HEADERSrX   jsonrU   )
station_id	date_fromdate_torn   ro   s        r   _fetch_hydro_rawr      sf    \YKs7)	5 ll3rB??c!xxz s   +A	 A	 		AAc                    i }| s|S | j                         D ]X  \  }}i }t        |dd       D ]8  \  }}|t        |t              r	 t	        |      }d|cxk  rdk  s1n 4|||<   : |sT|||<   Z |S # t
        t        f$ r Y Xw xY w)uB   { 'dd.mm.YYYY': {hour: cm} } — реальні см з постаN   2   i  )items	enumerate
isinstanceboolre   	TypeErrorr   )rawr   r{   hoursday_ptshrr   v_ints           r   _clean_hydro_levelsr     s    G		 %u s, 	$GB{jd3C U"d"#	$ $GEN% N z* s   A44BBc                 V   | sy t        | j                         d      D ]s  }| |   }t        |      dk  rt        dt        |            D ]E  }||   }|t	        |t
              r	 t        |      }d|cxk  rdk  s4n 7t        |d      c c S  u y # t        t        f$ r Y \w xY w)NT)reverser   g        g      <@r   )
sortedkeysr]   ranger   r   rc   r   r   r   )r   r{   
hours_dataidxr   fvals         r   _detect_water_temp_from_rawr     s    
D1 *Z
z?b S_- 	*CS/Cz#t'< :D $$ q>)	*	* 	 ":. s   (BB('B(c                     | j                  |i       }|sy||v r||   S d}d}|j                         D ]%  \  }}t        ||z
        }	|	|k  s||	|k  s"||	}}' |S )uX   Точне значення або найближче ±max_gap год (дірки API).N)rW   r   abs)
stationr{   hourmax_gapptsbest	best_disthr   dists
             r   _station_val_nearr   )  s|    
++eR
 Cs{4yDI))+ (31t8}7?	 1TI5E!4)D( K    c                     g }t        | j                         d       D ]=  }t        | |   j                               D ]  }|j                  ||| |   |   f        ? |S )uR   Усі точки поста хронологічно: [(date_str, hour, cm), ...]c                 .    t        j                  | d      S Nr*   r   r,   ds    r   <lambda>z_timeline.<locals>.<lambda><  s    X5F5Fq*5U r   key)r   r   rg   )seriesoutr{   r   s       r   	_timeliner   9  sh    
C+UV 5u**,- 	5AJJq&-"234	55 Jr   c                 p    t        | j                         d       }d }|D ]  }||k(  r |S | |   s|} |S )Nc                 .    t        j                  | d      S r   r   r   s    r   r   z_prev_day_key.<locals>.<lambda>C      x/@/@J/O r   r   )r   r   )r   
date_todaydaysprevr   s        r   _prev_day_keyr   B  sO    &++-%OPDD 
? K !9D	
 Kr   c                 d    t        | |      }|sy | |   t        | |   j                                  S N)r   maxr   )r   r   r   s      r   _prev_day_lastr   M  s3    fj)A!9S)*++r   c                     t        | |      }|syt        | |   j                               }t        |      dk\  r| |   |d      S t	        | |      S )u   База для дельти «останнього вчора»: попередня точка того дня або позавчора.Nr   )r   r   r   r]   r   )r   r   r   r   s       r   _prev_day_step_baser   T  sT    fj)A6!9>>#$E
5zQayr##&!$$r   c                 z    t        |       }|sy|d   \  }}}t        |      dk\  r|d   d   nd}|||||z
  fS dfS )u@   (hour, value, diff_vs_previous_point) або (None, None, None).)NNNr   r   N)r   r]   )r   tl_dr   r   prev_vals         r   _latest_snapshotr   _  sX    	6	BrFMBcGqLr"vaydH(*>sX~HHDHHr   c                 D    | |y| |z
  }|dkD  rd| dS |dk  rd| dS y)NrM   r    (+u    см) (u	    (0 см) )currentpreviousdiffs      r   _fmt_level_diffr   i  sH    (*XDaxTF&!!axD6  r   c                 6    | y| dkD  rd|  dS | dk  rd|  dS y)NrM   r   r   )r   z (0)r   )r   s    r   _fmt_short_diffr   t  s7    |axTF!}axD6|r   c                 J   | j                  |i       }|syt        |j                               }|D cg c]  }|dk  s	||    }}|rt        |      }n||d      }t	        |j                               |z
  }t        | |      }|||d      |z
  nd}	t	        ||	      S c c}w )u+  
    Підйом сьогодні (для каламуті).
    База: мін. ночі 0–6, інакше перша точка сьогодні (коли ніч у пропуску).
    Також враховуємо стрибок першої точки відносно вчора.
    r   r"   )rW   r   r   minr   valuesr   )
r   r   r   r   r   nightbaseintradayr   	overnights
             r   _today_riser   ~  s     **Z
$C388:E"-a1fSV-E-5z58}3::< 4'H&*-D*.*:U1X%Ix## .s
   
B B c                     t        | j                         d       }g }|D ]4  }| |   }|s|j                  |t        |j	                               f       6 || d  S )Nc                 .    t        j                  | d      S r   r   r   s    r   r   z!_daily_max_list.<locals>.<lambda>  r   r   r   )r   r   rg   r   r   )r   last_nr   rq   r{   r   s         r   _daily_max_listr    sa    &++-%OPDD 4UmKKCJJL 1234 >r   c                     t        |       |k  ry| | d }t        dt        |            D ]  }||   d   ||dz
     d   kD  s y y)ur   True, якщо останні min_days днів максимум не зростав (спад або рівно).FNr   T)r]   r   )daily_max_rowsmin_dayschunkis       r   _falling_or_stable_daysr	    s^    
>X%H9:&E1c%j! 8A;q1ua( r   c                 :   | rt        | |      nd}|rt        ||      nd}t        ||      }| r| n|}|rt        |d      ng }t        |t              }	|t
        k\  }
d}|t        k\  rd}d}d}|||fS |	r|dk  rd	}|
rd
nt        }|||fS d}|
rdnt        }|||fS )u   
    Каламуть — якщо Кути АБО Вашківці сьогодні піднялись (≥1 см).
    «Чиста» — лише якщо ≥2 дні спад/стабільність і сьогодні без підйому.
    r   r&   )r  )r  FTu5   Сиди вдома!!

Річка каламутна.u3   Нічна рибалка відміняється.u'   Річка ймовірно чиста.uA   Можна йти з остами на нічну рибалку.uT   Вода ще відстоюється.

Можлива легка каламуть.u2   Нічна рибалка під питанням.)r   r   r  r	  FALLING_DAYS_MINNIGHT_VERDICT_FROM_HOURRISE_ALERT_CMNIGHT_PENDING_TEXT)kutyvashr   
as_of_hourrise_krise_v
today_riseprimarydailysettling_oknight_readyis_muddyclarityr   s                 r   analyze_water_and_nightr    s    
 /3[z*F.2[z*FVV$J dG3:OGB/E)%:JKK 77KH]"KEx''zQ;WbShzx''fGDO@UgEE8##r   c            
      :
  /012 t        j                  d      } t        j                  |       j	                  d       22j
                  dk\  s2j
                  dk  r22j
                  dk\  r2n2t        d      z
  }|j                  d      /n2j                  d      /2j                  d      }2t        d	      z
  j                  d      }i d
t        /      dddddddddddt        ddddddddddddddd dd!dd"dddd#dd$}	 t        t        ||      }t        t        ||      }t        |      }t        |      }t        |      }	|	
t               }	|	
t!               }	|	 d%|d&<   t#        |      \  }
}}t#        |      \  }}}|
|
d'd(| d)t%        |       |d<   ||d'd(| d)t%        |       |d<   |r|n|1|rdnd*|d<   | xr t'        |      }t)        1j+                         d+ ,      }2j                  d      0t-               }g }i }|d-d  }|D ]4  }1j/                  |i       }|rt1        |j3                               nd ||<   6 t5        |      D ]  \  }}||   }|0k(  }|d.kD  r>|<|j/                  ||dz
           }| ||z
  }|d.kD  rd/| d)}n|d.k  rd0| d)}nd1}nd2}nd2}t        |      }||rd3| d4n	|d3| d5nd6}|j/                  |t!        |            } d7| d8| d9| d:|  d;	}!|r|!d<z  }!|j7                  |!        |rd=j9                  |      |d><   /012fd?}"t;        1/      }#t=        1/      }$ |"d.      }% |"d@      }& |"dA      }' |"dB      }(|%K|% d)|d<   t?        dC 1j/                  /i       D              })|)rtA        |%|#      |d!<   ntA        |%|$      |d!<   |&|& d)|d<   tA        |&|%      |d"<   |'|' d)|d<   tA        |'|&|&n|%      |dD<   |(|( d)|d <   tA        |(|'|'n|&      |dE<   |
W| d)|d<   |
d'dF|d<   t%        |      jC                  dG      xs d|d<   |S|d.kD  r
dH| d)|d<   nD|d.k  r	| d)|d<   n6d|d<   n0|.| d)|d<   dI|d'dF|d<   ||d.kD  rdH| d)n|d.k  r| d)nd|d<   tE        ||/2j
                        \  }*}+},|r|* dJ}*|*|d<   |+|d<   |,|d<   |S # tF        $ r7}-tI        dK|-        t               }.|.r|.n	t!                d%|d&<   Y d }-~-|S d }-~-ww xY w)LNr4   )tzinfo   r    r   r   r*   z%Y-%m-%d   r/   levelu   Невідомоchangeu   0 смraw_timer   statusrM   water_claritynight_fishingr  Fsourceu   Кутиkuty_latest   немає данихvash_latesth0u   Очікується...h9h15h20h0_diffh9_diffu   Немає даних)h15_diffh20_diff
history_00
water_temp   °Cr4  rN   u   :00 —     смu   Вашківціc                 .    t        j                  | d      S r   r   r   s    r   r   z get_river_data.<locals>.<lambda>  s    (:K:KAz:Z r   r   ir   u   📈 +u   📉 u   🔹 0 смu   🔹 ---[u    см]*u    см]u
   [— см]u   📅 <b>z</b> | <code>z</code> | <code>u   </code>
(🌡️ u   °C)uB   
<code>* (макс. значення на сьогодні)</code>z

r3  c                 x    k(  rj                   | k  ry t        | d      }||S | dk(  rt              S y )Nr   )r   r   )r   r   r   )target_hourr   r   kyiv_today_strlevelsrR   s     r   
checkpointz"get_river_data.<locals>.checkpoint8  sK    ^+;0F#FJQOC
a%fj99r   r%         c              3   &   K   | ]	  }|d k    yw)r   Nr   ).0r   s     r   	<genexpr>z!get_river_data.<locals>.<genexpr>N  s     !MQ!q&!Ms   r1  r2  z:00z ()+u   Вашківці u7   

Дані з Кутів тимчасово немає.uB   Помилка парсера УкрГідрометцентру: )%rP   rQ   r   rR   r_   r   r   rS   r2   r  r   KUTY_STATION_IDVASH_STATION_IDr   r   r   r   r   r   r   r   r   r   rW   r   r   r   rg   joinr   r   anyr   r^   r  rU   r   )3ri   target_date_dtr   r   
river_dictraw_kraw_vr  r  detected_tempkhkvkdvhvvvduse_vash_onlysorted_daysdb_temperatureshistory_linesday_max_values	hist_daysr{   r   r  val_maxis_todayprev_maxday_diffdiff_str
clean_dateval_textday_templiner=  prev_day_valprev_step_basev0v9v15v20today_has_earlyr  r   r  rm   scraped_tempr   r;  r<  rR   s3                                                  @@@@r   get_river_datarj    s   mmM*G
,,w

'
't
'
4C
xx2~A #BS9!;L5L#,,Z8
\\*-
ll:&Gyb))33J?I&z2# 	( 	E	
 	" 	 	+ 	E 	* 	. 	. 	' 	' 	( 	(  	2!" 	2#$ -/+J0Lg )WE )WE"5)"5)3E: 13M 35M&3_C#8
<  &d+
B%d+
B>+-c((2$eOTVDWCX(YJ}%>+-c((2$eOTVDWCX(YJ}% 4-1z7I
8 /T$ZV[[]0Z[j1 78%	 	GE**UB'C9<C

$5$N5!	G "), 	'HAu$U+G.H1u,)--iA.>?'&1H!|%+H:U#;!A%*8*E#:#0)H%+E2J)0)<!G9G$-4-@'&)l  '**52I%2PQH:,mH:=MhZ X$:T+  ]]  &=	'@ '-{{='AJ|$		 &fj9,VZ@]]nn>"$U|Jt!!M&**Z2L!MMO(7L(I
9%(7N(K
9%>"$U|Jt$3B$;Jy!?#&%uJu%4S"TV%WJz"?#&%uJu%4S#VX%YJz" >%'D,Jw(*3xs^Jz"#22#6#<#<U#C#OxJx ~6-.rd%=Jx(!V.0T<Jx(+3Jx(^%'D,Jw'8C%DJz"~8:Q2$e}UWZ[U[t5\ai
8$#:4zSVS[S[#\  	!Z[G&-
?#&+
?#!)
:   gRSTRUVW,.6BlH_Ha%bbe#f
< gs   N?S 	T#,TTc                 t   | d   }dt        |      v rd| dn|}t        | d         }| j                  dd      }| j                  dt              }| j                  d	d
      }| j                  dd
      }d| d| d| d| d| d| d    d| d    d| d    d| d    d| d    d| d    d| d    d| d    d| dS )Nr4  r5  z<code>z</code>r/   r%  rM   r&  r(  r)  r*  u<   ━━━━━━━━━━━━━━━━
________ | ul    | ________

✨ <b>СТАН ВОДИ ТА ТЕЧІЇ:</b>

<b>Останні дані:</b>
Кути: <code>u    </code>
Вашківці: <code>z	</code>

u+   

🌡️ Температура води: u   

━━━━━━━━━━━━━━━━
📊 <b>РІВЕНЬ (Кути) СЬОГОДНІ:</b>

•  00:00 🌙 — <code>r+  r/  u   
•  09:00 🌤️ — <code>r,  r0  u   
•  15:00 ☀️ — <code>r-  r1  u   
•  20:00 🌙 — <code>r.  r2  u3   

━━━━━━━━━━━━━━━━
u1   
━━━━━━━━━━━━━━━━)r   r2   rW   r  )rivertemp_valtemp_formattedukr_dater  r   	kuty_line	vash_lines           r   format_river_msgrr    s3   \"H38CM3IvhZw/xN!%
"34Hii,GIIo'9:E		-)@AI		-)@AIZ   %+ &##,+[) 44B3C D% &+4[My9I8J K((-d}GE)<L;M N'',U|nGE*<M;N O%%*5\N'%
:K9L M=' ;	<r   c                 p   d\  }}d| d| d}	 ddi}t        j                  ||d      }|j                  d	k7  rt        | |      S |j	                         }|d
   }dddd}	|	j                  | d      }
|
|rdndz   }|t        |d         k\  rt        |
t        |d         dz
        }t        |d   |         }t        t        |d   |   dz              }t        |d   |         ||d   |   |d   |   |d   |d   |rddS ddS # t        $ r$}t        d|        t        | |      cY d}~S d}~ww xY w)ue   РЕАЛЬНА погода для Попельників (Івано-Франківська обл.))g9H@gfffff&9@z0https://api.open-meteo.com/v1/forecast?latitude=z&longitude=z~&hourly=temperature_2m,pressure_msl,weather_code,wind_speed_10m,precipitation_probability&timezone=Europe/Kyiv&forecast_days=2r:   z&Mozilla/5.0 (compatible; RiverBot/1.0)r&   r>   rA   hourlyr%   r   r?  r   r-   eveningr   r   temperature_2mr   weather_codepressure_mslg ?wind_speed_10mprecipitation_probabilityicondescu   Завтраu   Сьогодні)r   pressurewindrain_chancer|  r}  r   u   Помилка Open-Meteo: N)rV   rW   rX   get_weather_fallbackr   r]   r   get_wmo_descriptionre   r   rU   r   )r   r   latlonrn   r?   ro   datart  hour_mapr:  r   wmopressure_mmrm   s                  r   r   r     s   HC
:3%{3%	0	0 >!IJll3<??c!'[AAxxzh ;ll;2;RA6#f-.//k3v.>'?#@1#DEC!&"8"=>%~ 6s ;h FGH&!12378#+,S1!"=>sCKK&1N
 	
 8J
 	
  >+A3/0#K==>s*   6D B<D D 	D5D0*D50D5c           	      F   |r0t        j                         t        d      z   j                  d      n"t        j                         j                  d      }dddddd	d
ddddddd
ddddddd
d}|j	                  | |d         }||d   |d   |d   |d   d|d   |d   d S )!u,   Фолбек, якщо API не працюєr   r  r*   16u   🌅u   свіжо, ясноz1.910  )r   r|  r}  r  r  r~  24   ⛅   малохмарноz3.020i  19   🌤️   ясноz1.815i  ru  r   r   r|  r}  r  r   r  r~  )r   r   r|  r}  r  cloudr  r~  )r   rR   r   rS   rW   )r   r   target_datepresetsps        r   r  r    s    OZ8<<>I1$55??
K`h`l`l`n`w`w  yC  aDK &:PZ_pt  CF  G %9OY^os  BE  F )ZQVgky|}G
 	K!34A&	&	&	&	'jM	 	r   c                     ddddddddddd	dd
ddddddddddddddddddddd}|j                  | dd	d      S )uH   Перетворює WMO код у зрозумілий опис + emojiu   ☀️r  )r|  r}  r  u   переважно ясноr  r  u   ☁️u   хмарноu   🌫️u
   туманu   🌧️u   легка мрякаu   🌦️u   невеликий дощ   дощu   ❄️u   снігu   ⛈️
   злива
   гроза)r   r   r   r   -   3   =   ?   G   P   _   )rW   )coder  s     r   r  r    s     z2(EF$:;~65(?@(CD1z2|4|4C 774(NCDDr   c                    %&'( ddl }| r| d   n|j                  di       }t        |       dkD  r| d   n|j                  d      }|j                  dd      }dd	d
d}|j                  |d      }	 t        |j                  dd            }|j                  dd      j	                         (t        (fddD              }	t        j                         }
|
j                  |
j                  |
j                  }}}|dk  r
|dz  }|dz  }d|dz  z  dz   dz  }|dv r|dz  }n|dv r|dz  }n	|dv r|dz  }||z   dz  }t        (fddD              }	|	rdnd}|	rdnd}|dv rd n|d!v rdnd"}d#|cxk  rd$k  rn nd}n d%|cxk  rd#k  sn d$|cxk  rd&k  rn nd"}nd'}|d(k(  rd)nd}d}d}d*}|r|j                  d+d      nd}|r#	 |j                  d,d-      } |j                  d.dt        |            }|rt        |      nd*}|j                  d/d      &|j                  d0d      't        &'fd1d2D              rd3}|j                  d4      sd5|j	                         v sd6|v rd7}nd8|v sd9|v rd:}n
d;|v sd<|v rd=}t        j                         j                  }d>|cxk  rd?k  rn n
|d(k(  r|d@z  }|j                  d4      sd5|j	                         v sd6|v rdA}n
d8|v sdB|v rdC}|dDk\  rd3}n|dEk\  rd@}n
|dFk\  rd)}ndG}dHdIdJdKdLdMdNdKdOdMdPdKdQdRdSdKg}g }dT}|r2|j                  dUd      %t        %fdVt        dd>      D              rdW}|D ]m  }|dX   dHk(  r|dCk  r|rdY} nd)} n|} t        |dZ   |z  |z  |z  |z  | z  |z  |z        }!t        d[t!        d\|!            }!|j#                  |dX   |d]   |!d^       o |dFk\  rd_nd`}"dadMdNdKdbdRdSdKdcdMdddKdedIdJdKdfdgdhdKg}#g }$|#D ]P  }t        |dZ   |z  |z  |"z  |z  |z        }!t        d?t!        d\|!            }!|$j#                  |dX   |d]   |!d^       R |j%                  di dWj       |$j%                  dk dWj       ||||$|dlS #  d}d(Y xY w#  d*}Y |xY w)mu   
    Покращений реалістичний прогноз кльову з урахуванням стану річки.
    r   Nweather_datar   rI  r   r      🌅 РАНОКu   ☀️ ОБІДu   🌌 ВЕЧІРru  r~  r  r}  rM   c              3   &   K   | ]  }|v  
 y wr   r   rA  wordweather_descs     r   rB  z'get_fishing_forecast.<locals>.<genexpr>       iD4<'i   )r  r  u
   мрякаr  r   r(   r'      r   )r    r!   )r"   r#   r$   r   )r%   r&   r'   r(   c              3   &   K   | ]  }|v  
 y wr   r   r  s     r   rB  z'get_fishing_forecast.<locals>.<genexpr>  r  r  g      ?g      ?g?)r   r   r   r   r>           gffffff?)r"   r#   r$   r%         r  g333333?i  i  i  i  g?r-   g?g      0@r%  r4  r  rL   r1  r0  c              3   .   K   | ]  }|v xs   y wr   r   )rA  xr1  r0  s     r   rB  z'get_fishing_forecast.<locals>.<genexpr>9  s     QAqH}''Q   )u   📈rC  u   зростаєg      ?r     каламутна   КАЛАМУТЬg333333?u   відстоюєтьсяu   легка каламутьg?u   ймовірно чистаu
   ЧИСТАg?r"   r$   g333333?g?u   нестабільнаg?g      7@g      4@g      1@g?u   Маренаu   🐡D   )nameemojir   u   Головеньu   🐟H   u   Підуст>   u
   Окуньu   🐠N   Fr"  c              3   .   K   | ]  }d | dv   yw)rC  r6  Nr   )rA  r  	diff_texts     r   rB  z'get_fishing_forecast.<locals>.<genexpr>k  s     >Q1#U|y(>r  Tr  g      ?r   r!   r  r  )r  r  pctgffffff?gffffff?u
   Коропu   Карасьu   ЩукаC   u   Білий амурu   Товстолобu   🐋r  c                     | d   S Nr  r   r  s    r   r   z&get_fishing_forecast.<locals>.<lambda>  s
    ah r   )r   r   c                     | d   S r  r   r  s    r   r   z&get_fishing_forecast.<locals>.<lambda>  s
    QuX r   )r~  	time_name
river_fish	pond_fishr4  )ra   rW   r]   re   lowerrG  r   rR   rf   r.   r-   rb   r   rc   r   r   r   rg   sort))argskwargsra   r  rI  r   
time_namesr  r~  has_rainrR   rf   r.   r-   epactmoon_agerain_mod_riverrain_mod_pondmoon_factorpressure_factortime_factorriver_level_factorturbidity_factorr4  clarity_texttemp_str	cleaned_triver_temp_factorriver_fish_baseriver_forecastis_slight_risefishmodr  pond_temp_factorpond_fish_basepond_forecastr  r1  r0  r  s)                                        @@@@r   get_fishing_forecastr    s     #47

>2(FLIMavzz,/GJ**]I6K.7HUfgJ{,=>I|''
C89#''399;
 i4hiiH ,,.CxxCGG%Dqy	4"9"b(E
	)	UaZU	/	!5A:5r!H i4hiiH &T3N$D#M "%;;#!%77#T  h#		3	#"7C"7 %-#3K J:D:>>/26"L	!~~lD9Hy"c(m<I-6y)DJ
 >>*b1..B/Q1PQQ!% >>*%)=ASASAU)UYko{Y{#'<7;X\h;h#*l:ll>Z" $$??{e3		 >>*%)=ASASAU)UYko{Y{#'<7;SWc;c" T 	t		t	   &"=#fbA&"=;	O N NNN8R0	>%1+>>!N Z<>)3&> #C $v,0;>ASSVggjmmp~~  BM  M  N!SS\"tF|d7mTWXY!Z&  *T1tt ;&"=fb9&D%CN M Y$v,0;>AQQTaadoop!SS\"d6lT']SVWX	Y .=-t< $"  uh	Js   1;Q) >Q5 )Q25Q<c           	         | j                  dg       }| j                  dg       }d| j                  dd       d}t        |j                  d            }|j                  dd	      }|sd
|j                         v sd|v rd}|dz  }|r|dz  }n|D ]  }|d|d    d|d    d|d    dz  } |dz  }|D ]  }|d|d    d|d    d|d    dz  } |d| j                  dd       dz  }|r|dz  }|S |dz  }|S )Nr  r  u   ━━━━━━━━━━━━━━━━
🎣 <b>ПРОГНОЗ КЛЬОВУ РИБИ</b> 🎣
━━━━━━━━━━━━━━━━

<b>АКТИВНІСТЬ РИБИ:  <u><b>r  r  z</b></u></b>

r  r%  rM   r  r  Tu*   <b>Річка Черемош:</b> 🏞️
u@   ⛔ <b>Сиди вдома!!</b>
Річка каламутна!
u   • r  r+   r  u    — <b>r  z%</b>
u   
<b>Ставки:</b> 🏡
u4   
🎈 <b>Атмосферний тиск:</b> <code>r~  r  u    мм рт.ст.</code>
ui   
На річку сьогодні сенсу немає.
━━━━━━━━━━━━━━━━uX   
🎣 Вдалої РИБАЛКИ! 🎣
━━━━━━━━━━━━━━━━)rW   r   r  )r  rI  r  r  msgr  r  fs           r   format_fishing_msgr    s   ,+Jb)I4 59HH[J[4\3]]m	o  JNN:./Hnn_b1G-@DVZaDa88CSS 	LAT!G*Qqyk!E(7KKC	L **C Haj\1V9+XahZwGGH 
?UX@Y?ZZstC ?	
 J	 	?	
 Jr   c                     d| d| d    d| d    d| d    d| d	    d
| d    d|d    d|d    d|d    d|d   j                          d|d	    d|d    dS )Nu   ━━━━━━━━━━━━━━━━
<b>Погода | ПОПЕЛЬНИКИ 🏡 </b>

━━━━━━━━━━━━━━━━

⏱️ <b>Період:</b> <u><b>u7   </b></u>

🌡️ <b>Температура:</b> <code>r   u!   °C</code>
📝 <b>Небо:</b> r|  z <i>r}  u#   </i>
💨 <b>Вітер:</b> <code>r  u,    м/с</code>
💧 <b>Опади:</b> <code>r  ue   %</code>

━━━━━━━━━━━━━━━━
🔮 <b>ПРОГНОЗ НА ЗАВТРА (r   u)   ):</b>

🌡️ <b>Вдень:</b> <code>u   °C</code> u	   
📝 <i>u.    м/с</code> | 💦 <b>Опади:</b> <code>u9   %</code>
━━━━━━━━━━━━━━━━)
capitalize)weatherweather_tomorrow
time_labels      r   format_weather_msgr    s    - .8L 988?7H I!!( 1gfo5F G))0(9 :))0)?(@ A55Ef5M4N O,,<V,D+E[QabhQiPj k#F+6689 :))9&)A(BBp  rB  CP  rQ  qR R;	<r   r   )r   )r&   )r   F)2osra   r   rV   bs4r   r   r   rP   pathrF  dirname__file__r	   r   r   r2   r   r   r   rD  rE  r  r  r  r  r   r   r   r   r   r   r   r   r   r   r   r   r   r  r	  r  rj  rr  r   r  r  r  r  r  r   r   r   <module>r     s;   	 	    (  '',,rwwx02D
E
 	 Hh8HxX8 RjHX(  Y  =(W*& ,%I$, 6F $@sl<%>N(E(qf*Xr   