from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import requests
import random
import string
import time
import os
import re
import csv
from datetime import datetime, timedelta
from selenium.common.exceptions import NoSuchElementException
import sys
from concurrent.futures import ThreadPoolExecutor, as_completed

# Путь к драйверу браузера
driver_path = "/usr/local/bin/chromedriver"

# Создание сервиса ChromeDriver
chrome_service = Service(executable_path=driver_path)

API = 'https://www.1secmail.com/api/v1/'
domain_list = ["dpptd.com"]
domain = random.choice(domain_list)

def generate_username():
    name = string.ascii_lowercase + string.digits
    username = ''.join(random.choice(name) for i in range(10))
    return username

def check_mail(mail=''):
    req_link = f'{API}?action=getMessages&login={mail.split("@")[0]}&domain={mail.split("@")[1]}'
    print(f'[INFO] Проверка почты по ссылке: {req_link}')
    r = requests.get(req_link).json()
    length = len(r)

    if length == 0:
        time.sleep(5)  # Увеличим время ожидания
    else:
        id_list = []
        for i in r:
            for k, v in i.items():
                if k == 'id':
                    id_list.append(v)

        print(f'[+] У вас {length} входящих!')

        for i in id_list:
            read_msg = f'{API}?action=readMessage&login={mail.split("@")[0]}&domain={mail.split("@")[1]}&id={i}'
            print(f'[INFO] Чтение сообщения по ссылке: {read_msg}')
            r = requests.get(read_msg).json()

            sender = r.get('from')
            subject = r.get('subject')
            date = r.get('date')
            content = r.get('textBody')
            link = extract_link_from_content(content)
            if link:
                print(f'Найдена ссылка: {link}')
                delete_mail(mail=mail)
                return link

def delete_mail(mail=''):
    url = 'https://www.1secmail.com/mailbox'
    data = {
        'action': 'deleteMailbox',
        'login': mail.split('@')[0],
        'domain': mail.split('@')[1]
    }
    r = requests.post(url, data=data)
    print(f' [X] Почтовый адрес {mail} - удален!\n')

def extract_link_from_content(content):
    # Шаблон регулярного выражения для поиска ссылки
    pattern = r'https://elevenlabs\.io/app/action\?[^"\s]+'
    # Поиск ссылки в тексте письма
    match = re.search(pattern, content)
    # Если найдено совпадение, вернуть ссылку, иначе вернуть None
    if match:
        return match.group(0)
    else:
        return None

def elevenlabs_register_mail(account_index):
    url = "https://elevenlabs.io/sign-up"
    # Запуск драйвера
    chrome_options = webdriver.ChromeOptions()
    driver = webdriver.Chrome(service=chrome_service, options=chrome_options)
    password = '77777%A=FrEb_12K'

    try:
        username = generate_username()
        mail = f'{username}@{domain}'
        print(f'[+] Ваш почтовый адрес ({account_index}): {mail}')

        mail_req = requests.get(f'{API}?login={mail.split("@")[0]}&domain={mail.split("@")[1]}')

        # Открытие сайта
        driver.get(url)
        time.sleep(3)

        # Находим все элементы <div class="wavefont">
        wavefont_divs = driver.find_elements(By.CSS_SELECTOR, "div.wavefont")

        # Удаляем найденные элементы
        for wavefont_div in wavefont_divs:
            driver.execute_script("arguments[0].parentNode.removeChild(arguments[0]);", wavefont_div)

        iframe = driver.find_element(By.TAG_NAME, "iframe")

        # Переключаемся на фрейм
        driver.switch_to.frame(iframe)

        # Теперь вы можете искать элемент с id "checkbox"
        checkbox = driver.find_element(By.ID, "checkbox")

        start_time = time.time()
        while True:
            # Если checkbox уже выбран, выходим из цикла
            if checkbox.get_attribute("aria-checked") == "true":
                break

            # Если прошло более 120 секунд, выходим из цикла
            if time.time() - start_time > 120:
                print(f"[X] Время ожидания истекло для аккаунта {account_index}, checkbox так и не был выбран")
                driver.quit()
                return False

            time.sleep(1)

        driver.switch_to.default_content()
        time.sleep(2)

        try:
            cookie_button_start = driver.find_element(By.ID, "CybotCookiebotDialogBodyButtonAccept")
            cookie_button_start.click()
            print(f"[V] Кнопка Cookie успешно нажата для аккаунта {account_index}.")
        except NoSuchElementException:
            print(f"[X] Кнопка Cookie не найдена для аккаунта {account_index}. Продолжаем выполнение кода дальше.")

        try:
            black_cookie = driver.find_element(By.ID, "CybotCookiebotDialogBodyLevelButtonLevelOptinAllowAll")
            black_cookie.click()
        except NoSuchElementException:
            print(f"[X] Кнопка Cookie не найдена для аккаунта {account_index}. Продолжаем выполнение кода дальше.")

        time.sleep(1)

        # Находим элемент для ввода почты и вводим адрес
        email_input = driver.find_element(By.CSS_SELECTOR, "div.mt-6 input[name='email']")
        email_input.send_keys(mail)

        # Находим элемент для ввода пароля и вводим пароль
        pass_input = driver.find_element(By.CSS_SELECTOR, "div.mt-1 input[name='password']")
        pass_input.send_keys(password)

        element = driver.find_element(By.CSS_SELECTOR,
                                      "button.flex.items-center.btn.btn-primary.btn-lg.btn-normal.w-full")
        element.location_once_scrolled_into_view

        terms_checkbox = driver.find_element(By.CSS_SELECTOR, "div.my-4 div.flex input[name='terms']")
        terms_checkbox.click()

        # Находим кнопку "Sign Up" и кликаем на нее
        sign_up_button = driver.find_element(By.CSS_SELECTOR, "div[data-testid='signup-signup-button-div'] button")
        sign_up_button.click()

        start_time = time.time()
        while True:
            link = check_mail(mail=mail)
            if link:
                break

            if time.time() - start_time > 120:  # Увеличим время ожидания до 120 секунд
                print(f'Время ожидания для {mail} истекло, link не пришла')
                driver.quit()
                return False

            print(f"Почта обновляется каждые 5 секунд для аккаунта {account_index}.")
            time.sleep(5)

        driver.get(link)
        time.sleep(3)

        try:
            cookie_button_link = driver.find_element(By.ID, "CybotCookiebotDialogBodyButtonAccept")
            cookie_button_link.click()
            print(f"[V] Кнопка Cookie успешно нажата для аккаунта {account_index}.")
        except NoSuchElementException:
            print(f"[X] Кнопка Cookie не найдена для аккаунта {account_index}. Продолжаем выполнение кода дальше.")
        time.sleep(1)

        try:
            close_button = driver.find_element(By.CSS_SELECTOR,
                                               "div.bg-gray-50 button.btn.btn-primary.btn-md.btn-normal")
            close_button.click()
        except NoSuchElementException:
            driver.refresh()
            print(f"[X] Перезагружаем страницу для аккаунта {account_index}.")
            time.sleep(3)
            sign_in_button = driver.find_element(By.CSS_SELECTOR,
                                                 "span[data-testid='sign-in-button']")
            driver.execute_script("arguments[0].click();", sign_in_button)

        time.sleep(2)

        # Находим элемент для ввода почты и вводим адрес
        email_input = driver.find_element(By.CSS_SELECTOR, "div input[type='email']")
        email_input.send_keys(mail)

        password_input = driver.find_element(By.CSS_SELECTOR, "div input[type='password']")
        password_input.send_keys(password)

        submit_button = driver.find_element(By.CSS_SELECTOR, "button[type='submit']")
        submit_button.click()
        time.sleep(10)

        name_input = driver.find_element(By.CSS_SELECTOR, "input[name='name']")
        name_input.send_keys("Milana")
        time.sleep(1)

        option_button = driver.find_element(By.CSS_SELECTOR,
                                            "button[id^='popover-trigger'][aria-controls^='headlessui-listbox-options']")
        option_button.click()
        time.sleep(1)

        list_item = driver.find_element(By.CSS_SELECTOR, "li#headlessui-listbox-option-\\:r4\\:")
        list_item.click()
        time.sleep(1)

        next_button = driver.find_element(By.CSS_SELECTOR, "button.btn.btn-primary.btn-md.btn-normal")
        next_button.click()

        marketer_button = driver.find_element(By.XPATH, "//span[text()='Marketer']")
        marketer_button.click()
        time.sleep(2)

        try:
            cookie_button_acc = driver.find_element(By.ID, "CybotCookiebotDialogBodyButtonAccept")
            cookie_button_acc.click()
            print(f"[V] Кнопка Cookie успешно нажата для аккаунта {account_index}.")
        except NoSuchElementException:
            print(f"[X] Кнопка Cookie не найдена для аккаунта {account_index}. Продолжаем выполнение кода дальше.")
        time.sleep(1)

        my_account_button = driver.find_element(By.XPATH, "//button[@aria-label='Your profile']")
        driver.execute_script("arguments[0].scrollIntoView(true);", my_account_button)
        driver.execute_script("arguments[0].click();", my_account_button)
        time.sleep(1)

        profile_api_key_button = driver.find_element(By.XPATH, "//span[contains(text(), 'Profile + API key')]")
        driver.execute_script("arguments[0].click();", profile_api_key_button)
        time.sleep(1)

        refresh_button = driver.find_element(By.CSS_SELECTOR,
                                             "button.flex.items-center.btn.btn-white.btn-md.btn-normal.border-l-0.rounded-l-none")
        refresh_button.click()
        time.sleep(1)

        confirm_button = driver.find_element(By.CSS_SELECTOR,
                                             "button.flex.items-center.btn.btn-primary.btn-md.btn-normal.inline-flex.w-full.mt-8")
        confirm_button.click()
        time.sleep(2)

        input_element = driver.find_element(By.CSS_SELECTOR,
                                            "input[aria-label='API Key'].block.w-full.rounded-md.bg-transparent.border-gray-300.shadow-sm.focus\\:border-gray-500.focus\\:ring-gray-500.sm\\:text-sm")
        value = input_element.get_attribute("value")
        print(value)

        base = r"C:\Users\bugae\Documents\11lab\BASE.csv"  # укажите правильный путь к вашему CSV файлу
        current_date = datetime.now()
        previous_month_date = current_date - timedelta(days=31)
        formatted_date = previous_month_date.strftime('%d.%m.%Y')

        base_data = [{'API': value, 'Date': formatted_date, 'Mail': mail, 'Password': password}]

        base_exists = os.path.isfile(base)

        with open(base, mode='a', newline='') as base_file:
            base_fieldnames = ['API', 'Date', 'Mail', 'Password']
            base_writer = csv.DictWriter(base_file, fieldnames=base_fieldnames)

            if not base_exists:
                base_writer.writeheader()  # Записываем заголовки, если файл только что создан

            base_writer.writerows(base_data)

        print(f"\033[91mValue '{value}' has been written to {base} along with the previous month's date.\033[0m")
        driver.quit()
        return True

    except Exception as e:
        print(f"Произошла ошибка для аккаунта {account_index}:", e)
        return False

    finally:
        driver.quit()

def main():
    account_index = 0
    max_workers = 5
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        futures = []
        while True:
            if len(futures) < max_workers:
                futures.append(executor.submit(elevenlabs_register_mail, account_index))
                account_index += 1
            # Удаляем завершенные задачи из списка futures
            for future in as_completed(futures):
                futures.remove(future)
                if future.result():
                    print("Аккаунт успешно зарегистрирован.")
                else:
                    print("Регистрация аккаунта не удалась.")

if __name__ == "__main__":
    main()