import requests
from bs4 import BeautifulSoup
import cssutils
import logging
import re

# Tắt các thông báo cảnh báo không cần thiết từ cssutils
cssutils.log.setLevel(logging.CRITICAL)

def extract_css(url):
    # Tải nội dung trang web
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')

    # Trích xuất tất cả CSS
    all_css = ""

    # CSS nội tuyến
    for style in soup.find_all('style'):
        all_css += style.string or ""

    # CSS từ các file external
    for link in soup.find_all('link', rel='stylesheet'):
        css_url = link.get('href')
        if css_url:
            if not css_url.startswith(('http:', 'https:')):
                css_url = url + css_url if css_url.startswith('/') else url + '/' + css_url
            try:
                css_response = requests.get(css_url)
                css_response.raise_for_status()
                all_css += css_response.text
            except requests.RequestException as e:
                print(f"Không thể tải CSS từ {css_url}: {e}")

    # Trích xuất các phần CSS liên quan
    relevant_css = ""
    
    # Sử dụng cssutils để phân tích CSS
    try:
        sheet = cssutils.parseString(all_css)
    except Exception as e:
        print(f"Lỗi khi phân tích CSS: {e}")
        return ""

    for rule in sheet:
        if rule.type == rule.STYLE_RULE:
            if _is_relevant_rule(rule):
                css_text = rule.cssText
                if css_text is not None:
                    relevant_css += css_text + "\n"
        elif rule.type == rule.MEDIA_RULE:
            media_css = ""
            for subrule in rule:
                if subrule.type == subrule.STYLE_RULE:
                    if _is_relevant_rule(subrule):
                        css_text = subrule.cssText
                        if css_text is not None:
                            media_css += css_text + "\n"
            if media_css:
                media_rule_text = rule.cssText
                if media_rule_text is not None:
                    relevant_css += media_rule_text.split('{')[0] + '{\n' + media_css + '}\n'

    return relevant_css

def _is_relevant_rule(rule):
    relevant_selectors = [
        'body', 'html', ':root',  # Selectors that often define global styles
        'button', '.button', '.btn', '[type="button"]',  # Button-related selectors
        'a', '.link',  # Link selectors that might define button styles
        'input', 'select', 'textarea',  # Form elements that might have button-like styles
        '#header', '#footer', '.header', '.footer', '.nav', '.navbar',  # Common areas that might define global styles
        '.bg-', '.background-', '.text-', '.font-', '.color-'  # Common class prefixes for styling
    ]

    relevant_properties = [
        'background', 'background-color', 'color', 'font', 'font-family', 'font-style',
        'button', 'btn', 'text', 'fill', 'stroke'
    ]

    # Check if the selector matches any relevant selector
    if any(sel in rule.selectorText.lower() for sel in relevant_selectors):
        return True

    style = rule.style
    for prop in style:
        # Check for relevant properties
        if any(rel_prop in prop.name.lower() for rel_prop in relevant_properties):
            return True
        
        # Check for color values in any property
        if re.search(r'#[0-9A-Fa-f]{3,6}|rgb\(.*?\)|rgba\(.*?\)', prop.value):
            return True
        
        # Check for font-related values
        if re.search(r'font-family|serif|sans-serif|monospace', prop.value, re.IGNORECASE):
            return True

    return False

# Sử dụng hàm
url = "https://www.vsatech.net/"  # URL thực tế
try:
    result = extract_css(url)
    print(result)
except Exception as e:
    print(f"Có lỗi xảy ra khi trích xuất CSS: {e}") Hãy cải tiến đoạn code này sao cho nó lấy các thông tin liên quan đến background_color, button_color,  text_color, và font_style không thừa cũng không thiếu!