/**
 *
 * @export
 * @interface Assignment
 */
export interface Assignment {
    /**
     *
     * @type {string}
     * @memberof Assignment
     */
    pk: string
    /**
     *
     * @type {string}
     * @memberof Assignment
     */
    submission?: string
    /**
     *
     * @type {boolean}
     * @memberof Assignment
     */
    isDone?: boolean
    /**
     *
     * @type {string}
     * @memberof Assignment
     */
    owner?: string
    /**
     *
     * @type {string}
     * @memberof Assignment
     */
    stage?: Subscription.FeedbackStageEnum

    feedback?: Feedback

    subscription?: string
}

/**
 *
 * @export
 * @interface Exam
 */
export interface Exam {
    /**
     *
     * @type {string}
     * @memberof Exam
     */
    pk: string
    /**
     *
     * @type {string}
     * @memberof Exam
     */
    moduleReference: string
    /**
     *
     * @type {number}
     * @memberof Exam
     */
    totalScore: number
    /**
     *
     * @type {number}
     * @memberof Exam
     */
    passScore: number
    /**
     *
     * @type {boolean}
     * @memberof Exam
     */
    passOnly?: boolean
}

/**
 *
 * @export
 * @interface Feedback
 */
export interface Feedback {
    /**
     *
     * @type {number}
     * @memberof Feedback
     */
    pk: number
    /**
     *
     * @type {string}
     * @memberof Feedback
     */
    ofSubmission?: string
    /**
     *
     * @type {boolean}
     * @memberof Feedback
     */
    isFinal?: boolean
    /**
     *
     * @type {number}
     * @memberof Feedback
     */
    score?: number
    /**
     *
     * @type {Array<FeedbackComment>}
     * @memberof Feedback
     */
    feedbackLines?: {[lineNo: number]: FeedbackComment[]}
    /**
     *
     * @type {Date}
     * @memberof Feedback
     */
    created?: string
    /**
     *
     * @type {string}
     * @memberof Feedback
     */
    ofSubmissionType?: string
    /**
     *
     * @type {string}
     * @memberof Feedback
     */
    feedbackStageForUser?: string
}

/**
 *
 * @export
 * @interface FeedbackComment
 */
export interface FeedbackComment {
    /**
     *
     * @type {string}
     * @memberof FeedbackComment
     */
    pk: string
    /**
     *
     * @type {string}
     * @memberof FeedbackComment
     */
    text: string
    /**
     *
     * @type {Date}
     * @memberof FeedbackComment
     */
    created?: string
    /**
     *
     * @type {string}
     * @memberof FeedbackComment
     */
    ofTutor?: string
    /**
     *
     * @type {number}
     * @memberof FeedbackComment
     */
    ofLine?: number
    /**
     *
     * @type {boolean}
     * @memberof FeedbackComment
     */
    visibleToStudent?: boolean
}

/**
 *
 * @export
 * @interface Credentials
 */
export interface Credentials {
    /**
     *
     * @type {string}
     * @memberof JSONWebToken
     */
    username: string
    /**
     *
     * @type {string}
     * @memberof JSONWebToken
     */
    password: string
}

export interface JSONWebToken {
    token: string
}

export interface Statistics {
    submissionsPerType: number,
    submissionsPerStudent: number,
    currentMeanScore: number,
    submissionTypeProgress: Array<SubmissionTypeProgress>
}

/**
 *
 * @export
 * @interface StudentInfo
 */
export interface StudentInfo {
    /**
     *
     * @type {string}
     * @memberof StudentInfo
     */
    pk: string
    /**
     *
     * @type {string}
     * @memberof StudentInfo
     */
    name?: string
    /**
     *
     * @type {string}
     * @memberof StudentInfo
     */
    user: string
    /**
     *
     * @type {string}
     * @memberof StudentInfo
     */
    matrikelNo?: string
    /**
     *
     * @type {Exam}
     * @memberof StudentInfo
     */
    exam: Exam
    /**
     *
     * @type {Array<SubmissionList>}
     * @memberof StudentInfo
     */
    submissions: Array<SubmissionList>
    /**
     *
     * @type {boolean}
     * @memberof StudentInfo
     */
    passesExam?: boolean
}

/**
 *
 * @export
 * @interface StudentInfoForListView
 */
export interface StudentInfoForListView {
    /**
     *
     * @type {string}
     * @memberof StudentInfoForListView
     */
    pk: string
    /**
     *
     * @type {string}
     * @memberof StudentInfoForListView
     */
    name?: string
    /**
     *
     * @type {string}
     * @memberof StudentInfoForListView
     */
    user?: string
    /**
     *
     * @type {string}
     * @memberof StudentInfoForListView
     */
    userPk?: string
    /**
     *
     * @type {string}
     * @memberof StudentInfoForListView
     */
    exam?: string
    /**
     *
     * @type {Array<SubmissionNoTextFields>}
     * @memberof StudentInfoForListView
     */
    submissions: Array<SubmissionNoTextFields>
    /**
     *
     * @type {string}
     * @memberof StudentInfoForListView
     */
    matrikelNo?: string
    /**
     *
     * @type {boolean}
     * @memberof StudentInfoForListView
     */
    passesExam?: boolean
    /**
     *
     * @type {boolean}
     * @memberof StudentInfoForListView
     */
    isActive: boolean
}

/**
 *
 * @export
 * @interface Submission
 */
export interface Submission {
    /**
     *
     * @type {string}
     * @memberof Submission
     */
    pk: string
    /**
     *
     * @type {SubmissionType}
     * @memberof Submission
     */
    type: SubmissionType
    /**
     *
     * @type {string}
     * @memberof Submission
     */
    text?: string
    /**
     *
     * @type {VisibleCommentFeedback}
     * @memberof Submission
     */
    feedback: VisibleCommentFeedback
    /**
     *
     * @type {Array<Test>}
     * @memberof Submission
     */
    tests: Array<Test>
}

/**
 *
 * @export
 * @interface SubmissionList
 */
export interface SubmissionList {
    /**
     *
     * @type {string}
     * @memberof SubmissionList
     */
    pk: string
    /**
     *
     * @type {SubmissionTypeList}
     * @memberof SubmissionList
     */
    type: SubmissionTypeList
    /**
     *
     * @type {Feedback}
     * @memberof SubmissionList
     */
    feedback: Feedback
}

/**
 *
 * @export
 * @interface SubmissionNoTextFields
 */
export interface SubmissionNoTextFields {
    /**
     *
     * @type {string}
     * @memberof SubmissionNoTextFields
     */
    pk: string
    /**
     *
     * @type {string}
     * @memberof SubmissionNoTextFields
     */
    type: string
    /**
     *
     * @type {string}
     * @memberof SubmissionNoTextFields
     */
    score?: string
    /**
     *
     * @type {string}
     * @memberof SubmissionNoTextFields
     */
    final?: string
    /**
     *
     * @type {string}
     * @memberof SubmissionNoTextFields
     */
    fullScore?: string
}

/**
 *
 * @export
 * @interface SubmissionNoType
 */
export interface SubmissionNoType {
    /**
     *
     * @type {string}
     * @memberof SubmissionNoType
     */
    pk: string
    /**
     *
     * @type {string}
     * @memberof SubmissionNoType
     */
    type: string
    /**
     *
     * @type {string}
     * @memberof SubmissionNoType
     */
    fullScore?: string
    /**
     *
     * @type {string}
     * @memberof SubmissionNoType
     */
    text?: string
    /**
     *
     * @type {Feedback}
     * @memberof SubmissionNoType
     */
    feedback?: Feedback
    /**
     *
     * @type {Array<Test>}
     * @memberof SubmissionNoType
     */
    tests: Array<Test>
}

/**
 *
 * @export
 * @interface SubmissionType
 */
export interface SubmissionType {
    /**
     *
     * @type {string}
     * @memberof SubmissionType
     */
    pk: string
    /**
     *
     * @type {string}
     * @memberof SubmissionType
     */
    name: string
    /**
     *
     * @type {number}
     * @memberof SubmissionType
     */
    fullScore?: number
    /**
     *
     * @type {string}
     * @memberof SubmissionType
     */
    description: string
    /**
     *
     * @type {string}
     * @memberof SubmissionType
     */
    solution?: string
    /**
     *
     * @type {string}
     * @memberof SubmissionType
     */
    programmingLanguage?: SubmissionType.ProgrammingLanguageEnum
}

/**
 * @export
 * @namespace SubmissionType
 */
export namespace SubmissionType {
    /**
     * @export
     * @enum {string}
     */
    export enum ProgrammingLanguageEnum {
        C = <any> 'c',
        Java = <any> 'java'
    }
}

/**
 *
 * @export
 * @interface SubmissionTypeList
 */
export interface SubmissionTypeList {
    /**
     *
     * @type {string}
     * @memberof SubmissionTypeList
     */
    pk: string

    /**
     *
     * @type {string}
     * @memberof SubmissionTypeList
     */
    name: string
    /**
     *
     * @type {number}
     * @memberof SubmissionTypeList
     */
    fullScore?: number
}

export interface SubmissionTypeProgress {
    pk: string
    name: string
    feedbackFinal: number
    feedbackInValidation: number
    feedbackInConflict: number
    submissionCount: number
}

/**
 *
 * @export
 * @interface Subscription
 */
export interface Subscription {
    /**
     *
     * @type {string}
     * @memberof Subscription
     */
    pk: string
    /**
     *
     * @type {string}
     * @memberof Subscription
     */
    owner?: string
    /**
     *
     * @type {string}
     * @memberof Subscription
     */
    queryType?: Subscription.QueryTypeEnum
    /**
     *
     * @type {string}
     * @memberof Subscription
     */
    queryKey?: string
    /**
     *
     * @type {string}
     * @memberof Subscription
     */
    feedbackStage?: Subscription.FeedbackStageEnum
    /**
     *
     * @type {boolean}
     * @memberof Subscription
     */
    deactivated?: boolean
    /**
     *
     * @type {string}
     * @memberof Subscription
     */
    assignments?: Array<Assignment>
    /**
     *
     * @type {string}
     * @memberof Subscription
     */
    remaining?: string
    /**
     *
     * @type {string}
     * @memberof Subscription
     */
    available?: string
}

/**
 * @export
 * @namespace Subscription
 */
export namespace Subscription {
    /**
     * @export
     * @enum {string}
     */
    export enum QueryTypeEnum {
        Random = 'random',
        Student = 'student',
        Exam = 'exam',
        SubmissionType = 'submission_type'
    }
    /**
     * @export
     * @enum {string}
     */
    export enum FeedbackStageEnum {
        Creation = 'feedback-creation',
        Validation = 'feedback-validation',
        ConflictResolution = 'feedback-conflict-resolution'
    }
}

/**
 *
 * @export
 * @interface Test
 */
export interface Test {
    /**
     *
     * @type {string}
     * @memberof Test
     */
    pk: string
    /**
     *
     * @type {string}
     * @memberof Test
     */
    name: string
    /**
     *
     * @type {string}
     * @memberof Test
     */
    label: string
    /**
     *
     * @type {string}
     * @memberof Test
     */
    annotation: string
}

/**
 *
 * @export
 * @interface Tutor
 */
export interface Tutor {
    /**
     *
     * @type {string}
     * @memberof Tutor
     */
    pk: string
    /**
     *
     * @type {string}
     * @memberof Tutor
     */
    password?: string
    /**
     * Designates whether this user should be treated as active. Unselect this instead of deleting accounts.
     * @type {boolean}
     * @memberof Tutor
     */
    isActive?: boolean
    /**
     * Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.
     * @type {string}
     * @memberof Tutor
     */
    username: string
    /**
     *
     * @type {string}
     * @memberof Tutor
     */
    feedbackCreated?: string
    /**
     *
     * @type {string}
     * @memberof Tutor
     */
    feedbackValidated?: string
}

/**
 *
 * @export
 * @interface UserAccount
 */
export interface UserAccount {
    /**
     *
     * @type {string}
     * @memberof UserAccount
     */
    pk: string
    /**
     * Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.
     * @type {string}
     * @memberof UserAccount
     */
    username?: string
    /**
     *
     * @type {string}
     * @memberof UserAccount
     */
    role?: UserAccount.RoleEnum
    /**
     *
     * @type {boolean}
     * @memberof UserAccount
     */
    isAdmin?: boolean
    /**
     *
     * @type {string}
     * @memberof UserAccount
     */
    password?: string
}

/**
 * @export
 * @namespace UserAccount
 */
export namespace UserAccount {
    /**
     * @export
     * @enum {string}
     */
    export enum RoleEnum {
        Student = 'Student',
        Tutor = 'Tutor',
        Reviewer = 'Reviewer'
    }
}

/**
 *
 * @export
 * @interface VisibleCommentFeedback
 */
export interface VisibleCommentFeedback {
    /**
     *
     * @type {number}
     * @memberof VisibleCommentFeedback
     */
    pk: number
    /**
     *
     * @type {string}
     * @memberof VisibleCommentFeedback
     */
    ofSubmission: string
    /**
     *
     * @type {boolean}
     * @memberof VisibleCommentFeedback
     */
    isFinal?: boolean
    /**
     *
     * @type {number}
     * @memberof VisibleCommentFeedback
     */
    score?: number
    /**
     *
     * @type {string}
     * @memberof VisibleCommentFeedback
     */
    feedbackLines?: string
    /**
     *
     * @type {Date}
     * @memberof VisibleCommentFeedback
     */
    created?: Date
    /**
     *
     * @type {string}
     * @memberof VisibleCommentFeedback
     */
    ofSubmissionType?: string
}