#!/usr/bin/env python3
"""
自动化招标检索爬虫
使用 Selenium 爬取多米尼加政府采购平台
"""
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.service import Service
from datetime import datetime
import smtplib
from email.mime.text import MIMEText
import subprocess
import time

KEYWORDS = ['solar', 'fotovoltaico', 'cargador', 'medidor', 'transformador', 
            'ctpt', 'recloser', 'led', 'medidor de agua', 'acueduct', 'batería', 'battery']

TODAY = datetime.now().strftime('%Y-%m-%d')
BASE_URL = "https://comunidad.comprasdominicana.gob.do/Public/Tendering/ContractNoticeManagement/Index"

def setup_driver():
    """设置 Chrome 驱动"""
    options = Options()
    options.add_argument('--headless')  # 无头模式
    options.add_argument('--no-sandbox')
    options.add_argument('--disable-dev-shm-usage')
    options.add_argument('--disable-gpu')
    options.add_argument('--window-size=1920,1080')
    
    driver = webdriver.Chrome(options=options)
    return driver

def search_and_get_tenders(driver, keyword):
    """搜索关键词并获取招标列表"""
    tenders = []
    
    try:
        # 打开页面
        driver.get(BASE_URL)
        time.sleep(5)
        
        # 找到搜索框并输入关键词
        search_box = driver.find_element(By.CSS_SELECTOR, 'input[type="search"]')
        search_box.clear()
        search_box.send_keys(keyword)
        
        # 点击搜索按钮
        search_btn = driver.find_element(By.CSS_SELECTOR, 'button[type="submit"]')
        search_btn.click()
        
        # 等待结果加载
        time.sleep(5)
        
        # 获取表格中的数据
        rows = driver.find_elements(By.CSS_SELECTOR, 'table tbody tr')
        
        for row in rows:
            try:
                cells = row.find_elements(By.TAG_NAME, 'td')
                if len(cells) >= 6:
                    # 提取发布日期
                    publish_date = cells[3].text.strip() if len(cells) > 3 else ""
                    
                    # 只获取今天的招标
                    if TODAY.replace('-', '/') in publish_date or TODAY in publish_date:
                        tender = {
                            'authority': cells[0].text.strip(),
                            'reference': cells[1].text.strip(),
                            'description': cells[2].text.strip(),
                            'publish_date': publish_date,
                            'deadline': cells[4].text.strip() if len(cells) > 4 else "",
                            'price': cells[5].text.strip() if len(cells) > 5 else "",
                            'status': cells[6].text.strip() if len(cells) > 6 else ""
                        }
                        tenders.append(tender)
            except Exception as e:
                continue
                
    except Exception as e:
        print(f"搜索 {keyword} 时出错: {e}")
    
    return tenders

def filter_relevant_tenders(tenders):
    """过滤相关招标（基于关键词）"""
    relevant = []
    for t in tenders:
        desc = t['description'].lower()
        ref = t['reference'].lower()
        
        for kw in KEYWORDS:
            if kw.lower() in desc or kw.lower() in ref:
                relevant.append(t)
                break
    
    return relevant

def send_email(tenders):
    """发送邮件"""
    body = f"""📋 招标检索结果 ({TODAY})

关键词：{', '.join(KEYWORDS)}

"""
    
    if tenders:
        body += f"找到 {len(tenders)} 条相关招标：\n\n"
        for t in tenders:
            body += f"""【{t['reference']}】
机构：{t['authority']}
项目：{t['description'][:100]}...
金额：{t['price']}
状态：{t['status']}
截止：{t['deadline']}
---
"""
    else:
        body += "结论：今日无符合关键词的新招标\n"

    body += """
---
数据来源：https://comunidad.comprasdominicana.gob.do

自动生成
"""

    msg = MIMEText(body, 'plain', 'utf-8')
    msg['Subject'] = f"招标检索结果 - {TODAY}"
    msg['From'] = 'fengxia569@163.com'
    msg['To'] = 'feng.xia@hxgroup.com'

    server = smtplib.SSL('smtp.163.com', 465)
    server.login('fengxia569@163.com', 'ZZ38a32nQEwTe2Wn')
    server.send_message(msg)
    server.quit()
    print(f"邮件已发送，共 {len(tenders)} 条")

def main():
    print(f"=== 开始自动招标检索 ({TODAY}) ===")
    
    all_tenders = []
    
    try:
        driver = setup_driver()
        
        for keyword in KEYWORDS:
            print(f"搜索: {keyword}")
            tenders = search_and_get_tenders(driver, keyword)
            relevant = filter_relevant_tenders(tenders)
            all_tenders.extend(relevant)
            print(f"  找到 {len(relevant)} 条相关招标")
            time.sleep(2)
        
        driver.quit()
        
    except Exception as e:
        print(f"出错: {e}")
    
    # 去重
    seen = set()
    unique_tenders = []
    for t in all_tenders:
        if t['reference'] not in seen:
            seen.add(t['reference'])
            unique_tenders.append(t)
    
    # 发送邮件
    send_email(unique_tenders)
    print("=== 完成 ===")

if __name__ == '__main__':
    main()
