#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""
任务模板服务层
处理任务模板相关的业务逻辑
"""

from sqlalchemy.orm import Session
from typing import List, Dict, Any, Optional
from sqlalchemy import and_, desc

from data.models.tasktemplate import VWEDTaskTemplate
from utils.logger import get_logger

# 设置日志
logger = get_logger("services.template_service")

class TemplateService:
    """
    任务模板服务类
    提供任务模板的相关业务操作
    """
    
    @staticmethod
    def get_template_list(
        db: Session,
        page: int = 1,
        page_size: int = 10,
        template_name: Optional[str] = None,
        status: Optional[int] = None
    ) -> Dict[str, Any]:
        """
        获取任务模板列表
        
        Args:
            db: 数据库会话
            page: 页码，从1开始
            page_size: 每页记录数
            template_name: 模板名称，模糊匹配
            status: 状态过滤，0-未启用，1-启用完成
        
        Returns:
            Dict[str, Any]: 包含模板列表和总数的字典
        """
        try:
            # 构建查询条件
            query = db.query(VWEDTaskTemplate)
            
            # 添加筛选条件
            if template_name:
                query = query.filter(VWEDTaskTemplate.template_name.like(f'%{template_name}%'))
            
            if status is not None:
                query = query.filter(VWEDTaskTemplate.template_if_enable == status)
            
            # 计算总数
            total = query.count()
            
            # 添加默认按创建时间倒序排序
            query = query.order_by(desc(VWEDTaskTemplate.created_at))
            
            # 分页处理
            offset = (page - 1) * page_size
            templates = query.offset(offset).limit(page_size).all()
            
            # 格式化返回结果
            result = []
            for template in templates:
                result.append({
                    "id": template.id,
                    "templateName": template.template_name,
                    "templateDescription": template.template_description,
                    "status": template.template_if_enable
                })
            
            return {
                "total": total,
                "list": result
            }
        
        except Exception as e:
            logger.error(f"获取任务模板列表失败: {str(e)}")
            raise Exception(f"获取任务模板列表失败: {str(e)}")
    
    @staticmethod
    def enable_template(db: Session, template_id: str) -> None:
        """
        启用指定的任务模板
        
        当一个模板被启用时，之前已启用的模板会自动被禁用，
        确保系统中始终只有一个处于激活状态的模板。
        
        Args:
            db: 数据库会话
            template_id: 模板ID
        
        Raises:
            Exception: 如果模板不存在或启用过程出错
        """
        try:
            # 检查模板是否存在
            template = db.query(VWEDTaskTemplate).filter(VWEDTaskTemplate.id == template_id).first()
            if not template:
                raise Exception(f"模板不存在: {template_id}")
            
            # 检查模板是否已经启用
            if template.template_if_enable == 1:
                raise Exception(f"该模板已处于启用状态: {template_id}")
            
            # 禁用所有模板
            db.query(VWEDTaskTemplate).update({"template_if_enable": 0})
            
            # 启用当前模板
            template.template_if_enable = 1
            db.commit()
            
            logger.info(f"模板启用成功: {template_id}")
        
        except Exception as e:
            db.rollback()  # 回滚事务
            logger.error(f"模板启用失败: {str(e)}")
            raise Exception(f"模板启用失败: {str(e)}")
    
    @staticmethod
    def get_template_by_id(db: Session, template_id: str) -> Optional[Dict[str, Any]]:
        """
        根据ID获取任务模板详情
        
        Args:
            db: 数据库会话
            template_id: 模板ID
        
        Returns:
            Optional[Dict[str, Any]]: 模板详情，如果不存在则返回None
        """
        try:
            template = db.query(VWEDTaskTemplate).filter(VWEDTaskTemplate.id == template_id).first()
            
            if not template:
                return None
            
            return {
                "id": template.id,
                "templateName": template.template_name,
                "templateDescription": template.template_description,
                "status": template.template_if_enable,
                "templateDir": template.template_dir
            }
        
        except Exception as e:
            logger.error(f"获取任务模板详情失败: {str(e)}")
            raise Exception(f"获取任务模板详情失败: {str(e)}")
    
    @staticmethod
    def get_enabled_template(db: Session) -> Optional[Dict[str, Any]]:
        """
        获取当前启用的任务模板
        
        Args:
            db: 数据库会话
        
        Returns:
            Optional[Dict[str, Any]]: 启用的模板详情，如果不存在则返回None
        """
        try:
            template = db.query(VWEDTaskTemplate).filter(
                VWEDTaskTemplate.template_if_enable == 1
            ).first()
            
            if not template:
                return None
            
            return {
                "id": template.id,
                "templateName": template.template_name,
                "templateDescription": template.template_description,
                "status": template.template_if_enable,
                "templateDir": template.template_dir
            }
        
        except Exception as e:
            logger.error(f"获取启用的任务模板失败: {str(e)}")
            raise Exception(f"获取启用的任务模板失败: {str(e)}") 