import requests
from bs4 import BeautifulSoup
import json
import pandas as pd
import time
import random
import logging
from urllib.parse import urljoin
from fake_useragent import UserAgent
from http.client import RemoteDisconnected
from requests.exceptions import RequestException
import mysql.connector


# Параметри підключення до MySQL
db_config = {
    "host": "10.8.0.1",  # Адреса сервера бази даних
    "user": "integration",       # Ім'я користувача
    "password": "?Q8/{lVK2N08Y<b>k",  # Пароль
    "database": "Salsify"  # Назва бази даних
}

# Підключення до бази даних
try:
    connection = mysql.connector.connect(**db_config)
    # print("Підключення до бази даних успішне.")
except mysql.connector.Error as e:
    # print(f"Помилка підключення: {e}")
    exit()

# SQL-запит для отримання даних
# query = """
# SELECT SL_MD.`SKU`,MS_BU.`Account SKU`, SL_BU.`Build SSKU #`, SL_BU.`Build Item #`
# FROM Salsify.MainData AS SL_MD
# 		LEFT JOIN Salsify.Build  AS SL_BU ON SL_BU.SKU = SL_MD.SKU
# 		LEFT JOIN MySamm.Build AS MS_BU ON MS_BU.SKU = SL_MD.SKU
# WHERE (MS_BU.SKU LIKE '%' AND  (SL_MD.Status)='Active' AND MS_BU.`Account SKU` IS NOT NULL)
#     OR 
# (MS_BU.SKU LIKE '%' AND (SL_MD.Status)='Liquidation' AND MS_BU.`Account SKU` IS NOT NULL)
# """
query = """
SELECT SL_MD.`SKU`,MS_BU.`Account SKU`, SL_BU.`Build SSKU #`, SL_BU.`Build Item #`
FROM Salsify.MainData AS SL_MD
		LEFT JOIN Salsify.Build  AS SL_BU ON SL_BU.SKU = SL_MD.SKU
		LEFT JOIN MySamm.Build AS MS_BU ON MS_BU.SKU = SL_MD.SKU
		INNER JOIN Salsify.ProductPDF as pdfs ON SL_MD.SKU = pdfs.SKU
WHERE pdfs.`Instruction PDF` IS null;
"""

try:
    # Виконання запиту
    cursor = connection.cursor(dictionary=True)
    cursor.execute(query)
    results = cursor.fetchall()

    # Завантаження даних у DataFrame
    df_input = pd.DataFrame(results)
    df_input['Full_URL'] = "https://www.build.com/vigo-" + df_input['Build SSKU #'].astype(str)+"?uid=" + df_input['Build Item #'].astype(str)

    # Створення списків
    urls = df_input['Full_URL'].dropna().tolist()
    additional_data = df_input['SKU'].tolist()

    # print("Дані успішно отримані.")
# except mysql.connector.Error as e:
    # print(f"Помилка запиту: {e}")
finally:
    # Закриття з'єднання
    if connection.is_connected():
        cursor.close()
        connection.close()
        # print("З'єднання з базою даних закрито.")

# Налаштування логування
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# Завантажуємо Excel файл для зчитування URL з стовпця B та додаткових даних з стовпця A
#input_file = "C:/Users/Администратор/Build_input_urls.xlsx.xlsx"  # Вказуємо шлях до вашого Excel файлу
#df_input = pd.read_excel(input_file)

# Витягуємо URL з стовпця B та додаткові дані з стовпця A
#urls = df_input['LINK'].dropna().tolist()  # Збираємо всі URL з стовпця B
#additional_data = df_input['SKU'].dropna().tolist()  # Збираємо додаткові дані з стовпця A

# Перевіряємо, чи кількість URL та додаткових даних однакова
#if len(urls) != len(additional_data):
#    raise ValueError("Кількість URL та SKU не співпадає! Перевірте файл.")

# Список для збору даних
all_data = []

# Максимальна кількість спроб підключення
max_retries = 3
timeout = 20

# Заголовки для симуляції запиту від браузера
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36"
}

# Функція для обробки одного URL
def process_url(url):
    for attempt in range(max_retries):
        try:
            # logging.error()
            response = requests.get(url, headers=headers, timeout=timeout)
            response.raise_for_status()
            soup = BeautifulSoup(response.content, 'html.parser')

            # Пошук всіх тегів <a>, які містять .pdf у href
            links = soup.find_all('a', href=True, target="_blank", rel="noreferrer")
            pdf_links = []
            for link in links:
                href = link.get('href', '-')
                # Перевірка, чи це посилання на PDF
                if '.pdf' in href:
                    # Формуємо повний URL
                    formatted_href = urljoin("https:", href).replace(" ", "")
                    
                    # Витягуємо назву PDF із <span>, якщо є
                    span = link.find('span', class_="pl3 f5")
                    text = span.get_text(strip=True) if span else "-"
                    
                    pdf_links.append({'PDF Link': formatted_href, 'PDF Text': text})

            # Якщо PDF не знайдено, додаємо стандартне повідомлення
            if not pdf_links:
                pdf_links.append({'PDF Link': 'PDF not found', 'PDF Text': 'PDF not found'})

            return pdf_links

        except requests.exceptions.RequestException as e:
            logging.error(f"Помилка для {url}: {e}")
            time.sleep(2 + random.uniform(1, 3))
    logging.error(f"Не вдалося отримати дані з {url} після {max_retries} спроб.")
    return []

# Обробка URL-адрес
for i, url in enumerate(urls):
    try:
        data = process_url(url)
        if data:
            # Якщо для одного URL є кілька результатів, додаємо їх у окремі стовпці
            row = {'Base URL': urls[i], 'SKU': additional_data[i]}
            for j, item in enumerate(data):
                row[f"PDF Link{j+1}"] = item['PDF Link']
                row[f"PDF Text{j+1}"] = item['PDF Text']
            all_data.append(row)
            logging.error(f"Processed {i} of {len(urls)}")
    except Exception as e:
        temp = ''
    time.sleep(random.uniform(1, 3))  # Затримка для уникнення блокування

# Створення DataFrame
# df_output = pd.DataFrame(all_data)
print(json.dumps(all_data))
# Збереження в Excel
# output_file = "C:/Users/Администратор/Desktop/BBB/Build/Build result/Build_input_urls.xlsx"  # Вказуємо шлях до файлу виводу
# df_output.to_excel(output_file, index=False, engine='openpyxl')
# logging.info(f"Дані збережені в {output_file}")
