from src.aws.s3 import ConfigBucket
from src.config.objects import LastFetchDatetime, TargetObject
from src.error.exceptions import FileNotFoundException, InvalidConfigException
from src.parser.json_parser import JsonParser
from src.system_var.constants import DATE_JP_NAME
from src.system_var.environments import (CRM_CONFIG_BUCKET,
                                         LAST_FETCH_DATE_FOLDER)
from src.util.execute_datetime import ExecuteDateTime
from src.util.logger import logger_instance as logger


def set_datetime_period_process(target_object: TargetObject, execute_datetime: ExecuteDateTime):
    """データ取得期間設定処理

    Args:
        target_object (TargetObject): 取得対象オブジェクト情報インスタンス
        execute_datetime (ExecuteDateTime): 実行日時取得インスタンス

    Raises:
        FileNotFoundException: S3上のファイルが存在しない場合
        InvalidConfigException: オブジェクト情報定義が不正だった場合

    Returns:
        last_fetch_datetime: データ取得期間設定インスタンス
    """

    # ① データ取得期間設定処理の開始ログを出力する
    logger.info(
        f'I-DATE-01 [{target_object.object_name}] のデータ取得期間設定処理を開始します')

    try:
        # ② S3 設定ファイル保管用バケットから、前回取得日時ファイルを取得する
        logger.info(
            f'I-DATE-02 前回取得日時ファイルの取得開始します ファイルパス：[s3://{CRM_CONFIG_BUCKET}/{LAST_FETCH_DATE_FOLDER}/{target_object.last_fetch_datetime_file_name}]')

        s3_config_bucket = ConfigBucket()
        last_fetch_datetime_file_str = s3_config_bucket.get_last_fetch_datetime_file(
            target_object.last_fetch_datetime_file_name)

        logger.info(f'I-DATE-03 前回取得日時ファイルの取得成功しました')

    except Exception as e:
        raise FileNotFoundException(
            'E-DATE-01', DATE_JP_NAME, f'前回取得日時ファイルが存在しません　ファイル名：[{target_object.last_fetch_datetime_file_name}] エラー内容：[{e}]')

    try:
        # ③ 取得した前回取得日時ファイルの形式チェックを行う
        # ④ データの取得期間を設定する
        logger.debug(f'D-DATE-04 前回取得日時ファイルの形式チェックを開始します')

        json_parser = JsonParser(last_fetch_datetime_file_str)
        last_fetch_datetime_file_dict = json_parser.parse()

        last_fetch_datetime = LastFetchDatetime(last_fetch_datetime_file_dict, execute_datetime)

        logger.debug(f'D-DATE-05 前回取得日時ファイルの形式チェック 正常終了')
        logger.info(
            f'I-DATE-06 取得範囲 From: [{last_fetch_datetime.last_fetch_datetime_from}] To: [{last_fetch_datetime.last_fetch_datetime_to}]')

    except Exception as e:
        raise InvalidConfigException(
            'E-DATE-02', DATE_JP_NAME, f'前回取得日時ファイルの形式チェック処理が失敗しました エラー内容：[{e}]')

    # ⑤ データ取得準備処理の終了ログを出力する
    logger.info(
        f'I-DATE-07 [{target_object.object_name}] のデータ取得期間設定処理を終了します')

    # ⑥ 次の処理へ移行する
    return last_fetch_datetime
