"""バッチ処理の共通関数"""
import logging
import textwrap
from datetime import datetime

from src.db.database import Database
from src.error.exceptions import BatchOperationException, DBException
from src.system_var import constants


def get_batch_statuses() -> tuple[str, str, str]:
    """日付テーブルから、以下を取得して返す。
    - 日次バッチ処理中フラグ
    - dump取得状況区分
    - 処理日（YYYY/MM/DD）

    Raises:
        BatchOperationException: 日付テーブルが取得できないとき、何らかのエラーが発生したとき

    Returns:
        tuple[str, str]: [0]日次バッチ処理中フラグ、dump取得状況区分
    """
    db = Database.get_instance()
    sql = 'SELECT bch_actf, dump_sts_kbn, src05.get_syor_date() AS syor_date FROM src05.hdke_tbl'
    try:
        db.connect()
        hdke_tbl_result = db.execute_select(sql)
    except DBException as e:
        raise BatchOperationException(e)
    finally:
        db.disconnect()

    if len(hdke_tbl_result) == 0:
        raise BatchOperationException('日付テーブルが取得できませんでした')

    # 必ず1件取れる
    hdke_tbl_record = hdke_tbl_result[0]
    batch_processing_flag = hdke_tbl_record['bch_actf']
    dump_status_kbn = hdke_tbl_record['dump_sts_kbn']
    syor_date = hdke_tbl_record['syor_date']
    # 処理日を文字列に変換する
    syor_date_str = datetime.strftime(syor_date, '%Y/%m/%d')

    return batch_processing_flag, dump_status_kbn, syor_date_str


def update_batch_processing_flag_in_processing() -> None:
    """バッチ処理中フラグを処理中に更新する

    Raises:
        BatchOperationException: DB操作の何らかのエラー
    """
    db = Database.get_instance()
    sql = 'UPDATE src05.hdke_tbl SET bch_actf = :in_processing'
    try:
        db.connect()
        db.execute(sql, {'in_processing': constants.BATCH_ACTF_BATCH_IN_PROCESSING})
    except DBException as e:
        raise BatchOperationException(e)
    finally:
        db.disconnect()

    return


def update_batch_process_complete() -> None:
    """バッチ処理を完了とし、処理日、バッチ処理中フラグ、dump処理状態区分を更新する

    Raises:
        BatchOperationException: DB操作の何らかのエラー
    """
    db = Database.get_instance()
    sql = """\
    UPDATE src05.hdke_tbl
    SET
        bch_actf = :batch_complete,
        dump_sts_kbn = :dump_unprocessed,
        syor_date = DATE_FORMAT((src05.get_syor_date() + interval 1 day), '%Y%m%d') -- +1日
    """
    try:
        db.connect()
        db.execute(sql, {
            'batch_complete': constants.BATCH_ACTF_BATCH_UNPROCESSED,
            'dump_unprocessed': constants.DUMP_STATUS_KBN_UNPROCESSED
        })
    except DBException as e:
        raise BatchOperationException(e)
    finally:
        db.disconnect()

    return


def logging_sql(logger: logging.Logger, sql: str) -> None:
    """SQL文をデバッグログで出力する

    Args:
        logger (logging.Logger): ロガー
        sql (str): SQL文
    """
    logger.debug(f'\n{"-" * 15}\n{textwrap.dedent(sql)[1:-1]}\n{"-" * 15}')
