#!/usr/bin/env python3
"""
加盟商状态同步 - 真实企业微信版本
每分钟执行一次，真正连接企业微信智能表格
"""

import os
import sys
import json
import time
import logging
import subprocess
from datetime import datetime

# 配置信息
CONFIG = {
    "docid": "dcyeOLceOJqbuQpvY_EyivG5xx0cCPcT2x4kZ3UtkVJBhGqrD7wdc_iKB3za3vqq0foQifL-Y2npwGb1bl6Hb9EQ",
    "status_sheet_id": "q979lj",
    "progress_sheet_id": "MAqXdi",
    "status_field": "状态",
    "franchisee_field": "加盟商名称",
    "terminated_status": "签约后终止",
    "renewed_status": "再次签约",
}

# 设置日志
log_file = "/var/log/franchisee_real.log"
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler(log_file),
        logging.StreamHandler()
    ]
)

def call_wecom_mcp(category, method, args):
    """调用企业微信MCP工具"""
    try:
        # 构建命令
        args_json = json.dumps(args, ensure_ascii=False)
        cmd = ["wecom_mcp", "call", category, method, args_json]
        
        logging.debug(f"执行命令: {' '.join(cmd)}")
        
        # 执行命令
        result = subprocess.run(
            cmd,
            capture_output=True,
            text=True,
            timeout=30
        )
        
        if result.returncode == 0:
            try:
                return json.loads(result.stdout)
            except json.JSONDecodeError:
                logging.error(f"JSON解析失败: {result.stdout}")
                return {"errcode": -1, "errmsg": "JSON解析失败"}
        else:
            logging.error(f"命令执行失败: {result.stderr}")
            return {"errcode": -1, "errmsg": result.stderr}
            
    except subprocess.TimeoutExpired:
        logging.error("命令执行超时")
        return {"errcode": -1, "errmsg": "执行超时"}
    except Exception as e:
        logging.error(f"调用MCP工具异常: {e}")
        return {"errcode": -1, "errmsg": str(e)}

def get_status_records():
    """获取加盟商状态表记录"""
    logging.info("获取加盟商状态表记录...")
    
    args = {
        "docid": CONFIG["docid"],
        "sheet_id": CONFIG["status_sheet_id"]
    }
    
    result = call_wecom_mcp("doc", "smartsheet_get_records", args)
    
    if result.get("errcode") == 0:
        records = result.get("records", [])
        logging.info(f"成功获取 {len(records)} 条记录")
        
        # 处理记录格式
        processed_records = []
        for record in records:
            processed_record = {
                "record_id": record.get("record_id"),
                "加盟商名称": None,
                "状态": None
            }
            
            # 提取字段值
            values = record.get("values", {})
            if CONFIG["franchisee_field"] in values:
                field_value = values[CONFIG["franchisee_field"]]
                if isinstance(field_value, list) and len(field_value) > 0:
                    if "text" in field_value[0]:
                        processed_record["加盟商名称"] = field_value[0]["text"]
            
            if CONFIG["status_field"] in values:
                field_value = values[CONFIG["status_field"]]
                if isinstance(field_value, list) and len(field_value) > 0:
                    if "text" in field_value[0]:
                        processed_record["状态"] = field_value[0]["text"]
            
            processed_records.append(processed_record)
        
        return processed_records
    else:
        logging.error(f"获取记录失败: {result.get('errmsg')}")
        return []

def get_progress_records():
    """获取工期进度表记录"""
    logging.info("获取工期进度表记录...")
    
    args = {
        "docid": CONFIG["docid"],
        "sheet_id": CONFIG["progress_sheet_id"]
    }
    
    result = call_wecom_mcp("doc", "smartsheet_get_records", args)
    
    if result.get("errcode") == 0:
        records = result.get("records", [])
        logging.info(f"成功获取 {len(records)} 条工期进度记录")
        
        # 构建加盟商名称到record_id的映射
        franchisee_to_record_id = {}
        for record in records:
            values = record.get("values", {})
            if CONFIG["franchisee_field"] in values:
                field_value = values[CONFIG["franchisee_field"]]
                if isinstance(field_value, list) and len(field_value) > 0:
                    if "text" in field_value[0]:
                        franchisee_name = field_value[0]["text"]
                        franchisee_to_record_id[franchisee_name] = record.get("record_id")
        
        return franchisee_to_record_id
    else:
        logging.error(f"获取工期进度记录失败: {result.get('errmsg')}")
        return {}

def delete_progress_record(franchisee_name, record_id):
    """删除工期进度记录"""
    logging.info(f"删除加盟商 {franchisee_name} 的工期进度记录")
    
    args = {
        "docid": CONFIG["docid"],
        "sheet_id": CONFIG["progress_sheet_id"],
        "record_ids": [record_id]
    }
    
    result = call_wecom_mcp("doc", "smartsheet_delete_records", args)
    
    if result.get("errcode") == 0:
        logging.info(f"成功删除加盟商 {franchisee_name} 的记录")
        return True
    else:
        logging.error(f"删除记录失败: {result.get('errmsg')}")
        return False

def add_progress_record(franchisee_name):
    """添加工期进度记录"""
    logging.info(f"添加加盟商 {franchisee_name} 的工期进度记录")
    
    # 创建记录数据
    record = {
        "values": {
            CONFIG["franchisee_field"]: [{"type": "text", "text": franchisee_name}],
            "项目阶段": [{"text": "初始阶段"}],
            "当前进度": 0,
            "负责人": [{"type": "text", "text": "待分配"}]
        }
    }
    
    args = {
        "docid": CONFIG["docid"],
        "sheet_id": CONFIG["progress_sheet_id"],
        "records": [record]
    }
    
    result = call_wecom_mcp("doc", "smartsheet_add_records", args)
    
    if result.get("errcode") == 0:
        logging.info(f"成功添加加盟商 {franchisee_name} 的记录")
        return True
    else:
        logging.error(f"添加记录失败: {result.get('errmsg')}")
        return False

def check_status_changes(last_status, current_records):
    """检查状态变化"""
    changes = {"terminated": [], "renewed": []}
    
    for record in current_records:
        franchisee = record.get("加盟商名称")
        status = record.get("状态")
        
        if not franchisee or not status:
            continue
            
        last = last_status.get(franchisee)
        
        # 检查状态变化
        if last != status:
            logging.info(f"状态变化: {franchisee} - {last} -> {status}")
            
            if status == CONFIG["terminated_status"]:
                changes["terminated"].append({
                    "name": franchisee,
                    "record_id": record.get("record_id")
                })
            elif status == CONFIG["renewed_status"]:
                changes["renewed"].append({
                    "name": franchisee,
                    "record_id": record.get("record_id")
                })
                
        # 更新最后状态
        last_status[franchisee] = status
        
    return changes, last_status

def main():
    """主函数"""
    try:
        logging.info("=" * 60)
        logging.info("加盟商状态同步任务开始执行")
        logging.info(f"执行时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
        logging.info(f"文档ID: {CONFIG['docid']}")
        logging.info("=" * 60)
        
        # 状态跟踪文件
        status_file = "/tmp/franchisee_real_status.json"
        
        # 加载上次状态
        last_status = {}
        if os.path.exists(status_file):
            try:
                with open(status_file, 'r', encoding='utf-8') as f:
                    last_status = json.load(f)
                logging.info(f"加载了 {len(last_status)} 个加盟商的上次状态")
            except Exception as e:
                logging.warning(f"加载状态文件失败: {e}")
        
        # 获取当前状态记录
        current_records = get_status_records()
        if not current_records:
            logging.warning("未获取到加盟商状态记录，跳过本次检查")
            return
        
        # 获取当前工期进度记录
        progress_records = get_progress_records()
        
        # 检查状态变化
        changes, updated_status = check_status_changes(last_status, current_records)
        
        # 执行同步操作
        if changes["terminated"]:
            logging.info(f"发现 {len(changes['terminated'])} 个终止加盟商")
            for franchisee_info in changes["terminated"]:
                franchisee_name = franchisee_info["name"]
                if franchisee_name in progress_records:
                    delete_progress_record(franchisee_name, progress_records[franchisee_name])
                else:
                    logging.warning(f"加盟商 {franchisee_name} 不在工期进度表中")
        
        if changes["renewed"]:
            logging.info(f"发现 {len(changes['renewed'])} 个再次签约加盟商")
            for franchisee_info in changes["renewed"]:
                franchisee_name = franchisee_info["name"]
                if franchisee_name not in progress_records:
                    add_progress_record(franchisee_name)
                else:
                    logging.info(f"加盟商 {franchisee_name} 已在工期进度表中")
        
        # 保存更新后的状态
        try:
            with open(status_file, 'w', encoding='utf-8') as f:
                json.dump(updated_status, f, ensure_ascii=False, indent=2)
            logging.info(f"保存了 {len(updated_status)} 个加盟商的当前状态")
        except Exception as e:
            logging.error(f"保存状态文件失败: {e}")
        
        if not changes["terminated"] and not changes["renewed"]:
            logging.info("未发现状态变化")
        
        logging.info("=" * 60)
        logging.info("加盟商状态同步任务执行完成")
        logging.info(f"完成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
        logging.info("=" * 60)
        
        return 0
        
    except Exception as e:
        logging.error(f"任务执行失败: {e}", exc_info=True)
        return 1

if __name__ == "__main__":
    exit_code = main()
    sys.exit(exit_code)