# -------------------------------------------------------------------------
#  This file is part of the MindStudio project.
# Copyright (c) 2025 Huawei Technologies Co.,Ltd.
#
# MindStudio is licensed under Mulan PSL v2.
# You can use this software according to the terms and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
#
#          http://license.coscl.org.cn/MulanPSL2
#
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v2 for more details.
# -------------------------------------------------------------------------

from sqlalchemy import Column, Integer, String, Enum, UniqueConstraint, Boolean, inspect
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.types import JSON

from atk.configs.results_config import RunStatus
from atk.configs.results_config import ProcessStatus
from atk.db.models.base import BaseDb


class CaseResult(BaseDb):
    __tablename__ = 'case_result'  # 主键

    case_id = Column(Integer, unique=True, index=True)
    case_name = Column(String, index=True)
    case_results = Column(JSON)
    run_status = Column(Enum(RunStatus))
    create_task_status = Column(Enum(ProcessStatus))
    save_db_status = Column(Enum(ProcessStatus))
    save_report_status = Column(Enum(ProcessStatus))
    clean_data_status = Column(Enum(ProcessStatus))
    retry_times = Column(Integer)

    def __init__(self, **kwargs):
        # ORM模型的默认值只在insert时生效
        kwargs.setdefault("run_status", RunStatus.UNDO)
        kwargs.setdefault("create_task_status", ProcessStatus.UNDO)
        kwargs.setdefault("save_db_status", ProcessStatus.UNDO)
        kwargs.setdefault("save_report_status", ProcessStatus.UNDO)
        kwargs.setdefault("clean_data_status", ProcessStatus.UNDO)
        kwargs.setdefault("retry_times", 0)
        super().__init__(**kwargs)

    __table_args__ = (UniqueConstraint('case_id', 'case_name', name='uix_case_id_case_name'),)

    def __str__(self):
        return (f'CaseResult: {self.case_name}_{self.case_id}'
                f', run_status={self.run_status}'
                f', create_task_status={self.create_task_status}'
                f', save_db_status={self.save_db_status}'
                f', save_report_status={self.save_report_status}'
                f', clean_data_status={self.clean_data_status}'
                f', case_results={self.case_results}'
                f', retry_times={self.retry_times}'
                )

    @hybrid_property
    def case_op_name(self):
        """将 case_index 和 op_name 拼接成一个字段"""
        return f"{self.case_id}_{self.case_name}"

    def to_dict(self):
        return {c.key: getattr(self, c.key)
                for c in inspect(self).mapper.columns}