
    eO9                     b   d dl mZmZ d dlZd dlZd dlZd dlmZ d dl	Z	d dl
Z
d dlmZ d dlmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZmZ d d	lmZ e G d
 d                      Ze G d de                      Ze G d de                      Ze G d de                      Z e G d d                      Z!d Z" G d d          Z#e G d d                      Z$ G d de          Z%e G d d                      Z&e G d d                      Z'e G d d                       Z(e G d! d"                      Z)e G d# d$                      Z*e G d% d&                      Z+e G d' d(                      Z,e G d) d*                      Z-e G d+ d,                      Z.dS )-    )	dataclassfieldN)Enum)time)DictListOptional
NamedTupleUnionLiteral)Path)wcswidth)loaddump)colorizec                   8    e Zd ZU dZeed<   eed<   eed<   d ZdS )Locationz
    Generic location
    namelatitude	longitudec                     | j         S N)r   selfs    5/home/salvo/dev/vasttrafik-cli/vasttrafik/__init__.py__str__zLocation.__str__,   s
    y    N)__name__
__module____qualname____doc__str__annotations__floatr    r   r   r   r   #   sO           IIIOOO    r   r   c                   4    e Zd ZU dZed         ed<   eed<   dS )Stopz5
    The object represents a stop or a position.
    )stopareametastation	stoppointlocationTypegidN)r   r   r    r!   r   r#   r"   r%   r   r   r'   r'   0   s7           @AAAA	HHHHHr   r'   c                   &    e Zd ZU ed         ed<   dS )PointOfInterestpointofinterestr+   Nr   r   r    r   r#   r%   r   r   r.   r.   8   s$         +,,,,,,r   r.   c                   &    e Zd ZU ed         ed<   dS )Addressaddressr+   Nr0   r%   r   r   r2   r2   <   s#         )$$$$$$r   r2   c                   0    e Zd ZU eed<   eed<   defdZdS )Token
expires_inaccess_tokenreturnc                 0    | j         t                      k     S r   )r6   r   r   s    r   expiredzToken.expiredF   s    ''r   N)r   r   r    intr#   r"   boolr:   r%   r   r   r5   r5   A   sF         OOO( ( ( ( ( ( (r   r5   c                 l    	 t          | |          S #  t          d           t          |             xY w)NzFAILED TO PARSE DATA)r   print)datatype_s     r   _reportloadrA   J   s=    D%   $%%%ds    !3c                      e Zd ZdededdfdZdefdZdefdZded	e	eef         fd
Z
dedeeez  ez           fdZddededz  dedej        dz  ded         f
dZdededed         dej        dz  ded         f
dZdS )
Vasttrafikkey	tokenfiler8   Nc                 0    || _         || _        d| _        dS )z
        key is the API key that must be sent on every request to obtain a reply.
        you can obtain one at api.vasttrafik.se, but it will be activated the
        night after registration.
        N)rD   
_tokenfile_token)r   rD   rE   s      r   __init__zVasttrafik.__init__U   s     #'+r   c                 L   | j         w| j                                        r^| j                            d          5 }t	          t          j        |          t                    | _         d d d            n# 1 swxY w Y   | j         r | j                                         rd | _         | j         r|                                 | _         | j                            d          5 }t          j	        t          | j                   |           d d d            n# 1 swxY w Y   | j         S )Nrtwt)
rH   rG   existsopenr   jsonr5   r:   _renew_tokenr   )r   fs     r   
_get_tokenzVasttrafik._get_token_   sm   ;4?#9#9#;#;%%d++ 8q"49Q<<778 8 8 8 8 8 8 8 8 8 8 8 8 8 8 ; 	4;..00 	DK;++--DK%%d++ 0q	$t{++Q///0 0 0 0 0 0 0 0 0 0 0 0 0 0 0{s#   -A44A8;A8 (DDDc                    d}t           j                            |          }d|_        d| j        z   |j        d<   t           j                            |          5 }t          t          j        |          t                    }d d d            n# 1 swxY w Y   |xj
        t          t                                z  c_
        |S )Nz#https://ext-api.vasttrafik.se/tokens   grant_type=client_credentialszBasic Authorization)urllibrequestRequestr?   rD   headersurlopenr   rO   r5   r6   r;   r   )r   urlreqrQ   rs        r   rP   zVasttrafik._renew_tokenp   s    3n$$S))3'/$(':O$^##C(( 	*ATYq\\5))A	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	*	DFF#s   (BBBserviceparamsc                 v   |                                  j        }d| dt          j                            |           }t          j                            |          }d|z   |j        d<   d|j        d<   d}t          j                            |          5 }	 |	                                }t          |          d	k    rn||z  }.	 d d d            n# 1 swxY w Y   |                                                    d
          rt          d          t          j        |                    d                    S )Nz$https://ext-api.vasttrafik.se/pr/v4/?zBearer rT   z
text/plainacceptr   Tr   s   Invalid authKeyzInvalid authKeyutf8)rR   r7   rU   parse	urlencoderV   rW   rX   rY   readlenstrip
startswith	ExceptionrO   loadsdecode)	r   r]   r^   tokenrZ   r[   r\   rQ   ls	            r   _requestzVasttrafik._requestz   s\   !!._W__v|?U?UV\?]?]__n$$S))'05'8O$ ,H^##C(( 	AFFHHq66Q;;Q	 		 	 	 	 	 	 	 	 	 	 	 	 	 	 	 7799 233 	/-...z!((6**+++s   0CCC
user_inputc                     |                      d|dd          }t          |d         t          t          t          z  t
          z                     S )z>Returns a list of Stop objects, completing from the user inputzlocations/by-text10)qlimitresults)rn   rA   listr'   r.   r2   )r   ro   as      r   locationzVasttrafik.location   sA    MM-Z/N/NOO1Y<d_.Dw.N)OPPPr      stop	time_span
departuresdatetime_objGroupedBoardItemc                 d   i }t          |          |d<   d|d<   |r|                                |d<   |rt          |          |d<   |                     d|j         d|          }t	          |d         t
          t                             }d	 |D             }t                              |          S )
z-Returns a departure board for a given station maxDeparturesPerLineAndDirection30rs   startDateTimetimeSpanInMinuteszstop-areas/z/departuresrt   c                      g | ]}|j         	|S r%   )	cancelled.0is     r   
<listcomp>z$Vasttrafik.board.<locals>.<listcomp>   s    ???A1;?a???r   )	r"   	isoformatrn   r,   r   r   	BoardItemr}   group)r   ry   rz   r{   r|   r^   b
boarditemss           r   boardzVasttrafik.board   s     "$58__12w 	?&2&<&<&>&>F?# 	9*-i..F&'MM====vFF!I,Y88
 @????
%%j111r   origindestdatetime_relates)arrival	departureTripc                    i }d|d<   d|d<   d|d<   d|d<   t          |d          r|j        |d<   n.t          |j                  |d	<   t          |j                  |d
<   t          |d          r|j        |d<   n.t          |j                  |d<   t          |j                  |d<   |r||d<   |                                |d<   |                     d|          }t          |d         t          t                             }d |D             S )Nrq   rs   falseonlyDirectConnectionsincludeNearbyStopAreasincludeOccupancyr,   	originGidoriginLatitudeoriginLongitudedestinationGiddestinationLatitudedestinationLongitudedateTimeRelatesTodateTimejourneysrt   c                 .    g | ]}|j         	|j        |S r%   )r   allLegsr   s     r   r   z#Vasttrafik.trip.<locals>.<listcomp>   s&    BBBaB	BBBBr   )
hasattrr,   r"   r   r   r   rn   rA   ru   r   )r   r   r   r   r|   r^   r   tripss           r   tripzVasttrafik.trip   s8    w*1&'+2'(%,!"65!! 	>"(*F;'*6?';';F#$(+F,<(=(=F$%4 	A'+xF#$$,/,>,>F()-0-@-@F)* 	:*:F&'!-!7!7!9!9F: MM*f--AiL$t*55 CB5BBBBr   )Nrx   N)r   r   r    r"   r   rI   r5   rR   rP   dictrn   ru   r'   r.   r2   rw   r;   datetimer   r   r   r   r   r%   r   r   rC   rC   S   s       ,C ,D ,T , , , ,E    "e    , ,T#s(^ , , , ,(Q3 Q40F0P+Q Q Q Q Q2 2$ 2#d( 2C 2YaYjmqYq 2{  AS  |T 2 2 2 2,#C#C #C &&<=	#C
 #+d2#C 
f#C #C #C #C #C #Cr   rC   c                   @    e Zd ZU eed<   ed         ed<   eed<   d ZdS )Notetype)unknownlownormalhighseveritytextc                     | j         dk    rt          | j        d          S | j         dk    rt          | j        d          S | j        S )Nr      )ansir      )r   r   r   r   s    r   toTermzNote.toTerm   sN    =F""DIA....=H$$DIA....yr   N)r   r   r    r"   r#   r   r   r%   r   r   r   r      sI         
III89999
III    r   r   c                   R    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
Zedefd            ZdS )VehicleTypetrambustrainferrytaxiwalkr   nonebikecarr8   c                     | j         d| j        d| j        d| j        d| j        d| j        d| j        d| j        d| j        d| j	        d	i
}||          S )
Nu   🚅u   🚋u   🚌u   ⛴u   🚕u   🚶‍♂️ u   🚴u   🚗)
TRAINTRAMBUSFERRYTAXIWALKUNKNOWNNONEBIKECAR)r   ss     r   symbolzVehicleType.symbol   s\     JIvHfJIvIL"IrIvHf
 wr   N)r   r   r    r   r   r   r   r   r   r   r   r   r   propertyr"   r   r%   r   r   r   r      sk        D
CEEDDGDD
C    X  r   r   c                   L    e Zd ZU eed<   eed<   eed<   eed<   eed<   eed<   dS )Liner   	shortNamebackgroundColorforegroundColorborderColortransportModeN)r   r   r    r"   r#   r   r%   r   r   r   r      sT         
IIINNNr   r   c                   $    e Zd ZU eed<   eed<   dS )Journey	directionlineN)r   r   r    r"   r#   r   r%   r   r   r   r     s"         NNN
JJJJJr   r   c                   2    e Zd ZU eed<   eed<   dZeed<   dS )	StopPointr   r,   r   platformN)r   r   r    r"   r#   r   r%   r   r   r   r   	  s4         
III	HHHHcr   r   c                   n    e Zd ZU dZej        ed<   eed<   eed<   eed<   eed<   dZ	ej        dz  ed<   dS )	r   zm
    This represents one item of the panel at a stop
    has a bunch of attributes to represent the stop
    plannedTimeisCancelledisPartCancelledserviceJourney	stopPointNestimatedTime)
r   r   r    r!   r   r#   r<   r   r   r   r%   r   r   r   r     su           """".2M8$t+22222r   r   c                       e Zd ZU ee         ed<   edee         ded          fd            Zede	fd            Z
d Zdde	fdZdeeee	f                  fd	ZddZdS )r}   r   itemsr8   c                 p   |                      d            t          |                     d          g          g}| D ]w}d}|D ]K}|j        d         }|j        |j        k    r,|j        |j        k    rd}|j                            |           L|s#|                    t          |g                     x|S )Nc                     | j         j        S r   )r   r   r   s    r   <lambda>z(GroupedBoardItem.group.<locals>.<lambda>&  s    !5 r   rD   r   FT)sortr}   popr   r   r   append)r   r\   r   addedr   	firstitems         r   r   zGroupedBoardItem.group"  s     	

55
666uyy||n--. 
	0 
	0AE / /!,Q/	;)"555!:JiNf:f:f E$++A... 0)1#..///r   c                 0    | j         d         j        j        S )Nr   )r   r   r   r   s    r   trackzGroupedBoardItem.track8  s    q!+44r   c                 .    |                      d          S )NF)colorr   r   s    r   toTxtzGroupedBoardItem.toTxt<  s    {{{'''r   Tc                    |                      |          }|                                 }d|d|d         d         |d         d         | j        d         j        j        d                    t          d |                    fz  S )a   Returns a string representing the BoardItem colorized using
        terminal escape codes.

        Servertime must be retrieved from the Vasttrafik class, and indicates
        the time on the server, it will be used to show the difference in
        minutes before the arrival.
        z%s %0*d%s -> %s # %srx   r   r   ,c                 >    t          | d                   | d         z   S )Nr   r   )r"   r   s    r   r   z)GroupedBoardItem.toTerm.<locals>.<lambda>I  sJ      PS  TU  VW  TX  PY  PY  \]  ^_  \`  P` r   )getNamer{   r   r   r   joinmap)r   r   r   deltas       r   r   zGroupedBoardItem.toTerm?  s     ll5!!!!%aq!eAhqk4?[\K]KlKvx{  yA  yA  BE  F`  F`  bg  Bh  Bh  yi  yi  )j  j  	jr   c                 P    d | j         D             }|                                 |S )Nc                     g | ]Y}|j         r|j         n|j        t          j                            t          j        j                  z
  j        d z  |j        rdndfZS )<      👻r   )r   r   r   nowtimezoneutcsecondsr   r   s     r   r   z/GroupedBoardItem.departures.<locals>.<listcomp>L  s      M  M  M  xyJQ__Q]hN_NcNcdldudyNzNzz  D  HJ  J  XY  Xi  Nq  NT  NT  oq  s  M  M  Mr   )r   r   )r   r   s     r   r{   zGroupedBoardItem.departuresK  sB     M  M  }A  }L  M  M  M

r   Fc                    | j         d         j        j        j        dz   }|| j         d         j        j        j        j        z  }t          |          dk     rd|z   }t          |          dk     |s|S t          d| j         d         j        j        j        dd         z   d          }t          d| j         d         j        j        j	        dd         z   d          }t          |||          S )	zReturns a nice version of the name
        If color is true, then 256-color escapes will be
        added to give the name the color of the liner       0xr   N   bg)r   r   r   r   r   r   ulenr;   r   r   r   )r   r   r   fgcolorbgcolors        r   r   zGroupedBoardItem.getNameP  s     q!05?#E"16DKK4jj2oo:D 4jj2oo  	KdT_Q/>CSTUTVTVWWY[\\dT_Q/>CSTUTVTVWWY[\\g'2222r   N)T)F)r   r   r    ru   r   r#   staticmethodr   r   r"   r   r   r   r   tupler;   r{   r   r%   r   r   r}   r}     s         YT)_ .@)A    \* 5s 5 5 5 X5( ( (
j 
jC 
j 
j 
j 
jDsCx1    
3 3 3 3 3 3r   r}   c                       e Zd ZU eed<   dS )LegHalfr   N)r   r   r    r   r#   r%   r   r   r  r  c  s         r   r  c                       e Zd ZU eed<   eed<   eed<   ej        ed<   ej        ed<   eed<   dZej        dz  ed<   dZ	ej        dz  ed	<   dZ
edz  ed
<   edefd            ZdefdZdS )ConnectionLegr   destinationr   plannedDepartureTimeplannedArrivalTimeplannedDurationInMinutesNestimatedDepartureTimeestimatedArrivalTimeestimatedDurationInMinutesr8   c                     t          | j        j        d          o=t          | j        j        d          o#| j        j        j        | j        j        j        k    S )Nr,   )r   r   r   r  r   r   s    r   hiddenzConnectionLeg.hiddeny  sl    t{,e44  fAQA[]b9c9c  fhlhsh}  iC  GK  GW  Ga  Gf  if  	fr   c           	         t          | j        r| j        n| j                                                  d d         }t          | j        r| j        n| j                                                  d d         }d| j        j        z   }t          |          dk     rd|z   }t          |          dk     | d| d| d| j	        j
        j         d| j        j
        j         	}|S )N   zgo !   r	  	 -> )r"   r  r  r   r  r  r   r   r  r   r   r   r  )r   r   r   r   r\   s        r   r   zConnectionLeg.toTerm}  s    8Sr44Y]Yrxxzz{{|~}~|~	D4Mjt00SWSjpprrsstvuvtvwt)004jj2oo:D 4jj2oo ooioo7oodk.C.HoodN^NhNmoor   )r   r   r    r  r#   r   r   r;   r  r  r  r   r<   r   r"   r   r%   r   r   r  r  m  s         OOO"++++ ))))!!!!7;H-4;;;59(+d2999-1d
111f f f f Xf	 	 	 	 	 	 	r   r  c                   &   e Zd ZU eed<   eed<   eed<   eed<   eed<   ej        ed<   ej        ed<   eed<   d	Z	ej        d	z  ed
<   d	Z
ej        d	z  ed<   d	Zed	z  ed<    e            Zeedf         ed<   edefd            ZdefdZdefdZd	S )Legr   r  r   r   r   r  r  r  Nr  r  r  .notesr8   c                     dS )NFr%   r   s    r   r   z
Leg.hidden  s    ur   c           	         |                                  }t          | j        r| j        n| j                                                  d d         }t          | j        r| j        n| j                                                  d d         }| d| d| d| j        j        j	         d| j
        j        j	         	}| j        r*|dd                    d | j        D                       z   z  }|S )Nr"  r	  r$  r%  
c              3   >   K   | ]}|                                 V  d S r   r   r   s     r   	<genexpr>zLeg.toTerm.<locals>.<genexpr>  s*      !A!A!((**!A!A!A!A!A!Ar   )r   r"   r  r  r   r  r  r   r   r   r  r(  r   )r   r   r   r   r\   s        r   r   z
Leg.toTerm  s    ||~~8Sr44Y]Yrxxzz{{|~}~|~	D4Mjt00SWSjpprrsstvuvtvwooioo7oodk.C.HoodN^NhNmoo: 	B		!A!Adj!A!A!AAAAAAr   c                    | j         j        j        dz   }|| j         j        dz   z  }| j        rd|z   }t          |          dk    r|d d         dz   }|| j         j        j        j        z  }t          |          dk     rd|z   }t          |          dk     t          d| j         j        j
        dd          z   d          }t          d| j         j        j        dd          z   d          }t          |||          S )	Nr	  r     r#  r  r   r  r  )r   r   r   r   r   rf   r   r   r  r;   r   r   r   )r   r   r  r  s       r   r   zLeg.getName  s    "'1C7#-33 	!D=Dt99r>>9s?D#(6==4jj2oo:D 4jj2oo dT05EabbII2NNdT05EabbII2NNg'2222r   )r   r   r    r  r#   r   r<   r   r;   r  r  r  r  r(  r   r   r   r"   r   r   r%   r   r   r'  r'    s:        OOO"++++ ))))!!!!7;H-4;;;59(+d2999-1d
111#eggE5s%%%    X    3 3 3 3 3 3 3r   r'  c                       e Zd ZU  ee          Zee         ed<   dZe	ed<    ee          Z
ee         ed<   ede	fd            Zedeeez           fd            Zdefd	Zedefd
            ZdS )r   )default_factorytripLegsF
isDepartedconnectionLinksr8   c                 .    | j         D ]}|j        r dS dS )NTF)r2  r   )r   r   s     r   r   zTrip.cancelled  s.     	 	A} ttur   c                 R    | j         | j        z   }|                    d            |S )Nc                     | j         S r   )r  r   s    r   r   zTrip.allLegs.<locals>.<lambda>  s	    Q3 r   r   )r2  r4  r   )r   r\   s     r   r   zTrip.allLegs  s.    '+}t7K'K	33444r   c                 J    d                     d | j        D                       S )Nr+  c              3   T   K   | ]#}|j         d k    |                                V  $dS )FN)r   r   r   s     r   r-  zTrip.toTerm.<locals>.<genexpr>  s6      OOQX=N=N=N=N=N=NOOr   )r   r   r   s    r   r   zTrip.toTerm  s%    yyOOT\OOOOOOr   c                 
   | j         sdS | j         d         j        r| j         d         j        n| j         d         j        }| j         d         j        r| j         d         j        n| j         d         j        }||z
  }|j        dz  S )Nr   r  )r2  r  r  r  r  r  )r   startendr   s       r   durationzTrip.duration  s    } 	1;?=;K;b  Na 77hlhuvwhx  iN8<b8I8^  IdmB44dhdqrtdu  eIe}""r   N)r   r   r    r   ru   r2  r'  r#   r3  r<   r4  r  r   r   r   r"   r   r;   r>  r%   r   r   r   r     s        %555Hd3i555J+05+F+F+FOT-(FFF4    X cM12    X
P P P P P ## # # # X# # #r   r   )/dataclassesr   r   urllib.requestrU   urllib.parser   enumr   rO   rer   typingr   r   r	   r
   r   r   pathlibr   wcwidthr   r  	typedloadr   r   
xtermcolorr   r   r'   r.   r2   r5   rA   rC   r   r   r   r   r   r   r}   r  r  r'  r   r%   r   r   <module>rI     s  & ) ( ( ( ( ( ( (                 				       C C C C C C C C C C C C C C C C       $ $ $ $ $ $                       	 	 	 	 	 	 	 	     8    - - - - -h - - - % % % % %h % % % ( ( ( ( ( ( ( (  zC zC zC zC zC zC zC zCz 
 
 
 
 
 
 
 
    $   :                         3 3 3 3 3 3 3 3 A3 A3 A3 A3 A3 A3 A3 A3H                4 -3 -3 -3 -3 -3 -3 -3 -3` # # # # # # # # # #r   