# -*- coding: utf-8 -*-
"""
@File    : deploy_cert_service.py
@Date    : 2024-03-31
"""
import traceback

from domain_admin.enums.deploy_status_enum import DeployStatusEnum
from domain_admin.log import logger
from domain_admin.model.certificate_model import CertificateModel
from domain_admin.model.deploy_cert_model import DeployCertModel
from domain_admin.model.host_model import HostModel
from domain_admin.service import issue_certificate_service
from domain_admin.utils import datetime_util


def load_cert_deploy_host(lst):
    """
    @since v1.6.20
    :param lst:
    :return:
    """
    deploy_host_ids = [row['deploy_host_id'] for row in lst]

    deploy_host_rows = HostModel.select().where(
        HostModel.id.in_(deploy_host_ids)
    )

    deploy_host_map = {
        str(row.id): row.to_hidden_dict()
        for row in deploy_host_rows
    }

    for row in lst:
        row['deploy_host'] = deploy_host_map.get(str(row['deploy_host_id']), None)


def handle_deploy_cert(deploy_cert_row):
    """
    根据配置信息部署证书
    @since v1.6.20
    :param deploy_cert_row: DeployCertModel
    :return:
    """
    # 部署证书
    cert_row = CertificateModel.get_by_id(deploy_cert_row.cert_id)

    status = DeployStatusEnum.PENDING

    err = None

    # deploy
    try:
        issue_certificate_service.deploy_certificate_file(
            host_id=deploy_cert_row.deploy_host_id,
            key_content=cert_row.ssl_certificate_key,
            pem_content=cert_row.ssl_certificate,
            key_deploy_path=deploy_cert_row.deploy_key_file,
            pem_deploy_path=deploy_cert_row.deploy_fullchain_file,
            reload_cmd=deploy_cert_row.deploy_reloadcmd
        )
        status = DeployStatusEnum.SUCCESS
    except Exception as e:
        err = e
        logger.error(traceback.format_exc())
        status = DeployStatusEnum.ERROR

    # update status
    DeployCertModel.update(
        status=status,
        update_time=datetime_util.get_datetime(),
    ).where(
        DeployCertModel.id == deploy_cert_row.id
    ).execute()

    return err
