from data_access.data_config import format_date_to_str, SURVEY_COMPLETION_TABLE, SURVEY_TBC_COL, SURVEY_COMPLETE_COL, LOG_LEVEL
from data_access.ddb_util import put_item_ddb, get_item_ddb, DDBUpdateBuilder
import logging

logger = logging.getLogger('SurveyCompletion')
logger.setLevel(LOG_LEVEL)


def initialize_survey_to_complete(user_id, report_date, surveys_to_take):
    report_date_str = format_date_to_str(report_date)
    item = {
        'Patient_ID': user_id,
        'Report_Date': report_date_str,
        SURVEY_COMPLETE_COL: [],
        SURVEY_TBC_COL: surveys_to_take,
        'Outreach_Status': 'None'
    }
    put_item_ddb(SURVEY_COMPLETION_TABLE, item)


def already_scheduled_outreach(user_id, report_date):
    entry = get_survey_completion_entry(user_id, format_date_to_str(report_date))
    if not entry:
        logger.info(f'Did not find entry for {user_id} and {report_date}. ')
        return False
    if 'Execution_ID' in entry:
        logger.info(f'{user_id} and {report_date} already have outreach workflow started: {entry["Execution_ID"]}')
        return True
    return False


def get_survey_completion_entry(user_id, report_date_str):
    key = {'Patient_ID': user_id, 'Report_Date': report_date_str}
    entry = get_item_ddb(SURVEY_COMPLETION_TABLE, Key=key)
    return entry


def get_next_survey_bot(user_id, report_date):
    report_date_str = format_date_to_str(report_date)
    survey_entry = get_survey_completion_entry(user_id, report_date_str)
    if not survey_entry:
        return None
    if SURVEY_TBC_COL not in survey_entry or len(survey_entry[SURVEY_TBC_COL]) == 0:
        logger.info(f'No more surveys for {user_id} and {report_date_str}')
        return None
    surveys_to_complete = survey_entry[SURVEY_TBC_COL]
    top_survey = surveys_to_complete[0]
    next_bot = top_survey['BotName']
    logger.info(f'Next bot for {user_id} and {report_date_str} is {next_bot}.')
    return next_bot


def update_survey_completion(user_id, report_date, bot_name, require_follow_up=False):
    report_date_str = format_date_to_str(report_date)
    survey_entry = get_survey_completion_entry(user_id, report_date_str)
    if not survey_entry:
        logger.info('No survey completion entry to update. do nothing.')
        return
    if SURVEY_TBC_COL not in survey_entry or len(survey_entry[SURVEY_TBC_COL]) == 0:
        logger.info('All survey already completed. do nothing')
        return

    surveys_to_complete = survey_entry[SURVEY_TBC_COL]
    survey_completed = survey_entry[SURVEY_COMPLETE_COL]
    new_surveys_to_complete = []
    for s in surveys_to_complete:
        if s['BotName'] == bot_name:
            survey_completed.append(s)
        else:
            new_surveys_to_complete.append(s)
    with DDBUpdateBuilder(
            key={'Patient_ID': user_id, 'Report_Date': report_date_str},
            table_name=SURVEY_COMPLETION_TABLE) as ddb_update_builder:
        ddb_update_builder.update_attr(SURVEY_COMPLETE_COL, survey_completed)
        ddb_update_builder.update_attr(SURVEY_TBC_COL, new_surveys_to_complete)