
    g]                         d dl mZ d dlmZ d dlmZ d dl mZ d dlmZ d dl	m	Z	m
Z
 d dlmZ d dlZ ed	
      dedefd       Zd Zd Zd Zd Zd Zd Zd Zd Zy)    )defaultdict)JSONResponse)HTTPException)Counter)DefaultDict)datetime	timedelta)	lru_cacheN   )maxsizedurationreturnc                    t        j                         }t        j                  d| j	                               }|st        d      t        |j                  d            |j                  d      }}t        d      t        d      t        d      t        d      d	}||||   z  z
  }|j                  d
      |j                  d
      fS )a  
    Calculates the start and end date based on the duration provided.
    Duration format: <integer><unit>, where unit can be:
    D - days, W - weeks, M - months (approx. 30 days), Y - years (365 days).

    :param duration: A string representing the time duration (e.g., '5D', '2W', '3M', '1Y').
    :return: A tuple of strings representing the start and end dates in '%d-%m-%Y' format.
    :raises ValueError: If the duration format is invalid.
    z^(\d+)([DWMY])$zCInvalid duration format. Use format like '5D', '2W', '3M', or '1Y'.      )days)weeks   im  )DWMY%d-%m-%Y)
r   todayrematchupper
ValueErrorintgroupr	   strftime)r   r   r   numberunitunit_mappingstart_dts          9/var/www/html/trade_iq/helper_functions/report_details.pycalculate_date_range_rdr'   
   s     NNE HH')9:E^__ u{{1~&ADF AQBC 	L d!334HZ(%..*DDD    c                     | d   }| d   }| d   }| d   }| d   | d   | d   | d   | d   | d   | d   ||z
  ||z
  ||z
  |dk7  r||z
  |z  d	z  nd|dk7  r||z
  |z  d	z  nd|dk7  r||z
  |z  d	z  ndd
}|S )Nhighlowclose
prev_closesymboldateopenr   d   )r.   r/   r-   r0   r*   r+   r,   close_minus_prev_closehigh_minus_lowhigh_minus_prev_closehigh_minus_prev_close_perchigh_minus_low_percclose_minus_prev_close_perc )docr*   r+   r,   r-   processed_docs         r&   calculate_report_values_rdr;   +   s    v;D
e*CLE\"J h-F,'FF5zW"'*"4*!%
!2PZ^_P_tj'8J&F&Lef<@AIs
d2S81R\`aRa
(:j'H3'NghM  r(   c                 b   t        |      rdddddddfd}i }t        | j                               D ]v  \  }\  }}|d	   }|d
   }|g d||<   t        ||         }	g }
|	d   D ]  }|
j	                  t        |              |D ]#  } |||
      s||   d
   j	                  |       % x S )Nr4   r3   r2   r5   r6   r7   012435c                 n   g }|D ]  }j                  |d         }t        |d         }|j                  dd      }|s:d}|d   dk(  r	| |   |kD  }n!|d   dk(  r	| |   |k  }n|d   d	k(  r| |   |k(  }|j                  |       |dk(  rt        |      s y|d
k(  st	        |      s y t        |      S )Nfiltervalueoperatorr   F	conditiongreaterlessequalr   T)getfloatappendallany)	item
conditionsresultsfiltkeyrF   rG   condition_met
filter_maps	           r&   matchesz#filter_response_rd.<locals>.matchesP   s    G"   nnT(^4d7m,88J2 %$	1$(I$5M+&&0$(I$5M+&'1$(I$6M}- q=W ]s7|+ , w<r(   
date_rangedatarY   rZ   rR   )len	enumerateitemsdictrN   )rZ   rH   rX   filtered_dataduration_idxr   contentrY   grouped_datacondition_setconditions_datacondsymbol_datarW   s                @r&   filter_response_rdrh   C   s    
9~ )!)-&.

	 6 1:4::<1H 	H-L-8W .J"6?L('M(# !<!89M O%l3 3&&tDz23  , H;8!(+F3::;GH	H& r(   c                 	  K   	 | j                   r;| j                  r| j                  s#t        | j                         \  | _        | _        ni| j                  rN| j                  rB	 t	        j
                  | j                  d       t	        j
                  | j                  d       nt        ddid      S | j                  rdd| j                  j                          iid	d
ddddiddddddiidd| j                  iigiddddiidd| j                  iigigidididdid	dddddd
giiddiddiddidd id!ig}|j                  |d"#      }g }|2 3 d {   }t        |$      }|j                  |       'di | j                  r| j                  d'k7  rd(| j                  ini id	d
ddddiddddddiidd| j                  iigiddddiidd| j                  iigigidididdid	dddddd
giiddiddiddidd id!ig}|j                  |d"#      }t        d)       }|2 3 d {   }|d   }|d*   }	|d+   }
|d,   }|d-   }||z
  }|	|
z
  }|	|z
  }|d
k7  r|	|z
  |z  d.z  nd
}|	d
k7  r|	|
z
  |	z  d.z  nd
}|d
k7  r||z
  |z  d.z  nd
}||   d/   j                  |       ||   d0   j                  |       ||   d1   j                  |       ||   d2   j                  |       ||   d3   j                  |       ||   d4   j                  |       # t        $ r t        ddid      cY S w xY w7 6 t        |d%&      S 7 6 g }|j                         D ]  \  }}||d/   rt!        |d/         t#        |d/         z  nd
|d0   rt!        |d0         t#        |d0         z  nd
|d1   rt!        |d1         t#        |d1         z  nd
|d2   rt!        |d2         t#        |d2         z  nd
|d3   rt!        |d3         t#        |d3         z  nd
|d4   rt!        |d4         t#        |d4         z  nd
d5}|j                  |        t        |d%&      S # t$        $ r%}t        dd6t'        |       id7      cY d }~S d }~ww xY ww)8Nr   detailz&Invalid date format. Use 'dd-mm-yyyy'.  )status_codez;Either duration or custom start/end dates must be provided.$matchr.   $projectr   r   $filter$objectToArray$prices	date_item$and$gte$dateFromString
dateString$$date_item.k$lteinputasrf   _idr.   prices$unwind	$prices.k	$toDouble$ifNull$prices.v.prev_close$prices.v.open$prices.v.high$prices.v.low$prices.v.closer.   r/   r-   r0   r*   r+   r,   TallowDiskUse)r9      )rb   rl   ALL
Instrumentc                       t        t              S N)r   listr8   r(   r&   <lambda>z!overall_data_rd.<locals>.<lambda>   s    {4/@ r(   r*   r+   r,   r-   r1   r4   r3   r2   r5   r6   r7   r.   r4   r3   r2   r5   r6   r7   zAn error occurred:   )r   
start_dateend_dater'   r   strptimer   r   input_symbolr   	aggregater;   rN   r   r   r^   sumr\   	Exceptionstr)request
collectionpipelinecursor	documentsr9   r:   rc   r.   r*   r+   r,   r-   r2   r3   r4   r5   r6   r7   resultfieldsavg_dataes                          r&   overall_data_rdr      s    kYW%7%7G<L<L3J7K[K[3\0G 0G$4$4k!!'"4"4jA!!'"2"2J?  +h iwz{{  W%9%9%?%?%A$B  "#%*:I)F&1$*,21B\SbDc0d1B\SZSeSeDf0g5.)* -31B\SbDc0d1B\SZScScDd0e5.)*-&)"(#!: y "# +'2YAWYZ@[4\&]!,.> ?!,.> ? +_="-/@!A!
M1Hf  ))()FFI# 0 0c :s C  /  AHASASX_XjXjnsXsL'*<*<=y{  "#%*:I)F&1$*,21B\SbDc0d1B\SZSeSeDf0g5.)* -31B\SbDc0d1B\SZScScDd0e5.)*-&)"(#!: y "# +'2YAWYZ@[4\&]!,.> ?!,.> ? +_="-/@!A!
M1Hf  ))()FF&'@AL# h hcX6{%jG .
 */);&!%(,z(9%WaefWfdZ.?:-MPS-Slm*CG19tczT&9C&?RS#YcghYhuz/AZ.ORU.Uno+ V$%<=DDEZ[V$%56==nMV$%=>EEF\]V$%ABIIJdeV$%:;BBCVWV$%BCJJKfgY  k#X/W$Xfijjkv0V  	sCCphV0 F"."4"4"6 
($ }C  D[  }\S8O1P-QTWX^_vXwTx-x  bcgmn~gc&1A*B&Cc&QaJbFc&c  FG @F  G_  @`c&9Q2R.SVYZ`ayZzV{.{  fg LR  So  Lp#f=Y6Z2[^abh  jF  cG  _H  3H  vwv|  ~S  wT3v6K/L+MPSTZ[pTqPr+r  Z[ OU  Vs  Ot3v>[7\3]`cdj  lI  eJ  aK  4K  z{ h'
(  C@@ YX)<SVH'EFTWXXYs   R	AQ $A L $Q 3R	4BQ L8L5L8CQ %M	)M*M	-C*Q L2/Q 0R	1L22Q 5L88Q R	M		DQ R		R!R;R<R	RR	c                   K   | j                   }|st        dd      	 |D cg c])  }|j                  D ]  }t        j                  |d       + }}}t        |      }t        |      }|j                  d      }|j                  d      }	di | j                  dk7  rd| j                  ini id	d
ddddiddddddiidd|iigiddddiidd|	iigigidididdid	dddddd
giidddd
giidddd
giidddd
giiddd d
giid!ig}
	 |j                  |
d"#      j                  d $       d {   }|S c c}}w # t
        $ r t        dd      w xY w7 &# t        $ r}t        d%d&t        |             d }~ww xY ww)'Nrk   zNo filters provided.rl   rj   %Y-%m-%d&Invalid date format. Use 'yyyy-mm-dd'.rm   r   r   rn   r   r   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   r|   r   r   r   r   r   r   r   r   r   r   Tr   )lengthr   zDatabase query failed: )filtersr   	timeRanger   r   r   minmaxr!   r   r   to_listr   r   )r   r   rec_filtersrQ   r/   	all_datesoldest_datenewest_dater   r   r   r   r   s                r&   filter_date_ranger   /  s    //K 4JKK^ $

  dJ/
/
	 
 i.Ki.K %%j1J##J/H
  9@9K9Ku9TL'"4"45Z\	
 "2I!>)"!'+<|_>]*^ar  vB  DN  uO  aP  *Q  !R!'+<|_>]*^ar  vB  DL  uM  aN  *O  !P%!	 	
$ 
I#*Y9OQR8S,TU$y3CQ2G&HI$y3CQ2G&HI#i/11E%FG%	4Eq3I'JK
	
3$HNX!++H4+HPPX\P]]u

  ^4\]]^h ^ X6McRSfX4VWWXsd   FD< .D6D< B3F	&E /E0E 5F6D< <EFE 	E?!E::E??Fc           	        K   t        | |       d {   }i }| j                  }d}|D ]  }d| }|j                  \  }}		 t        j                  |d      }
t        j                  |	d      }|D cg c])  }|
t        j                  |d   d      cxk  r|k  rn n|+ }}|||<   |dz  } |S 7 # t
        $ r t        dd      w xY wc c}w w)Nr   	duration_r   rk   r   r   r/   )r   r   r   r   r   r   r   )r   r   duration_dataseperated_datar   counterrfilterdict_keysdtedtr   r   entryr`   s                 r&   get_duration_datar   v  s    +GZ@@MN//KG wi($$S	b!**3
;J((j9H  -
X..uV}jIUXU 
 
 $1x 1%( 5 A  	bC8`aa	b
s3   CB/-C,B1-C1.CC1CCc                 &   i }d }| j                         D ]S  \  }}t        d       }|D ]  }|d   }|d   }|d   }	|d   }
|d   }|
|z
  }||	z
  }||z
  }|dk7  r||z
  |z  dz  nd}|dk7  r||	z
  |z  dz  nd}|dk7  r|
|z
  |z  dz  nd}||   d	   j                  |       ||   d
   j                  |       ||   d   j                  |       ||   d   j                  |       ||   d   j                  |       ||   d   j                  |        |t        |j	                               }n|j                  |j	                                |d   d   |d   d   d|d||<   V i }|j                         D ]  \  }}|d   }|d   g d||<   |D ]  }||   }||d	   rt        |d	         t        |d	         z  nd|d
   rt        |d
         t        |d
         z  nd|d   rt        |d         t        |d         z  nd|d   rt        |d         t        |d         z  nd|d   rt        |d         t        |d         z  nd|d   rt        |d         t        |d         z  ndd}||   d   j                  |         |S )Nc                       t        t              S r   r   r   r8   r(   r&   r   z#calculate_metrics.<locals>.<lambda>  s    ;t+< r(   r.   r*   r+   r,   r-   r   r1   r4   r3   r2   r5   r6   r7   r/   )r   r   r[   rZ   rY   r   )r^   r   rN   setkeysintersection_updater   r\   )rZ   rS   common_symbolsr   recordsrc   recordr.   r*   r+   r,   r-   r2   r3   r4   r5   r6   r7   filtered_resultsrb   r   r   s                         r&   calculate_metricsr     s   GN!ZZ\ '
'"#<= 	dFH%F&>D-C7OE-J &+Z%7"!CZN$(:$5!S]abSb$*;z)IC)Ohi&?Cqy4#:"5";aU_cdUd5:+=*Kc*Qjk'  !89@@AVW !1299.I !9:AABXY !=>EEF`a !67>>?RS !>?FFGbc+	d0 ! !2!2!45N..|/@/@/BC
 &aj0#BK/ !
C'
T $]]_ @'v!,/&
" % 	@F!&)F x~  @W  yXV4K-L)MPSTZ[rTsPt)t  ^_cijzc{#f-=&>"?#fM]F^B_"_  BC |B  C[  |\#f5M.N*ORUV\]uVvRw*w  bc HN  Ok  Hlc&9U2V.WZ]^d  fB  _C  [D  /D  rsrx  zO  sPs62G+H'ICPVWlPmLn'n  VW KQ  Ro  Kps6:W3X/Y\_`f  hE  aF  ]G  0G  vwH X&v.55h?	@@& r(   c                     t               }g }| D ]K  }t        t        |j                                     }||vs*|j	                  |       |j                  |       M |S r   )r   tuplesortedr^   addrN   )	data_listseenunique_dataobj	obj_tuples        r&   remove_duplicatesr     s\    5DK $&-.	D HHYs#$ r(   c                   K   | j                   }g }|D ]H  }t        |d      s|j                  D ]*  }t        |d      s|j                  |j                         , J t        | |       d {   }t        |      }t        ||      }|j                         D ]  \  }	}
t        |
d         |
d<    t        d       }dddd	d
dd}g }g }|D ]'  }	 |j                  |      }||j                  |       ) t        |j!                               D ]  \  }}t#               }|d   D ]Y  }|d   }|j%                  |       |j                         D ].  \  }	}
|	dk7  s|	|v s|	 d| }||   |   j                  |
       0 [ |j                  |        t#        j&                  | }d|j                         D 	cg c]C  \  }}||v r:d|i|j                         D 	ci c]  \  }	}t)        |      dk(  s|	|d    c}}	E c}}	}}i}|S 7 # t        t        f$ r}t        d| d|        Y d }~id }~ww xY wc c}}	w c c}}	}}w w)NrR   rE   )rZ   rH   rZ   c                       t        t              S r   r   r8   r(   r&   r   z%calculate_multidura.<locals>.<lambda>  s    k$&7 r(   r4   r3   r2   r5   r6   r7   r=   zError processing filter z: r.   	_durationcommon_datar   r   )r   hasattrrR   rN   rE   r   r   rh   r^   r   r   rL   KeyError	TypeErrorprintr]   valuesr   r   intersectionr\   )r   r   r   r   filter_itemrH   r   calculated_datar`   rU   rF   rg   rW   duration_symbolsfilter_namesfilter_valuetargetr   duration_indexr   current_symbolsr   r.   new_keyr   
attributesr   r   s                               r&   calculate_multidurar     s    //KG" 5;-(33 5	9h/NN9#3#3455 -WjAAN'7O&O{SM#))+ 9
U)%-8f9 78K$%)"*J  L 	^^L1F!##F+	 %.m.B.B.D$E 1 %f% 	?E8_F'#kkm ?
U(?sl':!$Y~.>?G'077>?	? 	01 %%'78N 	
 '2&7&7&9
 

 #
V~=U &5?5E5E5G\kc63v;Z[K[3q	>\
F Mw B8 )$ 	,\N"QC@A	2 ]
s~    II.I-H.A#I$H6A$II AI="IH?6H?>I
IH< H71I7H<<I?II)collectionsr   fastapi.responsesr   fastapir   r   typingr   r   r	   	functoolsr
   r   r   r   r'   r;   rh   r   r   r   r   r   r   r8   r(   r&   <module>r      sy    # * !   (  	
3Ec Ee E E@0<|lY\EXN<BJ	Fr(   