o
    ȟ1i+                     @   s   d dl mZ d dlmZ d dlmZmZ d dlmZmZ d dl	Z	d dl
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mZmZ d dlmZ G dd dZdS )    )get_db)CoreDBError)datetimedate)ListOptionalN)GiftCard)Parent)StaffUser)Participant)GiftCardCreateGiftCardUpdate)WalletServicec                   @   s   e Zd ZdefddZdd Zdee fddZde	de
e fd	d
Zdede
e fddZde	dede
e fddZde	defddZdedefddZdededefddZdS )GiftCardServicereturnc                 C   sl   d tjtjdd}d tjtjdd}d tjtjdd}d tjtjdd}| | | | S )z<Generate a random gift card code in format like ABC123DEF456    )k)joinrandomchoicesstringascii_uppercasedigits)selfpart1part2Zpart3Zpart4 r   /app/services/gift_card.pygenerate_gift_card_code   s
   z'GiftCardService.generate_gift_card_codec                 C   s  t  {}|  }|ttj|ktjd  }|r8|  }|ttj|ktjd  }|r8t	d|j
t k rCt	dt||j|j
|jd}z|| |  || |W W  d    S  ty} } z|  t	d| d }~ww 1 sw   Y  d S )Nz(Could not generate unique gift card code%Validation date cannot be in the past)codeamountvalidate_date	is_activezCould not create gift card: )r   r    queryr   filterr"   
deleted_atis_firstr   r$   r   todayr#   r%   addcommitrefresh	Exceptionrollback)r   requestdbr"   Zexisting_gift_card	gift_carder   r   r   save   sL   





"zGiftCardService.savec                 C   sT   t  }|ttjd  }dd |D W  d    S 1 s#w   Y  d S )Nc                 S   s^   g | ]+}|j |jt|j|j |j|j|j|j	|j
r |j
 nd |jr)|j nd d
qS N)
idr"   r#   r$   r%   is_used
is_used_by	user_type
created_at
updated_at)r7   r"   floatr#   r$   	isoformatr%   r8   r9   r:   r;   r<   ).0gcr   r   r   
<listcomp>C   s    z6GiftCardService.get_all_gift_cards.<locals>.<listcomp>)r   r&   r   r'   r(   r)   all)r   r2   
gift_cardsr   r   r   get_all_gift_cards@   s   $z"GiftCardService.get_all_gift_cardsgift_card_idc                 C   s   t  N}|ttj|ktjd  }|s!	 W d    d S |j|jt	|j
|j |j|j|j|j|jr=|j nd |jrF|j nd d
W  d    S 1 sTw   Y  d S r6   )r   r&   r   r'   r7   r(   r)   r*   r"   r=   r#   r$   r>   r%   r8   r9   r:   r;   r<   )r   rE   r2   r3   r   r   r   get_gift_card_by_idS   s,   


$z#GiftCardService.get_gift_card_by_idr"   c                 C   sN   t  }|ttj|ktjd  W  d    S 1 s w   Y  d S )N)r   r&   r   r'   r"   r(   r)   r*   )r   r"   r2   r   r   r   get_gift_card_by_codej   s   

$z%GiftCardService.get_gift_card_by_coder1   c                 C   s   t  g}|ttj|ktjd  }|s!	 W d    d S |jt	
 k r.tddd|j|_|j|_|j|_t |_z|  || |W W  d    S  tyi } z|  td| d }~ww 1 smw   Y  d S )Ni  r!   )status_codedetailzCould not update gift card: )r   r&   r   r'   r7   r(   r)   r*   r$   r   r+   HTTPExceptionr#   r%   r   nowr<   r-   r.   r/   r0   r   )r   rE   r1   r2   r3   r4   r   r   r   update_gift_cardq   s6   

	

z GiftCardService.update_gift_cardc                 C   s   t  T}|ttj|ktjd  }|s!	 W d    dS |jr-	 W d    dS t	
 |_z|  W W d    dS  tyV } z|  td| d }~ww 1 sZw   Y  d S )NFTzCould not delete gift card: )r   r&   r   r'   r7   r(   r)   r*   r8   r   rK   r-   r/   r0   r   )r   rE   r2   r3   r4   r   r   r   delete_gift_card   s0   

	
z GiftCardService.delete_gift_cardc                 C   s   t  c}|ttj|ktjd  }|s%ddd dW  d    S |jr5ddd dW  d    S |j	sEddd dW  d    S |j
t k rYddd dW  d    S dd|dW  d    S 1 siw   Y  d S )	NFGift card not found)validmessager3   Gift card already usedGift card is not activeGift card has expiredTzGift card is valid)r   r&   r   r'   r"   r(   r)   r*   r8   r%   r$   r   r+   )r   r"   r2   r3   r   r   r   validate_gift_card   sH   

#$z"GiftCardService.validate_gift_cardgift_card_codeuserc           	      C   s  t  K}| |}|std|jrtd|jstd|jt k r)td||}d}|d dkr[|	t
t
j|d k }|sKtd	| jt|j7  _d
| }nl|d dkr|	ttj|d k }|svtd| jt|j7  _d|j d}n?|d dkr|	ttj|d k }|std|jd u rd|_| jt|j7  _d|j d}n
td|d  dd|_|d |_|d |_t |_|  || |d dkr|| |t|jt|jdW  d    S |d dkr || |t|jt|jdW  d    S |d dkr?|| |t|jt|jdW  d    S |t|jddW  d    S 1 sSw   Y  d S )NrN   rQ   rR   rS   r   r:   parentr7   zParent not foundzGift card redemption: participantzParticipant not foundzSuccessfully added $z
 to walletguestzGuest user not foundr   z
User type z cannot redeem gift cardsT)rP   r#   Zremaining_balance)r   rG   r   r8   r%   r$   r   r+   merger&   r	   r'   r7   r*   wallet_amountr=   r#   r   r   r9   r:   r   rK   r<   r-   r.   )	r   rU   rV   r2   r3   Zwallet_messagerW   rX   Z
guest_userr   r   r   add_to_wallet   s   








=
D
N&zGiftCardService.add_to_walletN)__name__
__module____qualname__strr    r5   r   dictrD   intr   rF   r   rG   r   rL   boolrM   rT   r\   r   r   r   r   r      s    ')r   )core.configr   core.security.exceptionsr   r   r   typingr   r   r   r   Zmodels.gift_cardr   models.parentr	   modelsr
   r   models.participantr   schema.gift_cardr   r   services.walletr   r   r   r   r   r   <module>   s    