import os
import delegator
import json
import re
import time
from appium import webdriver
from appium.options.ios import XCUITestOptions
from appium.webdriver.common.appiumby import AppiumBy
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# MATRIX setup
# os.environ['NODE_TLS_REJECT_UNAUTHORIZED'] = '0' # If using CDK

project_id = 'b8fc269f-ee86-4464-a191-e9c7de17fd00' # Change to yours
instance_id = 'a4e4a282-c79a-42f9-b2eb-8cf6f1fdcf6b' # Change to yours

create_wordlist = f'corellium image create \
--project {project_id} \
--instance {instance_id} \
credit_card.txt extension plain ./credit_card.txt'

result = delegator.run(create_wordlist)
wordlist_id = (json.loads(result.out))[0]['id']
print('Created wordlist')

create_test = f'corellium matrix create-assessment \
--instance {instance_id} \
--bundle com.corellium.Cafe \
--wordlist {wordlist_id} \
--verbose true'

result = delegator.run(create_test)
match = re.search(r'"id":"([^"]+)"', result.out)
assessment_id = match.group(1)
print('Created test')

start_monitor = f'corellium matrix start-monitor \
--assessment {assessment_id} \
--instance {instance_id} \
--verbose true'

result = delegator.run(start_monitor)
print('Started monitoring\n')
time.sleep(30) # Wait for MATRIX to open app

# Appium automation
options = XCUITestOptions()
options.automation_name = 'XCUITest'

# Unique to device
options.udid = '00008120E2B0B8724249DA6D' # UDID
options.device_name = "appium-demo" # Name
options.platform_name = 'iOS'
options.platform_version = '18.3.1' # iOS version

# WDA settings
options.set_capability('webDriverAgentUrl', 'http://10.11.1.1:8100') # IP of Corellium device
options.set_capability('usePreinstalledWDA', True)
options.set_capability('updatedWDABundleId', 'org.appium.WebDriverAgentRunner') # Bundle ID chosen in Xcode project
options.set_capability('updatedWDABundleIdSuffix', '.xctrunner')
options.set_capability('autoLaunch', False)

# App settings
options.bundle_id = 'com.corellium.Cafe' # Bundle ID of target application

try:
    driver = webdriver.Remote('http://127.0.0.1:4723', options=options)

    wait = WebDriverWait(driver, 20)

    order_button = wait.until(
        EC.presence_of_element_located((AppiumBy.ACCESSIBILITY_ID, "Order"))
    )
    order_button.click()
    print("Clicked on order button")

    tea_button = wait.until(
        EC.presence_of_element_located((AppiumBy.XPATH, "(//XCUIElementTypeImage[@name='cup.and.saucer.fill'])[3]"))
    )
    tea_button.click()
    print("Clicked on tea button")

    add_to_card_button = wait.until(
        EC.presence_of_element_located((AppiumBy.XPATH, "//XCUIElementTypeButton[@name='Add to Cart']"))
    )
    add_to_card_button.click()
    print("Clicked on add to cart button")

    cart_button = wait.until(
        EC.presence_of_element_located((AppiumBy.ACCESSIBILITY_ID, "Cart"))
    )
    cart_button.click()
    print("Clicked on cart button")

    checkout_button = wait.until(
        EC.presence_of_element_located((AppiumBy.ACCESSIBILITY_ID, "Checkout"))
    )
    checkout_button.click()
    print("Clicked on checkout button")

    first_name_field = wait.until(
        EC.presence_of_element_located((AppiumBy.XPATH, "//XCUIElementTypeTextField[@value='First Name']"))
    )
    first_name_field.send_keys("test")
    print("Sent 'test' to first name field")
     
    last_name_field = wait.until(
        EC.presence_of_element_located((AppiumBy.XPATH, "//XCUIElementTypeTextField[@value='Last Name']"))
    )
    last_name_field.send_keys("user")
    print("Sent 'user' to last name field")
    
    credit_card_field = wait.until(
        EC.presence_of_element_located((AppiumBy.XPATH, "//XCUIElementTypeTextField[@value='Credit Card']"))
    )
    credit_card_field.send_keys("1234567890000000")
    print("Sent credit card details")
    
    cvv_field = wait.until(
        EC.presence_of_element_located((AppiumBy.XPATH, "//XCUIElementTypeTextField[@value='CVV']"))
    )
    cvv_field.send_keys("098")
    print("Sent CVV details")
 
    zipcode_field = wait.until(
        EC.presence_of_element_located((AppiumBy.XPATH, "//XCUIElementTypeTextField[@value='Zipcode']"))
    )
    zipcode_field.send_keys("20111")
    print("Sent zipcode")
   
    phone_number_field = wait.until(
        EC.presence_of_element_located((AppiumBy.XPATH, "//XCUIElementTypeTextField[@value='Phone Number']"))
    )
    phone_number_field.send_keys("5712711234")
    print("Sent phone number") 

    place_order_button = wait.until(
        EC.presence_of_element_located((AppiumBy.ACCESSIBILITY_ID, "Place Order"))
    )
    place_order_button.click()
    print("Placed order")

    ok_button = wait.until(
        EC.presence_of_element_located((AppiumBy.ACCESSIBILITY_ID, "OK"))
    )
    ok_button.click()
    print("Clicked on OK")
           
except Exception as e:
    print(f"Error occurred: {str(e)}")
    print(f"Error type: {type(e)}")

# MATRIX finishing
stop_monitor = f'corellium matrix stop-monitor \
--assessment {assessment_id} \
--instance {instance_id} \
--verbose true'

result = delegator.run(stop_monitor)
print('\nStopped monitoring')

run_test = f'corellium matrix test \
--assessment {assessment_id} \
--instance {instance_id} \
--verbose true'

time.sleep(20) # Wait for monitoring to stop

result = delegator.run(run_test)
print('Ran test')