// SPDX-License-Identifier: GPL-3.0-or-later
// This file is part of the http://github.com/aaronbloomfield/ccc repository,
// and is released under the GPL 3.0 license.
pragma solidity ^0.8.24;
interface IGradebook {
//------------------------------------------------------------
// Events
// This should be emitted when an assignment is created; the parameter is
// the assignment id.
event assignmentCreationEvent (uint indexed _id);
// This should be emitted when a grade is updated; the parameter is the
// assignment id.
event gradeEntryEvent (uint indexed _id);
//------------------------------------------------------------
// The following six methods are done for you automatically -- as long as
// you make the appropriate variable public, then Solidity will create
// the getter function for you
// Returns whether the passed address has been designated as a
// teaching assistant
function tas(address ta) external view returns (bool);
// Returns the max score for the given assignment
function max_scores(uint id) external view returns (uint);
// Returns the name of the given assignment
function assignment_names(uint id) external view returns (string memory);
// Returns the score for the given assignment ID and the given
// student
function scores(uint id, string memory userid) external view returns (uint);
// Returns how many assignments there are; the assignments are
// assumed to be indexed from 0
function num_assignments() external view returns (uint);
// Returns the address of the instructor, who is the person who
// deployed this smart contract
function instructor() external view returns (address);
//------------------------------------------------------------
// The following five functions are ones you must implement
// Designates the passed address as a teaching assistant; re-designating
// an address a TA does not do anything special (no revert). ONLY the
// instructor can designated TAs.
function designateTA(address ta) external;
// Adds an assignment of the given name with the given maximum score. It
// should revert if called by somebody other than the instructor or an
// already designated teaching assistant. It does not check if an
// assignment with the same name already exists; thus, you can have
// multiple assignments with the same name (but different IDs). It
// returns the assignment ID.
function addAssignment(string memory name, uint max_score) external returns (uint);
// Adds the given grade for the given student and the given assignment.
// This should revert if (a) the caller is not the instructor or TA, or
// (b) the assignment ID is invalid, or (c) the score is higher than the
// allowed maximum score.
function addGrade(string memory student, uint assignment, uint score) external;
// Obtains the average of the given student's scores. Each assignment is
// weighted based on the number of points for that assignment. So a 5/10
// on one assignment and a 20/20 on another assignment would yield 25/30
// points, or 83.33. This returns 100 times that, or 8333. Note that
// the value is truncated, not rounded; so if the average were 16.67%, it
// would return 1666. A student with no grades entered should have an
// average of 0.
function getAverage(string memory student) external view returns (uint);
// This function is how we are going to test your program -- we are going
// to request TA access. For this assignment, it will automatically make
// msg.sender a TA, and has no effect if the sender is already a TA
// (or instructor). In reality, this would revert(), as only the
// instructor (and other TAs) can make new TAs.
function requestTAAccess() external;
//------------------------------------------------------------
// The implementation for the following is provided in the HW description
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}