from abc import ABCMeta, abstractmethod
from datetime import datetime

from src.batch.common.batch_context import BatchContext
from src.batch.ultmarc.utmp_tables.tables.ultmarc_table import UltmarcTable
from src.db.database import Database

# 処理日を使用するために、configを使用
batch_context = BatchContext.get_instance()


class UltmarcTableMapper(metaclass=ABCMeta):
    """アルトマークテーブルへの登録処理の抽象クラス"""

    record: UltmarcTable
    db: Database
    queries: list[str]
    query_parameter: dict

    def __init__(self, record: list[str], db: Database, table_class: type[UltmarcTable]) -> None:
        self.record = table_class(record)
        self.db = db

        # 実行年月日(文字列)、実行年月日時分秒を設定
        now = datetime.now()
        execute_date_str_ymd = now.strftime('%Y%m%d')
        execute_datetime = now.strftime('%Y/%m/%d %H:%M:%S')
        # クエリリストを初期化
        self.queries = []
        # 共通クエリパラメータを設定
        self.query_parameter = {
            'execute_date_str_ymd': execute_date_str_ymd,
            'execute_datetime': execute_datetime,
            # バッチ共通設定から処理日を取得
            'syor_date': batch_context.syor_date
        }

    @abstractmethod
    def make_query(self):
        pass

    def execute_queries(self):
        if len(self.queries) == 0:
            raise Exception('make_queryを呼び出してから実行してください')

        for query in self.queries:
            if query is None:
                continue

            self.db.execute(query, self.query_parameter)
