o
    %j4                     @  s&  d Z ddlmZ ddlZddlZddlmZ ejde	ee
 j ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlZddlZdd Zdd	 Zd
d Z dd Z!dd Z"dd Z#dd Z$dd Z%dd Z&dd Z'dd Z(dd Z)dd Z*d d! Z+d"d# Z,e-d$kre,  dS dS )%u  Plappi Social-Marketing engine — CLI (used by humans and by Lena via WhatsApp).

Targets:
  targets [--channel press|social] [--platform X] [--wave A] [--status active]
  target <id>

Drafting:
  draft-press (--target-id N | --wave A) [--auto-send] [--model haiku]
  draft-social --target-id N [--kind post|comment] [--topic "..."] [--auto-send]

Review / approval (what Lena calls when Nemanja replies on WhatsApp):
  list [--status pending] [--channel press|social]
  show <id>
  approve <id> [--dry]      # press: SENDS mail · community: returns paste-card · own: marks to post
  reject <id> [--reason ...]
  fix <id> --hint "..."     # regenerate with feedback (supersedes old)
  mark-posted <id>          # community manual post done
  send-pending [--channel]  # WA-push all pending items

Ops:
  reply-watch [--dry]       # scan Lena's inbox for press replies → follow-up drafts
  report                    # status summary
    )annotationsN)Path)list_targets
get_targetset_target_status
list_itemsget_item
set_status	log_eventlogformat_for_wamanual_post_cardwa_send
send_emaildbinsert_itemc                 C  s   t | j| j| j| j}|std d S |D ]1}td|d dd|d dd|d d	d|d
 p0ddd|d dd|d dd|d   qd S )Nz(keine Targets)#id<3 channel<6platformz<15wave-posting_modez<16statusz<9name)r   r   r   r   r   print)arowsr r"   L/home/nk/hobo-godmode/otto/projekte/plappi/marketing/engine/marketing_cli.pycmd_targets(   s   8
r$   c                 C  sP   t | j}|stdtjd td | D ]}t|dd||   qd S )Nnicht gefundenfile   14: )r   r   r   sysstderrexitkeys)r   tkr"   r"   r#   
cmd_target1   s   
r1   c                 C  s   | j rtj| j | j| j| jpdd}td|  d S | jr2tj| j| j| jd}td|  d S tdt	j
d t	d d S )	N )	auto_sendmodelextra_notesitem=)r3   r4   zitems=u   --target-id ODER --wave nötigr&      )	target_idpress_outreachdraft_for_targetr3   r4   notesr   r   
draft_waver+   r,   r-   )r   iididsr"   r"   r#   cmd_draft_press9   s   r?   c                 C  s4   t j| j| j| jp
d| j| jd}td|  d S )Nr2   )kindtopicr3   r4   r6   )social_draftr:   r8   r@   rA   r3   r4   r   )r   r=   r"   r"   r#   cmd_draft_socialE   s   rC   c                 C  s   t | j| j}|std d S |D ]1}|d p|d  d d d }td|d dd	|d
 dd	|d dd	|d dd	| 
 qd S )Nz(keine Items)subjectbodyr   7   r   r   r   r   r   <11r   r   r   z<14)r   r   r   r   
splitlines)r   r    r!   headr"   r"   r#   cmd_listK   s    @rJ   c                 C  s@   t | j}|stdtjd td tt|t|d  d S )Nr%   r&   r(   r8   )r   r   r   r+   r,   r-   r   r   )r   itr"   r"   r#   cmd_showT   s   
rL   c           
   
   C  s  t | j}|stdtjd td |d dv r(td| j d|d   d S t|d }|r4|d	 nd
}t }|d| jf |	  |
  t| jd| |d dkr|d
kr|r`|d nd}|rhd|vrtd| j d|rt|d nd d|r}|d nd d td d S t||d |d | jd}|r| jst }|d| jf |	  |
  |rt|d d t| jd| td |d  d!| d" td#|  d S t| jrd$nd% d S |d d&kr|d' d(krd)d l}|| j}t|d)krd*| j d"nd+| j d, td-| d S |d.kr't||}	t|	 td/ d S td0| j d1|d  d2|d'  d3| j d4	 td5 d S )6Nr%   r&   r(   r   )sentpostedr   z ist schon r8   r   emailzfUPDATE items SET status='approved', approved_at=datetime('now'), updated_at=datetime('now') WHERE id=?approvedr   presscontactr2   @u   ⚠️ #r   r   u8   : keine Mail-Adresse hinterlegt — bitte via Formular (urlz) manuell senden.u.   kein contact-mail → manueller Versand nötigrD   rE   dryz^UPDATE items SET status='sent', sent_at=datetime('now'), updated_at=datetime('now') WHERE id=?r   	contactedrM   u   ✅ Mail an z raus (z).u	   sent → zDRY (nicht gesendet)zFEHLER beim Sendensocialr   redditr   u   ✅ Auf Reddit gepostet (#u   ⚠️ Reddit-Post #u!    unsicher — bitte kurz prüfen.zreddit post rc=manual_communityu$   community → paste-card an WhatsAppu   ✅ #u    freigegeben für u   .
(Auto-Poster für u3    steht noch aus — bitte posten und dann: posted #)z%auto_own freigegeben (poster pending))r   r   r   r+   r,   r-   r   r   executecommitcloser
   r   r   rV   r   reddit_postmainr   )
r   rK   r/   modeconntookr_   rccardr"   r"   r#   cmd_approve[   sl   








rg   c                 C  s4   t | jd t| jd| jpd td| j  d S )Nrejectedr2   z
rejected #)r	   r   r
   reasonr   )r   r"   r"   r#   
cmd_reject   s   rj   c                 C  s  t | j}|stdtjd td t|d }ddlm}m	} |d dkrmt
j}d	|d
  d|d  d| j d}||||d pCddd}t
||\}}	||d d|d |d ||	|d |d |||d pidd}
nAtj}d|d  d|d  d| j d}||||d pddd }	||d d|d |d d |	|d |d |d ||d pdd}
t }|d|d pdd |
f |d | jf |  |  t| jd!d"|
  ttt |
| td#|
 d$| j d% d S )&Nr%   r&   r(   r8   r   )
run_clauder   r   rQ   z.KORREKTUR einer Pitch-Mail.

BISHER:
BETREFF: rD   z
---
rE   z

KORREKTUR-WUNSCH: uH   

Gib das überarbeitete Ergebnis im Format 'BETREFF: ...\n---\n<text>'.
model_usedhaiku	press_fix)r4   labeltyper   
disclosurescheduled_for)r8   r   type_r   rD   rE   rq   rr   
thread_refprompt_usedrl   z!KORREKTUR eines Social-Beitrags (z).

BISHER:
u+   

Gib nur den überarbeiteten Beitragstext.
social_fixrX   rt   z,UPDATE items SET fix_iterations=? WHERE id=?fix_iterationsz/UPDATE items SET status='superseded' WHERE id=?fixu   →#z
new item #z (supersedes #r[   )r   r   r   r+   r,   r-   r   marketing_librk   r   r9   SYSTEM_PROMPThint_splitrB   stripr   r\   r]   r^   r
   r   r   )r   rK   r/   rk   r   sysppromptrawrD   rE   newrb   r"   r"   r#   cmd_fix   sD   
r   c                 C  s   t | j}|stdtjd td t }|d| jf |  |	  t
| jdd |d r8t|d d td	| j  d S )
Nr%   r&   r(   zDUPDATE items SET status='posted', sent_at=datetime('now') WHERE id=?rN   manualr8   donezposted #)r   r   r   r+   r,   r-   r   r\   r]   r^   r
   r   )r   rK   rb   r"   r"   r#   cmd_mark_posted   s   
r   c                 C  sJ   t d| j}d}|D ]}tt|t|d  |d7 }q
t| d d S )Npendingr   r8   r(   z pending items an WhatsApp)r   r   r   r   r   r   )r   r    nr!   r"   r"   r#   cmd_send_pending   s
    r   c              	   C  s   t  }td |dD ]}td|d dd|d dd|d	   qtd
 |dD ]}td|d dd|d dd|d	   q-|  d S )NzTARGETS:z]SELECT channel,status,COUNT(*) c FROM targets GROUP BY channel,status ORDER BY channel,statusz  r   r   r   r   z<10czITEMS:z[SELECT channel,status,COUNT(*) c FROM items GROUP BY channel,status ORDER BY channel,statusrG   )r   r   r\   r^   )r   rb   rowr"   r"   r#   
cmd_report   s   ,,r   c              
   C  sl  ddl }dd | jdD }t g }}|D ]}td|ddD ]}|d	 |v r)q ||d	  || q qd } }}	g }
d}|D ]}t|\}}|du rW|d
 ||f}|d p\d}d|vr|d7 }|
d|d
  d|d pr|  | j	st
|d	 dd|d |||d}t|d qC| j	r|d7 }qCt|||ddd}t
|d	 dd|d |||d}|rt }|d|f |  |  t|d	 d t|d| |d7 }n	t|d |	d7 }	|| j qC| j	r|r|nd\}}}tdt| d| d | d! td"| d#| d$|  dS d%| d&| d'|	 d(}|
r,|d)d*|
dd+  7 }t| t| dS ),zSBulk-send the approved templated press email to whole waves (Nemanja pre-approved).r   Nc                 S  s   g | ]
}|  r|  qS r"   )r}   ).0wr"   r"   r#   
<listcomp>   s    zcmd_blast.<locals>.<listcomp>,rQ   active)r   r   r   r   r   rR   r2   rS   r(   u   • r*   rT   press_emailr   )rD   rt   needs_manualFT)rV   no_bcczBUPDATE items SET status='sent', sent_at=datetime('now') WHERE id=?rW   rM   rh   )   —r   r   zDRY blast: u    Targets · würde z	 mailen, z Formulare (manuell)z
--- BEISPIEL: z ---
Betreff: z

u   ✅ Plappi Presse-Blast raus: u    Mails gesendet · u    Formulare (manuell) · z Fehler.u,   

📝 Diese bitte via Formular einreichen:

   )timewavessplitsetr   addappendr9   build_templated_emailrV   r   r	   r   r   r\   r]   r^   r   r
   sleepr   lenjoinr   )r   r   r   seentargetsr   r/   rM   formserr
form_linessamplesubjrE   rR   r=   rd   rb   r   sbmsgr"   r"   r#   	cmd_blast   sb   "
$ r   c                 C  s   dd l }|j| jd d S )Nr   rU   )press_reply_watchrunrV   )r   r   r"   r"   r#   cmd_reply_watch  s   r   c                  C  s  t  } | jddd}|d}|d |d |d |d |jtd	 |d
}|jdtd |jtd	 |d}|jdtd |d |d |jddd |jddd |jt	d	 |d}|jdtdd |jddddgd |d |jddd |jddd |jt
d	 |d}|d |d |jtd	 |d}|jdtd |jtd	 |d}|jdtd |jd dd |jtd	 |d!}|jdtd |d" |jtd	 |d#}|jdtd |jd$dd% |jtd	 |d&}|jdtd |jtd	 |d'}|d |jtd	 |d(}|jd)d*d |jd dd |jd+td,d- |jtd	 |d.}|jd dd |jtd	 |d/}|jtd	 |  }|| d S )0NcmdT)destrequiredr   z	--channelz
--platformz--wavez--status)fntargetr   )rp   zdraft-pressz--target-idz--notesz--modelrm   )defaultz--auto-send
store_true)actionzdraft-social)rp   r   z--kindpostcomment)r   choicesz--topiclistshowapprovez--dryrejectz--reasonrx   z--hint)r   zmark-postedzsend-pendingblastz--waveszA,A3,A4z--sleepg      @)rp   r   zreply-watchreport)argparseArgumentParseradd_subparsers
add_parseradd_argumentset_defaultsr$   intr1   r?   rC   rJ   rL   rg   rj   r   r   r   floatr   r   r   
parse_argsr   )apsubpr   r"   r"   r#   r`     s8    $"*$&.2$ 
$r`   __main__).__doc__
__future__r   r   r+   pathlibr   pathinsertstr__file__resolveparentry   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r9   rB   r$   r1   r?   rC   rJ   rL   rg   rj   r   r   r   r   r   r   r`   __name__r"   r"   r"   r#   <module>   s6   @		6"4%
