"""実消化&アルトマーク データ転送処理"""

from src.aws.s3 import (JskIOBucket, TransferResultOutputBucket, UltmarcBucket,
                        UltmarcImportBucket)
from src.error.exceptions import BatchOperationException
from src.logging.get_logger import get_logger
from src.manager.jskult_hdke_tbl_manager import JskultHdkeTblManager
from src.system_var import constants

logger = get_logger('実消化＆アルトマークデータ転送')


def exec():
    try:
        # ① 処理開始ログを出力する
        logger.info('I-1 処理開始: 実消化＆アルトマークデータ転送')

        # 転送データリストを初期化する。
        transfer_file_lists = {
            "jsk_transfer_list": [],
            "ult_transfer_list": []
        }

        # ② 日付テーブルのステータスを確認する
        hdke_tbl_manager = JskultHdkeTblManager()
        try:
            # 日次バッチ処置中フラグ、dump処理状態区分、処理日を取得
            batch_processing_flag, dump_status_kbn, syor_date = hdke_tbl_manager.get_batch_statuses()
        except BatchOperationException as e:
            logger.exception(f'日付テーブル取得（異常終了）{e}')
            return constants.BATCH_EXIT_CODE_SUCCESS

        # 日次バッチ処理中の場合、後続の処理は行わない
        if batch_processing_flag == constants.BATCH_ACTF_BATCH_START:
            logger.error('日次バッチ処理中のため、日次バッチ処理を終了します。')
            return constants.BATCH_EXIT_CODE_SUCCESS

        # dump取得が正常終了していない場合、後続の処理は行わない
        if dump_status_kbn != constants.DUMP_STATUS_KBN_COMPLETE:
            logger.error('dump取得が正常終了していないため、日次バッチ処理を終了します。')
            return constants.BATCH_EXIT_CODE_SUCCESS

        logger.info(f'処理日＝{syor_date}')
        logger.info('I-2 日次バッチ処理中フラグ更新')
        # バッチ処理中に更新
        try:
            hdke_tbl_manager.update_batch_process_start()
        except BatchOperationException as e:
            logger.exception(f'処理フラグ更新(未処理→処理中) エラー（異常終了）{e}')
            return constants.BATCH_EXIT_CODE_SUCCESS

        # ③ 実消化データのリストを取得する
        logger.info('I-3 実消化データリスト取得開始')
        jsk_receive_file_list = None
        try:
            jsk_io_bucket = JskIOBucket()
            jsk_receive_file_list: str = jsk_io_bucket.get_file_list()
        except Exception as e:
            logger.exception(f'実消化データリスト取得に失敗しました。{e}')
            return constants.BATCH_EXIT_CODE_SUCCESS
        logger.info(f'I-4 実消化データリスト取得終了。取得データ一覧：{jsk_receive_file_list}')

        # ④ 取得した実消化データのリストでループ開始
        logger.info(f'I-5 実消化データ転送処理開始')
        for receive_file in jsk_receive_file_list:
            # ⑤ 取得したデータを実消化＆アルトマークバックアップバケットにコピーする
            jsk_io_bucket.backup_file(receive_file, syor_date)
            # ⑥ 取得したデータをデータ登録バケットにコピーする
            jsk_io_bucket.transfer_file_to_import(receive_file)
            # ⑦ 転送が完了したデータを元のバケットからファイルを削除する
            jsk_io_bucket.delete_file(receive_file)
            # ⑧ 転送が完了したファイル名を転送データリストに追加する
            # ファイル名のみ切り出して追加
            transfer_file_lists['jsk_transfer_list'].append(
                receive_file['filename'].split('/')[1])

        # ⑨ ループ終了後、実消化データ転送終了ログ（I-6)を出力する
        logger.info(f'I-6 実消化データ転送処理終了')

        # ⑩ アルトマークデータのリストを取得する
        logger.info('I-7 アルトマークデータリスト取得開始')
        ultmarc_receive_file_list = None
        try:
            ultmarc_bucket = UltmarcBucket()
            ultmarc_receive_file_list: str = ultmarc_bucket.get_file_list()
        except Exception as e:
            logger.exception(f'アルトマークデータリスト取得に失敗しました。{e}')
            return constants.BATCH_EXIT_CODE_SUCCESS
        logger.info(
            f'I-8 アルトマークデータリスト取得終了。取得データ一覧：{ultmarc_receive_file_list}')

        # ⑪ 取得したアルトマークデータのリストでループ開始
        logger.info(f'I-9 アルトマークデータ転送処理開始')
        ultmarc_bucket_import_folder = UltmarcImportBucket()
        for receive_file in ultmarc_receive_file_list:
            # ⑫ 取得したデータを実消化＆アルトマークバックアップバケットにコピーする
            ultmarc_bucket.backup_file(receive_file, syor_date)
            # ⑬ 取得したデータをデータ登録バケットにコピーする
            ultmarc_bucket_import_folder.transfer_file_to_import(receive_file)
            # ⑭ 転送が完了したデータを元のバケットからファイルを削除する
            ultmarc_bucket.delete_file(receive_file)
            # ⑮ 転送が完了したファイル名を転送データリストに追加する
            # ファイル名のみ切り出して追加
            transfer_file_lists['ult_transfer_list'].append(
                receive_file['filename'].split('/')[1])

        # ⑯ ループ終了後、アルトマークデータ転送終了ログ（I-10)を出力する
        logger.info(f'I-6 実消化データ転送処理終了')

        # ⑰ 転送データリストをJSONファイル化し、S3バケットにアップロードする
        TransferResultOutputBucket().put_transfer_result(transfer_file_lists, syor_date)

        # ⑱ 処理終了ログ(I-12)を出力する
        logger.info(f'I-12 処理終了: 実消化＆アルトマークデータ転送')

        return constants.BATCH_EXIT_CODE_SUCCESS

    except Exception as e:
        logger.exception(f'実消化&アルトマーク データ転送処理中に想定外のエラーが発生しました {e}')
        raise e
