#!/bin/env /opt/rbta/venvs/aldpro-common/bin/python3
import logging

from log import setup_log
from request import APIRequest, Request
from settings import Settings

setup_log()
logger = logging.getLogger("plugin")
logger_console = logging.getLogger("console")


def process_csr(cfg: Settings, api: APIRequest):
    """Обработка CSR и выдача сертификата

    Args:
        cfg: экземпляр класса Settings
        api: экземпляр класса APIRequest
    """

    logger.info("Тип запроса: %s, DN объекта: %s", cfg.pki_cmd, cfg.object_dn)

    # Активный CA
    active_ca_id = api.active_ca_id()
    logger.debug("Активный CA ID = %s", active_ca_id)

    # ID субъекта
    subject_id = api.search_subject_id(cfg.host, "host")
    logger.debug("ID субъекта в базе CA = %s", subject_id)

    # ID шаблона
    template_name = cfg.template
    template_id = api.get_template_id_by_name(template_name)
    logger.debug("ID шаблона %s = %s", template_name, template_id)

    # Проверка csr запроса и создание сертификата
    if api.validate_csr(active_ca_id, subject_id, template_id):
        logger.info("Запрос сертификата для %s в CA %s для шаблона %s", cfg.host, active_ca_id, template_id)
        certificate_id = api.send_csr_request(cfg.host, active_ca_id, subject_id, template_id)
        if not certificate_id:
            logger.error("Ошибка при получении сертификата")
        else:
            certificate = api.get_certificate(certificate_id)
            logger.info("Сертификат выдан")
            if isinstance(certificate, bytes):
                certificate = certificate.decode("utf-8")
            logger_console.info(certificate)


def show_all_templates(cfg: Settings, api: APIRequest):
    """Вывести все шаблона СА

    Args:
        cfg: экземпляр класса Settings
        api: экземпляр класса APIRequest
    """

    logger.info("Тип запроса: %s", cfg.pki_cmd)
    logger.info("Получение списка всех шаблонов СА")
    templates = api.get_templates_with_pagination()
    logger.info("Список всех шаблонов получен")
    template_names = []
    for template in templates:
        for item in template:
            template_names.append(item["name"])
    logger_console.info(template_names)


def show_template(cfg: Settings, api: APIRequest):
    """Вывести параметры шаблонов СА

    Args:
        cfg: экземпляр класса Settings
        api: экземпляр класса APIRequest
    """

    logger.info("Тип запроса: %s", cfg.pki_cmd)
    templates = cfg.template
    template_names = [tmp.strip() for tmp in templates.split(",")]
    if not template_names:
        return
    templates = []
    logger.info("Получение списка выбранных шаблонов СА")
    for template_name in template_names:
        template = api.get_template(template_name)
        if not template:
            logger.error("Шаблон %s не найден", template_name)
        else:
            templates.append(template)
    if templates:
        logger_console.info(templates)


def main():
    """Основная функция"""

    cfg = Settings()
    req = Request(cfg)
    req.auth()
    api = APIRequest(req, cfg)

    cmd = cfg.pki_cmd
    if cmd not in cfg.CMDS:
        logger_console.error("Команда %s не поддерживается", cmd)

    # Обработать CSR запрос
    if cmd == "CSR":
        process_csr(cfg, api)

    # Вывести все шаблоны
    if cmd == "GET_TEMPLATES_ALL":
        show_all_templates(cfg, api)

    # Вывести выбранные шаблоны
    if cmd == "GET_TEMPLATE":
        show_template(cfg, api)


if __name__ == "__main__":
    main()
