o
    ~i^!                     @   sB  d dl mZmZmZmZ d dlmZ d dlm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 edeZed	Zd
Zdd ZdededefddZdededefddZdd Zdd ZdedB dedB fddZddddZdd Z defd d!Z!d"edB dedB fd#d$Z"ej#d%d&d'gd(d)d* Z$dS )+    )	Blueprintrequestjsonifycurrent_app)datetime)desc)SQLAlchemyErrorN)text)db
SubscriberContentSchedulelinkzAfrica/Lagosz#https://bk.finsightngr.online:30976c                   C   s   t t S )N)r   nowWATdate r   r   B/home/www/bk.finsightngr.online/FinSight/app/routes/link_routes.py
_wat_today   s   r   
content_idsubscriber_idreturnc                 C   sh   t |dr	| nt|}|  d| d| dt   }t|  }t	 d|  d| d| S )N	isoformat_	/content//)
hasattrr   strr   utcnowhashlibmd5encode	hexdigest	BASE_HOSTr   scheduled_dater   sdunique_stringunique_hashr   r   r   generate_unique_link   s   "r)   c                 C   sZ   t |dr	| nt|}|  d| d| }t|  }t d|  d| d| S )Nr   :r   r   )r   r   r   r   r    r!   r"   r#   r$   r   r   r   generate_daily_link   s   r+   c                 C   s.   z| d ur
t | W S dW S  ty   Y dS w )Ng        )float	Exceptionvalr   r   r   	_to_float(   s
   r0   c                 C   sH   | d u rd S t | tr| S ztt| ddW S  ty#   Y d S w )NZ )
isinstancer   fromisoformatr   replacer-   r.   r   r   r   	_parse_dt/   s   
r6   msisdnc                 C   s:   | sd S |   }|drt|dkrd|dd   S |S )N0   234   )strip
startswithlen)r7   sr   r   r   _normalize_msisdn<   s   r@   defaultc                G   s.   |D ]}|| v r| | dvr| |   S q|S )N)Nr2   r   )datarB   keyskr   r   r   
_get_fieldF   s
   rF   c                  C   s>   t  } tjj| dtj  }|sdS |d jt	|fS )N)r   )Nr   r   )
r   r   query	filter_byorder_byidascallr   r>   )todayitemsr   r   r    _get_todays_scheduled_content_idN   s
   rO   c                 C   sf   | pd d}z!|d}t||d  }t||d  }||d  }|||fW S  ty2   Y dS w )Nr2   r   contentr;         )NNN)splitindexintr-   )r   partsidxcidZsiduidr   r   r   _parse_link_partsU   s   
rZ   vc                 C   sH   | sd S t |  }|dr|dd  }|dr"d|dd   S |S )N+r;   r:   r8   rR   )r   r<   r=   )r[   pr   r   r   _to_local_phonec   s   

r^   z/subscribers/generate_instantPOSTOPTIONS)methodsc               
   C   s~  t jdkrdS zjt jddd} t| dd}t|}|s%tdd	id
fW S tt| dd}tt| dd}tt| dddddp@d}tt| dd}t| d}t| d}|durpt	j
|}	|	sitddid
fW S |	j}
t }nt \}
}|
stddidfW S t }tj
j|d }d}|du rt|o|t k}t|d|pt |pt |pd|||d}tj| tj  d}d|  d|j d|
 }ztjtd d!|i }W n ty } ztj d"|  d}W Y d}~nd}~ww |sd#|j|j!|
| d$}t|}d%|_"|W S |j#r>t$|j#\}}}||
kr>||jkr>d&d|j|j!|
| d'}t|d(fW S t%|
||jd)}||_#tj| tj&  d*d||j|j!|j'|
| |d+	}t||rod,fW S d(fW S  t(y } ztj)d- tj*  td.t|d/d0fW  Y d}~S d}~w ty } ztj)d1 td2t|d/d0fW  Y d}~S d}~ww )3z
    Rules:
      - First successful generation TODAY -> 201/200 with link.
      - Concurrent second call while first is running -> 202 in_progress (NO link).
      - Any later call TODAY (same subscriber + content) -> 200 already_created (NO link).
    r`   )r2      TF)forcesilentphoner7   errorzphone (or msisdn) is requiredi  	starttimeZ
start_timeendtimeend_timeservicePackZservicepackZserviceparkr2   rA   
pricePointZ
pricepointnetworkr   NzInvalid content_idzNo content scheduled for todayi  )re   )re   emailrg   rh   rj   rk   subscribeStatusrl   zinstant:r*   z)SELECT pg_try_advisory_lock(hashtext(:k))rE   z+[GenerateLinkUpsert] advisory lock failed: Zin_progress)statusr   re   r   r%      Zalready_created)ro   
idempotentr   re   r   r%      )r   r%   r   created)	ro   rq   rs   r   re   activer   r%   r      z[GenerateLinkUpsert] DB errorZdatabase_error)rf   detaili  z%[GenerateLinkUpsert] Unexpected errorZunexpected_error)+r   methodget_jsonrF   r^   r   r6   r   r0   r   rG   getrJ   r   rO   r   rH   firstboolr   r   r
   sessionaddflushr   executer	   scalarr-   r   loggerwarningre   status_code	news_linkrZ   r)   commitrn   r   	exceptionrollback)rC   Z	phone_rawZphone_localrg   rh   rj   rk   rl   Zreq_content_idrP   r   Zchosen_dateZ_cntsubrs   	is_activeZidem_keyZtry_lockepayloadresplclsr   r   r   r   r   'generate_link_upsert_subscriber_instantr   s   







	

""r   )%flaskr   r   r   r   r   
sqlalchemyr   Zsqlalchemy.excr   r   pytzr	   
app.modelsr
   r   r   r   __name__link_bptimezoner   r#   r   rU   r   r)   r+   r0   r6   r@   rF   rO   rZ   r^   router   r   r   r   r   <module>   s.   


