import requests
from bs4 import BeautifulSoup
import time
import sqlite3
from datetime import datetime
from flask import Flask, jsonify
import hashlib
import os

app = Flask(__name__)
DATABASE = 'devices.db'

# دالة محسنة لإعداد قاعدة البيانات
def init_db():
    # التحقق من وجود ملف قاعدة البيانات
    db_exists = os.path.exists(DATABASE)
    
    conn = sqlite3.connect(DATABASE)
    c = conn.cursor()
    
    # إنشاء الجداول إذا لم تكن موجودة
    c.execute('''CREATE TABLE IF NOT EXISTS devices
                 (id INTEGER PRIMARY KEY AUTOINCREMENT,
                  name TEXT,
                  url TEXT UNIQUE,
                  image TEXT,
                  specs_hash TEXT,
                  last_updated TIMESTAMP)''')
    
    c.execute('''CREATE TABLE IF NOT EXISTS basic_specs
                 (id INTEGER PRIMARY KEY AUTOINCREMENT,
                  device_id INTEGER,
                  spec_name TEXT,
                  spec_value TEXT,
                  FOREIGN KEY(device_id) REFERENCES devices(id))''')
    
    c.execute('''CREATE TABLE IF NOT EXISTS advanced_specs
                 (id INTEGER PRIMARY KEY AUTOINCREMENT,
                  device_id INTEGER,
                  group_name TEXT,
                  spec_name TEXT,
                  spec_value TEXT,
                  FOREIGN KEY(device_id) REFERENCES devices(id))''')
    
    conn.commit()
    conn.close()
    
    if not db_exists:
        print("تم إنشاء قاعدة بيانات جديدة والجداول المطلوبة")
    else:
        print("تم الاتصال بقاعدة البيانات الموجودة")

# إنشاء هاش للمواصفات لتتبع التغييرات
def create_specs_hash(specs):
    hash_str = ''.join(f"{k}:{v}" for k, v in sorted(specs.items()))
    return hashlib.md5(hash_str.encode()).hexdigest()

# جلب البيانات من الموقع
def scrape_devices():
    # تهيئة قاعدة البيانات أولاً
    init_db()
    
    base_url = "https://qaranphone.com/brand/"
    session = requests.Session()
    session.headers.update({
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    })
    
    try:
        response = session.get(base_url)
        response.raise_for_status()
        
        soup = BeautifulSoup(response.content, "html.parser")
        brand_links = soup.find_all("a", href=True)
        brand_urls = list(set(
            link['href'] for link in brand_links 
            if '/brand/' in link['href'] and link['href'] != '/brand/'
        ))
        
        conn = sqlite3.connect(DATABASE)
        c = conn.cursor()
        
        for brand_url in brand_urls:
            full_brand_url = brand_url if brand_url.startswith('https://') else f"https://qaranphone.com{brand_url}"
            
            try:
                brand_response = session.get(full_brand_url)
                brand_response.raise_for_status()
                brand_soup = BeautifulSoup(brand_response.content, "html.parser")
                
                products = brand_soup.find_all("li", id=lambda x: x and x.startswith("product-"))
                
                for product in products:
                    product_link = product.find("a", href=True)['href']
                    
                    # التحقق مما إذا كان الجهاز موجوداً بالفعل
                    try:
                        c.execute("SELECT id, specs_hash FROM devices WHERE url = ?", (product_link,))
                        existing_device = c.fetchone()
                    except sqlite3.OperationalError as e:
                        print(f"خطأ في الوصول إلى جدول الأجهزة: {e}")
                        init_db()  # إعادة تهيئة الجداول في حالة الخطأ
                        continue
                    
                    product_image = product.find("img")['src']
                    product_name = product.find("h2", class_="aps-product-title").text.strip()
                    
                    # استخراج المواصفات الأساسية
                    product_details = product.find("div", class_="aps-product-details")
                    specs = product_details.find_all("li") if product_details else []
                    product_specs = {}
                    for spec in specs:
                        spec_name_tag = spec.find("strong")
                        if spec_name_tag:
                            spec_name = spec_name_tag.text.strip()
                            spec_value = spec.text.replace(spec_name, "").strip()
                            product_specs[spec_name] = spec_value
                    
                    current_hash = create_specs_hash(product_specs)
                    
                    # إذا كان الجهاز موجوداً ولم تتغير المواصفات، نتخطاه
                    if existing_device and existing_device[1] == current_hash:
                        continue
                    
                    # جلب المواصفات المتقدمة
                    try:
                        product_response = session.get(product_link)
                        product_response.raise_for_status()
                        product_soup = BeautifulSoup(product_response.content, "html.parser")
                        
                        specs_group = product_soup.select("#aps-specs .aps-group")
                        advanced_specs = {}
                        
                        for group in specs_group:
                            group_title = group.find("h3", class_="aps-group-title").text.strip()
                            specs_in_group = group.find_all("li")
                            group_specs = {}
                            
                            for spec in specs_in_group:
                                spec_name_tag = spec.find("strong")
                                if spec_name_tag:
                                    spec_name = spec_name_tag.text.strip()
                                    spec_value = spec.find("span", class_="aps-1co").text.strip()
                                    group_specs[spec_name] = spec_value
                            
                            if group_specs:
                                advanced_specs[group_title] = group_specs
                        
                        # إدخال أو تحديث البيانات في قاعدة البيانات
                        if existing_device:
                            # تحديث الجهاز الموجود
                            device_id = existing_device[0]
                            c.execute("UPDATE devices SET name=?, image=?, specs_hash=?, last_updated=? WHERE id=?",
                                     (product_name, product_image, current_hash, datetime.now(), device_id))
                            
                            # حذف المواصفات القديمة
                            c.execute("DELETE FROM basic_specs WHERE device_id=?", (device_id,))
                            c.execute("DELETE FROM advanced_specs WHERE device_id=?", (device_id,))
                        else:
                            # إدخال جهاز جديد
                            c.execute("INSERT INTO devices (name, url, image, specs_hash, last_updated) VALUES (?, ?, ?, ?, ?)",
                                     (product_name, product_link, product_image, current_hash, datetime.now()))
                            device_id = c.lastrowid
                        
                        # إدخال المواصفات الأساسية
                        for spec_name, spec_value in product_specs.items():
                            c.execute("INSERT INTO basic_specs (device_id, spec_name, spec_value) VALUES (?, ?, ?)",
                                     (device_id, spec_name, spec_value))
                        
                        # إدخال المواصفات المتقدمة
                        for group_name, group_specs in advanced_specs.items():
                            for spec_name, spec_value in group_specs.items():
                                c.execute("INSERT INTO advanced_specs (device_id, group_name, spec_name, spec_value) VALUES (?, ?, ?, ?)",
                                         (device_id, group_name, spec_name, spec_value))
                        
                        conn.commit()
                        
                    except requests.RequestException as e:
                        print(f"فشل جلب صفحة المنتج {product_link}: {str(e)}")
                        continue
                    
                    time.sleep(2)  # تقليل الضغط على الموقع
                
            except requests.RequestException as e:
                print(f"فشل جلب صفحة العلامة التجارية {full_brand_url}: {str(e)}")
                continue
        
        conn.close()
        return True, "تم تحديث البيانات بنجاح"
    
    except requests.RequestException as e:
        return False, f"فشل الاتصال بالموقع: {str(e)}"

@app.route('/scrape-all-devices', methods=['GET'])
def scrape_all_devices():
    success, message = scrape_devices()
    return jsonify({
        'success': success,
        'message': message,
        'timestamp': datetime.now().isoformat()
    })

if __name__ == '__main__':
    # تأكد من تهيئة قاعدة البيانات قبل التشغيل
    init_db()
    app.run(host='0.0.0.0', port=5000, debug=True)