def fixture_num_assists(seasons=CHECK_SEASONS, session=session):
    """Check number of assists is less than or equal to number of goals
    for home and away team in each fixture.
    Less than or equal to as some goals do not result in an assist being
    awarded.

    Keyword Arguments:
        seasons {[type]} -- seasons to check (default: {CHECK_SEASONS})
        session {SQLAlchemy session} -- DB session (default:
        airsenal.framework.schema.session)
    """
    print("Checking no. assists less than or equal to no. goals...\n")
    n_error = 0

    for season in seasons:
        fixtures = get_fixtures_for_season(season=season)

        for fixture in fixtures:
            result = get_result_for_fixture(fixture)

            if result:
                result = result[0]
                home_scores = (
                    session.query(PlayerScore)
                    .filter_by(fixture=fixture, player_team=fixture.home_team)
                    .all()
                )

                away_scores = (
                    session.query(PlayerScore)
                    .filter_by(fixture=fixture, player_team=fixture.away_team)
                    .all()
                )

                home_assists = sum([score.assists for score in home_scores])
                away_assists = sum([score.assists for score in away_scores])

                if home_assists > result.home_score:
                    n_error += 1
                    print(
                        "{}: Player assists sum to {} but {} goals in result for home team".format(
                            fixture_string(fixture, result),
                            home_assists,
                            result.home_score,
                        )
                    )

                if away_assists > result.away_score:
                    n_error += 1
                    print(
                        "{}: Player assists sum to {} but {} goals in result for away team".format(
                            fixture_string(fixture, result),
                            away_assists,
                            result.away_score,
                        )
                    )

    print("\n", result_string(n_error))
    return n_error
def fixture_num_conceded(seasons=CHECK_SEASONS, session=session):
    """Check number of goals concdeded equals goals scored by opposition if 
    player played whole match (90 minutes).
    NB: only checks max of player conceded values to avoid potential issues
    with substitutes and goals in stoppage time.
    
    Keyword Arguments:
        seasons {[type]} -- seasons to check (default: {CHECK_SEASONS})
        session {SQLAlchemy session} -- DB session (default:
        airsenal.framework.schema.session)
    """
    print("Checking no. goals conceded matches goals scored by opponent...\n")
    n_error = 0

    for season in seasons:
        fixtures = get_fixtures_for_season(season=season)

        for fixture in fixtures:
            result = get_result_for_fixture(fixture)

            if result:
                result = result[0]
                home_scores = (session.query(PlayerScore).filter_by(
                    fixture=fixture, player_team=fixture.home_team,
                    minutes=90).all())

                away_scores = (session.query(PlayerScore).filter_by(
                    fixture=fixture, player_team=fixture.away_team,
                    minutes=90).all())

                home_conceded = max([score.conceded for score in home_scores])
                away_conceded = max([score.conceded for score in away_scores])

                if home_conceded != result.away_score:
                    n_error += 1
                    print(
                        "{}: Player conceded {} but {} goals in result for home team"
                        .format(
                            fixture_string(fixture, result),
                            home_conceded,
                            result.away_score,
                        ))

                if away_conceded != result.home_score:
                    n_error += 1
                    print(
                        "{}: Player conceded {} but {} goals in result for away team"
                        .format(
                            fixture_string(fixture, result),
                            away_conceded,
                            result.home_score,
                        ))

    print("\n", result_string(n_error))
    return n_error
def fixture_num_goals(seasons=CHECK_SEASONS, session=session):
    """Check individual player goals sum to match result for each fixture.
    
    Keyword Arguments:
        seasons {[type]} -- seasons to check (default: {CHECK_SEASONS})
        session {SQLAlchemy session} -- DB session (default:
        airsenal.framework.schema.session)
    """
    print("Checking sum of player goals equals match results...\n")
    n_error = 0

    for season in seasons:
        fixtures = get_fixtures_for_season(season=season)

        for fixture in fixtures:
            result = get_result_for_fixture(fixture)

            if result:
                result = result[0]
                home_scores = (session.query(PlayerScore).filter_by(
                    fixture=fixture, player_team=fixture.home_team).all())

                away_scores = (session.query(PlayerScore).filter_by(
                    fixture=fixture, player_team=fixture.away_team).all())

                home_goals = sum([score.goals for score in home_scores]) + sum(
                    [score.own_goals for score in away_scores])

                away_goals = sum([score.goals for score in away_scores]) + sum(
                    [score.own_goals for score in home_scores])

                if home_goals != result.home_score:
                    n_error += 1
                    print(
                        "{}: Player scores sum to {} but {} goals in result for home team"
                        .format(
                            fixture_string(fixture, result),
                            home_goals,
                            result.home_score,
                        ))

                if away_goals != result.away_score:
                    n_error += 1
                    print(
                        "{}: Player scores sum to {} but {} goals in result for away team"
                        .format(
                            fixture_string(fixture, result),
                            away_goals,
                            result.away_score,
                        ))

    print("\n", result_string(n_error))
    return n_error
def fixture_num_players(seasons=CHECK_SEASONS, session=session):
    """Check each fixture has between 11 and 14 players  with at least 1 minute
    in player_scores.

    Keyword Arguments:
        seasons {[type]} -- seasons to check (default: {CHECK_SEASONS})
        session {SQLAlchemy session} -- DB session (default:
        airsenal.framework.schema.session)
    """
    print("Checking 11 to 14 players play per team in each fixture...\n")
    n_error = 0

    for season in seasons:
        fixtures = get_fixtures_for_season(season=season)

        for fixture in fixtures:
            result = get_result_for_fixture(fixture)

            if result:
                result = result[0]
                home_scores = (
                    session.query(PlayerScore)
                    .filter_by(fixture=fixture, player_team=fixture.home_team)
                    .filter(PlayerScore.minutes > 0)
                    .all()
                )

                away_scores = (
                    session.query(PlayerScore)
                    .filter_by(fixture=fixture, player_team=fixture.away_team)
                    .filter(PlayerScore.minutes > 0)
                    .all()
                )

                if not ((len(home_scores) > 10) and (len(home_scores) < 15)):
                    n_error += 1
                    print(
                        "{}: {} players with minutes > 0 for home team.".format(
                            fixture_string(fixture, result), len(home_scores)
                        )
                    )

                if not ((len(away_scores) > 10) and (len(away_scores) < 15)):
                    n_error += 1
                    print(
                        "{}: {} players with minutes > 0 for away team.".format(
                            fixture_string(fixture, result), len(away_scores)
                        )
                    )

    print("\n", result_string(n_error))
    return n_error