import os
import tempfile

from src.aws.s3 import BackupBucket
from src.error.exceptions import FileUploadException
from src.system_var.constants import END_JP_NAME, TEMPORARY_FILENAME
from src.system_var.environments import PROCESS_RESULT_FILENAME
from src.util.execute_datetime import ExecuteDateTime
from src.util.logger import logger_instance as logger
from src.writer.file_writer import JsonWriter


def upload_result_data_process(process_result: dict, execute_datetime: ExecuteDateTime):
    """取得処理実施結果アップロード処理

    Args:
        process_result (dict): 取得処理実行結果辞書オブジェクト
        execute_datetime (ExecuteDateTime): 実行日時取得インスタンス

    Raises:
        FileUploadException: S3のファイルアップロード失敗
    """

    # ① 取得処理実施結果アップロード処理のログを出力する
    logger.info(
        f'I-END-01 取得処理実施結果アップロード処理を開始します')

    try:
        # ② CRMバックアップ保管用バケットに、取得処理実施結果のJSONデータを保管する
        _upload_result(execute_datetime, process_result)
    except Exception as e:
        raise FileUploadException(
            'E-END-01', END_JP_NAME, f'取得処理実施結果のアップロードに失敗しました　ファイル名：[{PROCESS_RESULT_FILENAME}] エラー内容：[{e}]')

    # ③ 取得処理実施結果アップロード処理の終了ログを出力する
    logger.info(f'I-END-03 取得処理実施結果アップロード処理を終了します')

    return


def _upload_result(execute_datetime: ExecuteDateTime, process_result: dict) -> None:
    # 一時ファイル書き込み用の領域を確保
    with tempfile.TemporaryDirectory(prefix=f'{PROCESS_RESULT_FILENAME}_') as tmpdir:
        # アップロード用のファイルをローカルに書き出す
        local_file_path = os.path.join(tmpdir, TEMPORARY_FILENAME)
        writer = JsonWriter(local_file_path, process_result)
        writer.write()
        # ファイルからS3に書き込み
        backup_bucket = BackupBucket()
        backup_bucket.put_result_json(
            f'{execute_datetime.to_path()}/{PROCESS_RESULT_FILENAME}', local_file_path)

    logger.debug(f'D-END-02 取得処理実施結果アップロード 正常終了')
