import sys
from pjsua2 import *
import time

# --------------------------
# Date SIP
# --------------------------
SIP_USER = '15304641286'
SIP_PASS = 'HkLWX1HCJAPN'
SIP_SERVER = 'easyringer50287.sip.ashburn.twilio.com'
SIP_PORT = 5060
SIP_DOMAIN = 'easyringer50287.sip.ashburn.twilio.com'

# --------------------------
# Callback log
# --------------------------
def log_cb(level, msg, length):
    print(msg.strip())

# --------------------------
# Callback pentru apeluri primite
# --------------------------
class MyCall(Call):
    def __init__(self, acc, call_id=None):
        if call_id is None:
            super().__init__(acc)
        else:
            super().__init__(acc, call_id)

    def onCallState(self, prm):
        ci = self.getInfo()
        print(f"[CALL] State: {ci.stateText}, last code: {ci.lastStatusCode} ({ci.lastReason})")

    def onCallMediaState(self, prm):
        ci = self.getInfo()
        for i, media in enumerate(ci.media):
            if media.type == pj.MediaType.AUDIO and media.status == pj.MediaStatus.ACTIVE:
                aud_med = AudioMedia.typecastFromMedia(media)
                ep.audDevManager().getCaptureDevMedia().startTransmit(aud_med)
                aud_med.startTransmit(ep.audDevManager().getPlaybackDevMedia())
                print("[CALL] Media active")

# --------------------------
# Callback cont SIP
# --------------------------
class MyAccount(Account):
    def __init__(self):
        Account.__init__(self)

    def onIncomingCall(self, prm):
        print(f"[CALL] Incoming call from {prm.rdata.info().remoteUri}")
        call = MyCall(self, prm.callId)
        call_prm = CallOpParam()
        call_prm.statusCode = pj.PJSIP_SC_OK  # Acceptă apelul automat
        call.answer(call_prm)
        print("[CALL] Call answered!")

# --------------------------
# Main
# --------------------------
# Creează endpoint
ep = Endpoint()
ep.libCreate()

# Configurație endpoint
ep_cfg = EpConfig()
ep_cfg.logConfig.level = 4
ep_cfg.logConfig.callback = log_cb
ep.libInit(ep_cfg)

# Transport UDP
tp_cfg = TransportConfig()
tp_cfg.port = SIP_PORT
transport = ep.transportCreate(PJSIP_TRANSPORT_UDP, tp_cfg)

# Start endpoint
ep.libStart()
print("[SYSTEM] PJSUA2 initialized!")

# Creare cont SIP
acc_cfg = AccountConfig()
acc_cfg.idUri = f"sip:{SIP_USER}@{SIP_DOMAIN}"
acc_cfg.regConfig.registrarUri = f"sip:{SIP_SERVER}"
cred = AuthCredInfo("digest", "sip.twilio.com", SIP_USER, 0, SIP_PASS)
acc_cfg.sipConfig.authCreds.append(cred)

acc = MyAccount()
acc.create(acc_cfg)
print(f"[SYSTEM] SIP account registered: {SIP_USER}@{SIP_DOMAIN}")

# Codec-uri prioritare Twilio
codecs = ep.codecEnum()
for c in codecs:
    if c.name in ['PCMU/8000', 'PCMA/8000', 'telephone-event/8000']:
        ep.codecSetPriority(c.name, 255)
    else:
        ep.codecSetPriority(c.name, 0)
print("[SYSTEM] Waiting for incoming calls...")
while True:
    print('x')
    time.sleep(1)  # Programul rămâne activ
# Loop principal




