# By: Riasat Ullah
# This file contains validation code for report data.

from utils import constants, helpers
from validations import string_validator
import datetime


def validate_postmortem_report_data(report_status, complete_by, reviewers, sessions):
    '''
    Validates the postmortem report.
    :param report_status: the status of the report
    :param complete_by: the date by which the report should be completed
    :param reviewers: (list) of list of reviewers -> [ [policy id, display name, role], ... ]
    :param sessions: (list) of list of sessions data -> [ [session date, session time, duration], ... ]
    :errors: AssertionError
    '''
    assert report_status in [constants.draft, constants.in_review, constants.reviewed, constants.closed]
    if complete_by is not None:
        assert helpers.is_date_str_or_date(complete_by)

    # validate the reviewers data
    assert isinstance(reviewers, list)
    for item in reviewers:
        assert isinstance(item, list)
        assert len(item) == 3
        assert isinstance(item[0], int)
        assert string_validator.is_not_sql_injection(item[1])
        assert item[2] in [constants.collaborator, constants.reviewer]

    # validate the sessions data
    assert isinstance(sessions, list)
    for item in sessions:
        assert isinstance(item, list)
        assert len(item) == 3
        assert helpers.is_date_str_or_date(item[0])
        try:
            datetime.datetime.strptime(item[1], constants.time_format).time()
        except (TypeError, ValueError):
            datetime.datetime.strptime(item[1], constants.json_time_format).time()
        except (TypeError, ValueError):
            raise AssertionError
        assert isinstance(item[2], float) or isinstance(item[2], int)
