from src.aws.aws_api_client import AWSAPIClient
from src.error.exceptions import DBException
from src.model.db.hdke_tbl import HdkeTblModel
from src.repositories.base_repository import BaseRepository
from src.repositories.hdke_tbl_repository import HdkeTblRepository
from src.services.base_service import BaseService
from src.system_var import constants


class BatchStatusService(BaseService):

    REPOSITORIES = {
        'hdke_table_repository': HdkeTblRepository
    }
    hdke_table_repository: HdkeTblRepository
    __hdke_table_record: list[HdkeTblModel] = []

    def __init__(self, repositories: dict[str, BaseRepository], clients: dict[str, AWSAPIClient]) -> None:
        super().__init__(repositories, clients)
        self.hdke_table_repository = repositories['hdke_table_repository']
        # サービスインスタンス生成時に日付テーブルを取得する。取得できない場合は例外とする
        try:
            self.__hdke_table_record = self.hdke_table_repository.fetch_all()
        except Exception as e:
            raise DBException(e)

    @property
    def hdke_table_record(self) -> HdkeTblModel:
        """日付テーブルを取得する"""

        # 日付マスタのレコードがあることを確認
        self.__assert_record_exists()
        # 日付テーブルのレコードは必ず1件
        return self.__hdke_table_record[0]

    def is_batch_processing(self):
        """バッチ処理中かどうかを判定する"""

        # 日付マスタのレコードがあることを確認
        self.__assert_record_exists()
        return self.hdke_table_record.bch_actf == constants.BATCH_STATUS_PROCESSING

    def is_dump_processing(self):
        """dump処理処理中かどうかを判定する"""

        # 日付マスタのレコードがあることを確認
        self.__assert_record_exists()
        return self.hdke_table_record.dump_sts_kbn != constants.DUMP_STATUS_UNPROCESSED

    def __assert_record_exists(self):
        """日付テーブルが有ることを保証する"""

        # 日付マスタのレコードがない場合は例外とする
        if len(self.__hdke_table_record) == 0:
            raise DBException('日付テーブルのレコードが存在しません')
