#!/usr/bin/env python3
"""
多米尼加政府采购平台招标信息爬虫
每天下午6点爬取当日新招标，发送Excel报告
"""

import json
import os
from datetime import datetime, timedelta
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, PatternFill
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

# 配置
DATA_FILE = "/Users/agent/Downloads/tenders/tenders.json"
EMAIL_FILE = "/Users/agent/Downloads/tenders/report.xlsx"
TODAY = datetime.now().strftime("%Y-%m-%d")

# 关键词
KEYWORDS = [
    "solar", "fotovoltaic", "panel solar",  # 太阳能
    "cargador", "carga eléctrica", "electrolinera",  # 充电桩
    "medidor", "contador", "agua", "acueduct",  # 电表水表
    "transformador", "ctpt", "recloser", "重合器",  # 变压器
    "subestación", "eléctric", "led", "lámpara",  # 电力设备
    "alumbrado", "iluminación",  # 照明
    "postes", "cable", "generador", "batería",  # 电杆电缆
]

def filter_tenders(tenders):
    """筛选相关招标"""
    filtered = []
    for t in tenders:
        text = (t.get("title", "") + " " + t.get("entity", "")).lower()
        if any(kw in text for kw in KEYWORDS):
            filtered.append(t)
    return filtered

def create_excel(tenders, filename):
    """生成Excel报告"""
    wb = Workbook()
    ws = wb.active
    ws.title = "招标信息"
    
    # 表头样式
    header_font = Font(bold=True, color="FFFFFF")
    header_fill = PatternFill(start_color="4472C4", end_color="4472C4", fill_type="solid")
    header_alignment = Alignment(horizontal="center", vertical="center")
    
    headers = ["招标编号", "采购单位", "项目名称", "发布日期", "截止日期", "预算", "状态"]
    for col, header in enumerate(headers, 1):
        cell = ws.cell(row=1, column=col, value=header)
        cell.font = header_font
        cell.fill = header_fill
        cell.alignment = header_alignment
    
    # 写入数据
    for row, t in enumerate(tenders, 2):
        ws.cell(row=row, column=1, value=t.get("code", ""))
        ws.cell(row=row, column=2, value=t.get("entity", ""))
        ws.cell(row=row, column=3, value=t.get("title", ""))
        ws.cell(row=row, column=4, value=t.get("publish_date", ""))
        ws.cell(row=row, column=5, value=t.get("deadline", ""))
        ws.cell(row=row, column=6, value=t.get("price", ""))
        ws.cell(row=row, column=7, value=t.get("status", ""))
    
    # 调整列宽
    ws.column_dimensions['A'].width = 25
    ws.column_dimensions['B'].width = 30
    ws.column_dimensions['C'].width = 50
    ws.column_dimensions['D'].width = 20
    ws.column_dimensions['E'].width = 20
    ws.column_dimensions['F'].width = 20
    ws.column_dimensions['G'].width = 15
    
    wb.save(filename)
    print(f"Excel已生成: {filename}")

def send_email(tenders, filename):
    """发送邮件"""
    if not tenders:
        print("没有新招标，不发送邮件")
        return
    
    sender = "fengxia569@163.com"
    password = "ZZ38a32nQEwTe2Wn"
    receivers = ["evelyn@hxgroup.com", "feng.xia@hxgroup.com"]
    
    # 构建邮件
    msg = MIMEMultipart()
    msg['From'] = sender
    msg['To'] = ",".join(receivers)
    msg['Subject'] = Header(f"📋 招标通知 - {TODAY} - {len(tenders)}条", 'utf-8')
    
    # 邮件正文
    body = f"""Hola,

Se han encontrado {len(tenders)} licitaciones relacionadas con solar/electricidad/hidráulicas del día de hoy.

关键词: solar, cargador, medidor, transformador, ctpt, recloser, etc.

Archivos adjuntos: Excel con los detalles.

Saludos,
Equipo HX Group

---
Este correo no requiere respuesta."""
    
    msg.attach(MIMEText(body, 'plain', 'utf-8'))
    
    # 添加附件
    with open(filename, 'rb') as f:
        part = MIMEBase('application', 'octet-stream')
        part.set_payload(f.read())
    encoders.encode_base64(part)
    part.add_header('Content-Disposition', f'attachment; filename=licitaciones_{TODAY}.xlsx')
    msg.attach(part)
    
    try:
        server = smtplib.SMTP_SSL('smtp.163.com', 465)
        server.login(sender, password)
        server.sendmail(sender, receivers, msg.as_string())
        server.quit()
        print(f"✅ 邮件已发送给: {receivers}")
    except Exception as e:
        print(f"❌ 邮件发送失败: {e}")

def main():
    print(f"[{datetime.now()}] 招标爬取任务开始...")
    
    # 加载历史数据
    existing = []
    if os.path.exists(DATA_FILE):
        with open(DATA_FILE, "r", encoding="utf-8") as f:
            existing = json.load(f)
    
    print(f"历史招标: {len(existing)} 条")
    
    # 今日新招标（这里需要浏览器获取，实际运行时由外部调用）
    # 由于网站是动态加载的，需要用浏览器访问
    # 这里标记需要手动运行爬取
    
    print("请运行: 浏览器爬取招标数据")
    print("然后运行: python3 tenders_send.py")

if __name__ == "__main__":
    main()
