
    thv(                     L    d dl Z d dlZd dlmZmZ d dlmZmZ d Zd Zd Z	d Z
y)    N)datetime	timedelta)current_appurl_forc                    t         j                  d   t        _        t        j                  st	        d      ddlm} |j                  j                  |      j                         }|st	        d|       |dv r|j                  n|j                  }d| }	 t        j                  j                  |      }d| d| }t        j&                  j)                  |j*                  d      }	d}
|	j,                  D ]C  }|j.                  j1                  d
      |k(  s"|j.                  j1                  d      |k(  sA|}
 n |
sGt        j&                  j!                  |j*                  t3        |dz        d|dv rdnddd|||d      }
t         j                  d    d}t         j                  d    d}t        j4                  j6                  j!                  ||dgdt9        |       |
j*                  ddg| ||d       }|j:                  |j*                  d!S # t        j                  j                  $ r? t        j                  j!                  d	|j"                   |j$                  d
|i      }Y w xY w)"a#  
    Create a Stripe checkout session for subscription
    
    Args:
        user_id (int): User ID
        plan_id (str): Plan ID (basic, professional, enterprise)
        billing_cycle (str): Billing cycle (monthly or yearly)
        
    Returns:
        dict: Checkout session data
    STRIPE_SECRET_KEY6Stripe API key is not set in application configurationr   )SubscriptionPlan)plan_idzInvalid plan ID: yearlyannualz	sqlgenai-z	SQLGenAI r   )namedescriptionmetadata-T)productactiveNbilling_cycled   usdyearmonth   )intervalinterval_count)r   r   price_lookup_id)r   unit_amountcurrency	recurringr   FRONTEND_URLz6/subscription/success?session_id={CHECKOUT_SESSION_ID}z/subscription/cancelcardsubscription)pricequantity)user_idr   r   )success_url
cancel_urlpayment_method_typesmodeclient_reference_id
line_itemsr   )checkout_urlcheckout_id)r   configstripeapi_key
ValueErrorapp.auth.modelsr
   query	filter_byfirstannual_pricemonthly_priceProductretrieveerrorInvalidRequestErrorcreater   r   Pricelistiddatar   getintcheckoutSessionstrurl)r&   r   r   r
   planprice_amount
product_idr   r   existing_pricesr$   pr'   r(   checkout_sessions                  '/var/www/html/app/utils/stripe_utils.pycreate_checkout_sessionrO   
   s    !''(;<FN>>QRR0 !!++G+<BBDD,WI677 )69M(M4$$SWSeSeL WI&J	
..))*5 "'!M?;O ll''

4'HOE !! JJNN9%0JJNN?+}<E	 ##JJL3./&37K&KFQX"#
 #!.#2 $ 
  !''788pqK&&~677KLJ..55$XL 
 *
 6 ( ),,'**  <<++ 
..''TYYK(((7 ( 

s   H AI65I6c                 B	   t         j                  d   t        _        t        j                  s t         j                  j                  d       yddlm} ddlm	}m
}m} | d   }| d   d	   }|d
k(  rt        |j                  di       j                  d            }|j                  di       j                  d      }|j                  di       j                  d      }	|r|r|	s-t         j                  j                  d|j                          y|j                  d      }
|
s-t         j                  j                  d|j                          yt        j                  j                  |
      }d}|j                   j#                  |      j%                         }|r||_        |	dv |_        d|_        |
|_        t/        j0                  |j2                        |_        t/        j0                  |j6                        |_        |}|j:                  j=                          n ||||	dv d|
t/        j0                  |j2                        t/        j0                  |j6                              }|j:                  j?                  |       |j:                  j=                          |j:                  jA                  |       |} |||j                  |j                  dd      dz  |j                  dd      jC                         t/        j0                  |j                  d            d|j                  d      d      }|j:                  j?                  |       |j:                  j=                          y |d!k(  r|j                  d"      }
|
sy|j                   j#                  |
#      j%                         }|sy|j                  d$d      |_        t/        j0                  |j                  d%            |_        t/        j0                  |j                  d&            |_        |j:                  j=                          y |d'k(  rc|j                  d"      }
|
sy|j                   j#                  |
#      j%                         }|syd(|_        |j:                  j=                          y y))z
    Handle Stripe subscription events
    
    Args:
        event: Stripe event object
        
    Returns:
        bool: True if event was handled successfully
    r   r	   Fr   )db)SubscriptionPaymentHistoryUsertyperA   objectzcheckout.session.completedr   r&   r   r   z&Missing metadata in checkout session: r#   z(No subscription ID in checkout session: N)r&   r   r   )r&   r   	is_annualstatussubscription_id
start_dateend_dateamount_totalr   r   r   createdcredit_cardpayment_intentsuccess)r&   rY   amountr   payment_datepayment_methodtransaction_idrX   Tzcustomer.subscription.updatedr@   )rY   rX   current_period_startcurrent_period_endzcustomer.subscription.deleted	cancelled)"r   r/   r0   r1   loggerr;   app.extensionsrQ   r3   rR   rS   rT   rC   rB   r@   r:   r4   r5   r6   r   rW   rX   rY   r   fromtimestampre   rZ   rf   r[   sessioncommitaddrefreshupper)eventrQ   rR   rS   rT   
event_typedata_objectr&   r   r   rY   stripe_subscriptionsubscription_objexisting_subscriptionnew_subscriptionpaymentr#   s                    rN   handle_subscription_eventrx   m   s    !''(;<FN>>  !YZ!BBvJ-)K11kooj"599)DE//*b155i@#
B7;;OLg]$$'MknnM]%^_ &//.9$$'OP[P^P^O_%`a %11::?K   !- 2 2 < <W < M S S U ,3!).;?S.S!++3!(4C!1/7/E/EFYFnFn/o!,-5-C-CDWDjDj-k!*4JJ  ,'+?? /#112E2Z2Z[!//0C0V0VW  JJNN+,JJJJ/0/ !,//??>15; __Z7==?!//	0JK(&??+;<	
 	

w 	

	6	6%//$/ $))33O3TZZ\ *oohA"*"8"8I_9`"a ( 6 6{G[7\ ]


	6	6%//$/ $))33O3TZZ\ *


    c                 t   t         j                  d   t        _        t        j                  s t         j                  j                  d       y	 t        j                  j                  |        y# t        j
                  j                  $ r,}t         j                  j                  d|        Y d}~yd}~ww xY w)z
    Cancel a Stripe subscription
    
    Args:
        subscription_id (str): Stripe subscription ID
        
    Returns:
        bool: True if subscription was cancelled successfully
    r   r	   FTz&Error cancelling Stripe subscription: N)	r   r/   r0   r1   rh   r;   rR   deleteStripeError)rY   es     rN   cancel_stripe_subscriptionr~      s     !''(;<FN>>  !YZ""?3<<##   #I!!MNs   A. .B7"B22B7c                 v   t         j                  d   t        _        t        j                  s t         j                  j                  d       y	 t        j                  j                  |       }|S # t        j
                  j                  $ r,}t         j                  j                  d|        Y d}~yd}~ww xY w)z
    Get subscription data from Stripe
    
    Args:
        subscription_id (str): Stripe subscription ID
        
    Returns:
        dict: Subscription data
    r   r	   Nz&Error retrieving Stripe subscription: )	r   r/   r0   r1   rh   r;   rR   r:   r|   )rY   r#   r}   s      rN   get_subscription_datar     s     !''(;<FN>>  !YZ**33OD<<##   #I!!MNs    A/ /B8"B33B8)r0   osr   r   flaskr   r   rO   rx   r~   r    ry   rN   <module>r      s)     	 ( &aF@D.ry   