// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/**
 * @fileoverview Shared file for specifying common types used in type
 * annotations across Monorail.
 */

// TODO(zhangtiff): Find out if there's a way we can generate typedef's for
// API object from .proto files.


/**
 * Types used in the app that don't come from any Proto files.
 */

/**
 * A HotlistItem with the Issue flattened into the top-level,
 * containing the intersection of the fields of HotlistItem and Issue.
 *
 * @typedef {Issue & HotlistItem} HotlistIssue
 * @property {User=} adder
 */

/**
 * A String containing the data necessary to identify an IssueRef. An IssueRef
 * can reference either an issue in Monorail or an external issue in another
 * tracker.
 *
 * Examples of valid IssueRefStrings:
 * - monorail:1234
 * - chromium:1
 * - 1234
 * - b/123456
 *
 * @typedef {string} IssueRefString
 */

/**
 * An Object for specifying what to display in a single entry in the
 * dropdown list.
 *
 * @typedef {Object} MenuItem
 * @property {string=} text The text to display in the menu.
 * @property {string=} icon A Material Design icon shown left of the text.
 * @property {Array<MenuItem>=} items A specification for a nested submenu.
 * @property {function=} handler An optional click handler for an item.
 * @property {string=} url A link for the menu item to navigate to.
 */

/**
 * An Object containing the metadata associated with tracking async requests
 * through Redux.
 *
 * @typedef {Object} ReduxRequestState
 * @property {boolean=} requesting Whether a request is in flight.
 * @property {Error=} error An Error Object returned by the request.
 */


/**
 * Resource names used in our resource-oriented API.
 * @see https://aip.dev/122
 */


/**
 * Resource name of an IssueStar.
 *
 * Examples of valid IssueStar resource names:
 * - users/1234/issueStars/monorail.5556
 * - users/1234/issueStars/test-project.4321
 *
 * @typedef {string} IssueStarName
 */


/**
 * Resource name of a ProjectStar.
 *
 * Examples of valid ProjectStar resource names:
 * - users/1234/projectStars/monorail
 * - users/1234/projectStars/test-project
 *
 * @typedef {string} ProjectStarName
 */


/**
 * Resource name of a Star.
 *
 * @typedef {ProjectStarName|IssueStarName} StarName
 */


/**
 * Resource name of a Project.
 *
 * Examples of valid Project resource names:
 * - projects/monorail
 * - projects/test-project-1
 *
 * @typedef {string} ProjectName
 */


/**
 * Resource name of a User.
 *
 * Examples of valid User resource names:
 * - users/test@example.com
 * - users/1234
 *
 * @typedef {string} UserName
 */

/**
 * Resource name of a ProjectMember.
 *
 * Examples of valid ProjectMember resource names:
 * - projects/monorail/members/1234
 * - projects/test-xyz/members/5678
 *
 * @typedef {string} ProjectMemberName
 */


/**
 * Types defined in common.proto.
 */


/**
 * A ComponentRef Object returned by the pRPC API common.proto.
 *
 * @typedef {Object} ComponentRef
 * @property {string} path
 * @property {boolean=} isDerived
 */

/**
 * An Enum representing the type that a custom field uses.
 *
 * @typedef {string} FieldType
 */

/**
 * A FieldRef Object returned by the pRPC API common.proto.
 *
 * @typedef {Object} FieldRef
 * @property {number} fieldId
 * @property {string} fieldName
 * @property {FieldType} type
 * @property {string=} approvalName
 */

/**
 * A LabelRef Object returned by the pRPC API common.proto.
 *
 * @typedef {Object} LabelRef
 * @property {string} label
 * @property {boolean=} isDerived
 */

/**
 * A StatusRef Object returned by the pRPC API common.proto.
 *
 * @typedef {Object} StatusRef
 * @property {string} status
 * @property {boolean=} meansOpen
 * @property {boolean=} isDerived
 */

/**
 * An IssueRef Object returned by the pRPC API common.proto.
 *
 * @typedef {Object} IssueRef
 * @property {string=} projectName
 * @property {number=} localId
 * @property {string=} extIdentifier
 */

/**
 * A UserRef Object returned by the pRPC API common.proto.
 *
 * @typedef {Object} UserRef
 * @property {string=} displayName
 * @property {number=} userId
 */

/**
 * A HotlistRef Object returned by the pRPC API common.proto.
 *
 * @typedef {Object} HotlistRef
 * @property {string=} name
 * @property {UserRef=} owner
 */

/**
 * A SavedQuery Object returned by the pRPC API common.proto.
 *
 * @typedef {Object} SavedQuery
 * @property {number} queryId
 * @property {string} name
 * @property {string} query
 * @property {Array<string>} projectNames
 */


/**
 * Types defined in issue_objects.proto.
 */

/**
 * An Approval Object returned by the pRPC API issue_objects.proto.
 *
 * @typedef {Object} Approval
 * @property {FieldRef} fieldRef
 * @property {Array<UserRef>} approverRefs
 * @property {ApprovalStatus} status
 * @property {number} setOn
 * @property {UserRef} setterRef
 * @property {PhaseRef} phaseRef
 */

/**
 * An Enum representing the status of an Approval.
 *
 * @typedef {string} ApprovalStatus
 */

/**
 * An Amendment Object returned by the pRPC API issue_objects.proto.
 *
 * @typedef {Object} Amendment
 * @property {string} fieldName
 * @property {string} newOrDeltaValue
 * @property {string} oldValue
 */

/**
 * An Attachment Object returned by the pRPC API issue_objects.proto.
 *
 * @typedef {Object} Attachment
* @property {number} attachmentId
* @property {string} filename
* @property {number} size
* @property {string} contentType
* @property {boolean} isDeleted
* @property {string} thumbnailUrl
* @property {string} viewUrl
* @property {string} downloadUrl
*/

/**
 * A Comment Object returned by the pRPC API issue_objects.proto.
 *
 * Note: This Object is called "Comment" in the backend but is named
 * "IssueComment" here to avoid a collision with an internal JSDoc Intellisense
 * type.
 *
 * @typedef {Object} IssueComment
 * @property {string} projectName
 * @property {number} localId
 * @property {number=} sequenceNum
 * @property {boolean=} isDeleted
 * @property {UserRef=} commenter
 * @property {number=} timestamp
 * @property {string=} content
 * @property {string=} inboundMessage
 * @property {Array<Amendment>=} amendments
 * @property {Array<Attachment>=} attachments
 * @property {FieldRef=} approvalRef
 * @property {number=} descriptionNum
 * @property {boolean=} isSpam
 * @property {boolean=} canDelete
 * @property {boolean=} canFlag
 */

/**
 * A FieldValue Object returned by the pRPC API issue_objects.proto.
 *
 * @typedef {Object} FieldValue
 * @property {FieldRef} fieldRef
 * @property {string} value
 * @property {boolean=} isDerived
 * @property {PhaseRef=} phaseRef
 */

/**
 * An Issue Object returned by the pRPC API issue_objects.proto.
 *
 * @typedef {Object} Issue
 * @property {string} projectName
 * @property {number} localId
 * @property {string=} summary
 * @property {StatusRef=} statusRef
 * @property {UserRef=} ownerRef
 * @property {Array<UserRef>=} ccRefs
 * @property {Array<LabelRef>=} labelRefs
 * @property {Array<ComponentRef>=} componentRefs
 * @property {Array<IssueRef>=} blockedOnIssueRefs
 * @property {Array<IssueRef>=} blockingIssueRefs
 * @property {Array<IssueRef>=} danglingBlockedOnRefs
 * @property {Array<IssueRef>=} danglingBlockingRefs
 * @property {IssueRef=} mergedIntoIssueRef
 * @property {Array<FieldValue>=} fieldValues
 * @property {boolean=} isDeleted
 * @property {UserRef=} reporterRef
 * @property {number=} openedTimestamp
 * @property {number=} closedTimestamp
 * @property {number=} modifiedTimestamp
 * @property {number=} componentModifiedTimestamp
 * @property {number=} statusModifiedTimestamp
 * @property {number=} ownerModifiedTimestamp
 * @property {number=} starCount
 * @property {boolean=} isSpam
 * @property {number=} attachmentCount
 * @property {Array<Approval>=} approvalValues
 * @property {Array<PhaseDef>=} phases
 */

/**
 * A IssueDelta Object returned by the pRPC API issue_objects.proto.
 *
 * @typedef {Object} IssueDelta
 * @property {string=} status
 * @property {UserRef=} ownerRef
 * @property {Array<UserRef>=} ccRefsAdd
 * @property {Array<UserRef>=} ccRefsRemove
 * @property {Array<ComponentRef>=} compRefsAdd
 * @property {Array<ComponentRef>=} compRefsRemove
 * @property {Array<LabelRef>=} labelRefsAdd
 * @property {Array<LabelRef>=} labelRefsRemove
 * @property {Array<FieldValue>=} fieldValsAdd
 * @property {Array<FieldValue>=} fieldValsRemove
 * @property {Array<FieldRef>=} fieldsClear
 * @property {Array<IssueRef>=} blockedOnRefsAdd
 * @property {Array<IssueRef>=} blockedOnRefsRemove
 * @property {Array<IssueRef>=} blockingRefsAdd
 * @property {Array<IssueRef>=} blockingRefsRemove
 * @property {IssueRef=} mergedIntoRef
 * @property {string=} summary
 */

/**
 * An PhaseDef Object returned by the pRPC API issue_objects.proto.
 *
 * @typedef {Object} PhaseDef
 * @property {PhaseRef} phaseRef
 * @property {number} rank
 */

/**
 * An PhaseRef Object returned by the pRPC API issue_objects.proto.
 *
 * @typedef {Object} PhaseRef
 * @property {string} phaseName
 */

/**
 * An Object returned by the pRPC v3 API from feature_objects.proto.
 *
 * @typedef {Object} IssuesListColumn
 * @property {string} column
 */


/**
 * Types defined in permission_objects.proto.
 */

/**
 * A Permission string returned by the pRPC API permission_objects.proto.
 *
 * @typedef {string} Permission
 */

/**
 * A PermissionSet Object returned by the pRPC API permission_objects.proto.
 *
 * @typedef {Object} PermissionSet
 * @property {string} resource
 * @property {Array<Permission>} permissions
 */


/**
 * Types defined in project_objects.proto.
 */

/**
 * An Enum representing the role a ProjectMember has.
 *
 * @typedef {string} ProjectRole
 */

/**
 * An Enum representing how a ProjectMember shows up in autocomplete.
 *
 * @typedef {string} AutocompleteVisibility
 */

/**
 * A ProjectMember Object returned by the pRPC API project_objects.proto.
 *
 * @typedef {Object} ProjectMember
 * @property {ProjectMemberName} name
 * @property {ProjectRole} role
 * @property {Array<Permission>=} standardPerms
 * @property {Array<string>=} customPerms
 * @property {string=} notes
 * @property {AutocompleteVisibility=} includeInAutocomplete
 */

/**
 * A Project Object returned by the pRPC API project_objects.proto.
 *
 * @typedef {Object} Project
 * @property {string} name
 * @property {string} summary
 * @property {string=} description
 */

/**
 * A Project Object returned by the v0 pRPC API project_objects.proto.
 *
 * @typedef {Object} ProjectV0
 * @property {string} name
 * @property {string} summary
 * @property {string=} description
 */

/**
 * A StatusDef Object returned by the pRPC API project_objects.proto.
 *
 * @typedef {Object} StatusDef
 * @property {string} status
 * @property {boolean} meansOpen
 * @property {number} rank
 * @property {string} docstring
 * @property {boolean} deprecated
 */

/**
 * A LabelDef Object returned by the pRPC API project_objects.proto.
 *
 * @typedef {Object} LabelDef
 * @property {string} label
 * @property {string=} docstring
 * @property {boolean=} deprecated
 */

/**
 * A ComponentDef Object returned by the pRPC API project_objects.proto.
 *
 * @typedef {Object} ComponentDef
 * @property {string} path
 * @property {string} docstring
 * @property {Array<UserRef>} adminRefs
 * @property {Array<UserRef>} ccRefs
 * @property {boolean} deprecated
 * @property {number} created
 * @property {UserRef} creatorRef
 * @property {number} modified
 * @property {UserRef} modifierRef
 * @property {Array<LabelRef>} labelRefs
 */

/**
 * A FieldDef Object returned by the pRPC API project_objects.proto.
 *
 * @typedef {Object} FieldDef
 * @property {FieldRef} fieldRef
 * @property {string=} applicableType
 * @property {boolean=} isRequired
 * @property {boolean=} isNiche
 * @property {boolean=} isMultivalued
 * @property {string=} docstring
 * @property {Array<UserRef>=} adminRefs
 * @property {boolean=} isPhaseField
 * @property {Array<UserRef>=} userChoices
 * @property {Array<LabelDef>=} enumChoices
 */

/**
 * A ApprovalDef Object returned by the pRPC API project_objects.proto.
 *
 * @typedef {Object} ApprovalDef
 * @property {FieldRef} fieldRef
 * @property {Array<UserRef>} approverRefs
 * @property {string} survey
 */

/**
 * A Config Object returned by the pRPC API project_objects.proto.
 *
 * @typedef {Object} Config
 * @property {string} projectName
 * @property {Array<StatusDef>=} statusDefs
 * @property {Array<StatusRef>=} statusesOfferMerge
 * @property {Array<LabelDef>=} labelDefs
 * @property {Array<string>=} exclusiveLabelPrefixes
 * @property {Array<ComponentDef>=} componentDefs
 * @property {Array<FieldDef>=} fieldDefs
 * @property {Array<ApprovalDef>=} approvalDefs
 * @property {boolean=} restrictToKnown
 */


/**
 * A PresentationConfig Object returned by the pRPC API project_objects.proto.
 *
 * @typedef {Object} PresentationConfig
 * @property {string=} projectThumbnailUrl
 * @property {string=} projectSummary
 * @property {string=} customIssueEntryUrl
 * @property {string=} defaultQuery
 * @property {Array<SavedQuery>=} savedQueries
 * @property {string=} revisionUrlFormat
 * @property {string=} defaultColSpec
 * @property {string=} defaultSortSpec
 * @property {string=} defaultXAttr
 * @property {string=} defaultYAttr
 */

/**
 * A TemplateDef Object returned by the pRPC API project_objects.proto.
 *
 * @typedef {Object} TemplateDef
 * @property {string} templateName
 * @property {string=} content
 * @property {string=} summary
 * @property {boolean=} summaryMustBeEdited
 * @property {UserRef=} ownerRef
 * @property {StatusRef=} statusRef
 * @property {Array<LabelRef>=} labelRefs
 * @property {boolean=} membersOnly
 * @property {boolean=} ownerDefaultsToMember
 * @property {Array<UserRef>=} adminRefs
 * @property {Array<FieldValue>=} fieldValues
 * @property {Array<ComponentRef>=} componentRefs
 * @property {boolean=} componentRequired
 * @property {Array<Approval>=} approvalValues
 * @property {Array<PhaseDef>=} phases
 */


/**
 * Types defined in features_objects.proto.
 */

/**
 * A Hotlist Object returned by the pRPC API features_objects.proto.
 *
 * @typedef {Object} HotlistV0
 * @property {UserRef=} ownerRef
 * @property {string=} name
 * @property {string=} summary
 * @property {string=} description
 * @property {string=} defaultColSpec
 * @property {boolean=} isPrivate
 */

/**
 * A Hotlist Object returned by the pRPC v3 API from feature_objects.proto.
 *
 * @typedef {Object} Hotlist
 * @property {string} name
 * @property {string=} displayName
 * @property {string=} owner
 * @property {Array<string>=} editors
 * @property {string=} summary
 * @property {string=} description
 * @property {Array<IssuesListColumn>=} defaultColumns
 * @property {string=} hotlistPrivacy
 */

/**
 * A HotlistItem Object returned by the pRPC API features_objects.proto.
 *
 * @typedef {Object} HotlistItemV0
 * @property {Issue=} issue
 * @property {number=} rank
 * @property {UserRef=} adderRef
 * @property {number=} addedTimestamp
 * @property {string=} note
 */

/**
 * A HotlistItem Object returned by the pRPC v3 API from feature_objects.proto.
 *
 * @typedef {Object} HotlistItem
 * @property {string=} name
 * @property {string=} issue
 * @property {number=} rank
 * @property {string=} adder
 * @property {string=} createTime
 * @property {string=} note
 */

/**
 * Types defined in user_objects.proto.
 */

/**
 * A User Object returned by the pRPC API user_objects.proto.
 *
 * @typedef {Object} UserV0
 * @property {string=} displayName
 * @property {number=} userId
 * @property {boolean=} isSiteAdmin
 * @property {string=} availability
 * @property {UserRef=} linkedParentRef
 * @property {Array<UserRef>=} linkedChildRefs
 */

/**
 * A User Object returned by the pRPC v3 API from user_objects.proto.
 *
 * @typedef {Object} User
 * @property {string=} name
 * @property {string=} displayName
 * @property {string=} availabilityMessage
 */

/**
 * A ProjectStar Object returned by the pRPC v3 API from user_objects.proto.
 *
 * @typedef {Object} ProjectStar
 * @property {string=} name
 */

/**
 * A IssueStar Object returned by the pRPC v3 API from user_objects.proto.
 *
 * @typedef {Object} IssueStar
 * @property {string=} name
 */

/**
 * Type alias for any Star object.
 *
 * @typedef {ProjectStar|IssueStar} Star
 */
