export enum EmployeeDashboardTabNames {
  capability = 'capability',
  platform = 'platform',
  innovation = 'innovation'
}

export interface PgRoleMstr {
  roleId: number;
  roleName: string;
  status: string;
  createdBy: string;
  createdDt: any;
  updatedBy: string;
  updatedDt: any;
}

export interface PgPrivilegeMstr {
  privilegeId: number;
  contentAccess: string;
  description: string;
  createdBy: string;
  createdDt: any;
  updatedBy: string;
  updatedDt: any;
}

export interface PgRolePrivilege {
  rolePrivilegeId: number;
  pgRoleMstr: PgRoleMstr;
  pgPrivilegeMstr: PgPrivilegeMstr;
  accessType: string;
  createdBy: string;
  createdDt: any;
  updatedBy: string;
  updatedDt: any;
}

export interface PgRoleUser {
  roleUserId: number;
  pgRolePrivilege: PgRolePrivilege;
  userInfoMstrId: number;
  status: string;
  createdBy: string;
  createdDt: any;
  updatedBy: string;
  updatedDt: any;
}

export interface PgSkillTrackMstr {
  skillTrackMstrId: number;
  skillTrackName: string;
  description: string;
  status: string;
  createdBy: string;
  createdDt: any;
  updatedBy: string;
  updatedDt: any;
}

export interface PgSkillCategory {
  skillCategoryId: number;
  skillCategoryName: string;
  description: string;
  status: string;
  createdBy: string;
  createdDt: any;
  updatedBy: string;
  updatedDt: any;
}

export interface PgSkillTrackDtls {
  skillTrackDtlsId: number;
  pgSkillTrackMstr: PgSkillTrackMstr;
  pgSkillCategory: PgSkillCategory;
  skillTrackDtlsName: string;
  description: string;
  createdBy: string;
  createdDt: any;
  updatedBy: string;
  updatedDt: any;
}

export interface PgUserSkillMapping {
  userSkillMappingId: number;
  userInfoMstrId: number;
  pgSkillTrackDtls: PgSkillTrackDtls;
  createdBy: string;
  createdDt: any;
  updatedBy: string;
  updatedDt: any;
}

export interface PgLocation {
  locationId: number;
  status: string;
  address: string;
  city: string;
  state: string;
  zipCode: number;
  country: string;
  createdBy: string;
  updatedBy: string;
  createdDt: number;
  updatedDt: number;
}

export interface PgCourseDtl {
  courseDtlsId: number;
  courseName: string;
  courseStatus: string;
  userInfoMstrId: number;
  createdBy: string;
  updatedBy: string;
  createdDt: any;
  updatedDt: any;
}

export interface PgUserInfoMstr {
  userInfoMstrId: number;
  firstNm: string;
  lastNm: string;
  fullName: string;
  firstName: string;
  emailId: string;
  pgRoleUser: PgRoleUser[];
  pgEmployeeProjectDtls?: (PgEmployeeProjectDtlsEntity)[] | null;
  pgCourseEmployeeMapping: PgCourseEmployeeMapping[];
  pgUserSkillMapping: PgUserSkillMapping[];
  pgLocation: PgLocation;
  mobileNo?: any;
  createdBy: string;
  createdDt: number;
  updatedBy: string;
  updatedDt: number;
  socialUserType: string;
  pgUserFileMapping: PgUserFileMapping[];
  status: string;
}
export interface PgEmployeeProjectDtlsEntity {
  pgEmployeeProjectDtlsId: number;
  title: string;
  description: string;
  userInfoMstrId: number;
  createdBy: string;
  createdDt: number;
  updatedBy: string;
  updatedDt: number;
  pgprojectSkillsMapping?: (PgprojectSkillsMappingEntity)[] | null;
}
export interface PgprojectSkillsMappingEntity {
  pgProjectSkillsMappingId: number;
  pgSkillTrackDtls: PgSkillTrackDtls;
  pgEmployeeProjectDtlsId: number;
  createdBy: string;
  createdDt: number;
  updatedBy: string;
  updatedDt: number;
}
export interface PgUserFileMapping {
  userFileId: number;
  userInfoMstrId: number;
  fileId: number;
  fileName?: string;
  fileType: string;
  status: string;
  createdDate: number;
  createdBy?: string;
}
interface PgCourseEmployeeMapping {
  courseEmployeemappingId: number;
  userInfoMstrId: number;
  courseId: number;
  courseStatus: string;
  createdBy: string;
  createdDt: number;
  updatedBy: string;
  updatedDt: number;
  isGroupCourse?: any;
}
export interface PgRoleMstr2 {
  roleId: number;
  roleName: string;
  status: string;
  createdBy: string;
  createdDt: any;
  updatedBy: string;
  updatedDt: any;
}

export interface PgPrivilegeMstr2 {
  privilegeId: number;
  contentAccess: string;
  description: string;
  createdBy: string;
  createdDt: any;
  updatedBy: string;
  updatedDt: any;
}

export interface PgRolePrivilege2 {
  rolePrivilegeId: number;
  pgRoleMstr: PgRoleMstr2;
  pgPrivilegeMstr: PgPrivilegeMstr2;
  accessType: string;
  createdBy: string;
  createdDt: any;
  updatedBy: string;
  updatedDt: any;
}

export interface PgRoleUser2 {
  roleUserId: number;
  pgRolePrivilege: PgRolePrivilege2;
  userInfoMstrId: number;
  status: string;
  createdBy: string;
  createdDt: any;
  updatedBy: string;
  updatedDt: any;
}

export interface PgSkillTrackMstr2 {
  skillTrackMstrId: number;
  skillTrackName: string;
  description: string;
  status: string;
  createdBy: string;
  createdDt: any;
  updatedBy: string;
  updatedDt: any;
}

export interface PgSkillCategory2 {
  skillCategoryId: number;
  skillCategoryName: string;
  description: string;
  status: string;
  createdBy: string;
  createdDt: any;
  updatedBy: string;
  updatedDt: any;
}

export interface PgSkillTrackDtls2 {
  skillTrackDtlsId: number;
  pgSkillTrackMstr: PgSkillTrackMstr2;
  pgSkillCategory: PgSkillCategory2;
  skillTrackDtlsName: string;
  description: string;
  createdBy: string;
  createdDt: any;
  updatedBy: string;
  updatedDt: any;
}

export interface PgUserSkillMapping2 {
  userSkillMappingId: number;
  userInfoMstrId: number;
  pgSkillTrackDtls: PgSkillTrackDtls2;
  createdBy: string;
  createdDt: any;
  updatedBy: string;
  updatedDt: any;
}

export interface PgLocation2 {
  locationId: number;
  status: string;
  address: string;
  city: string;
  state: string;
  zipCode: number;
  country: string;
  createdBy: string;
  updatedBy: string;
  createdDt: number;
  updatedDt: number;
}

export interface PgCourseDtl2 {
  courseDtlsId: number;
  courseName: string;
  courseStatus: string;
  userInfoMstrId: number;
  createdBy: string;
  updatedBy: string;
  createdDt: any;
  updatedDt: any;
}

export interface UserInfoMstr {
  userInfoMstrId: number;
  firstNm: string;
  lastNm: string;
  fullName: string;
  emailId: string;
  pgRoleUser: PgRoleUser2[];
  pgUserSkillMapping: PgUserSkillMapping2[];
  pgLocation: PgLocation2;
  mobileNo?: any;
  createdBy: string;
  createdDt: number;
  updatedBy: string;
  updatedDt: number;
  socialUserType: string;
  status: string;
  firstTimeLogin: string;
  pgCourseDtls: PgCourseDtl2[];
}

export interface PgUserInfoDtls {
  userInfoDtlsId: number;
  pgUserInfoMstr: PgUserInfoMstr;
  pgSourceMstr?: any;
  adId: string;
  fullName?: any;
  highestQualificationHeld?: any;
  currentJobTitle?: any;
  pgRequirement?: any;
  experienceInYrs?: any;
  pgExperienceLevel?: any;
  currentEmployer?: any;
  skypeId?: any;
  emailId: string;
  uniqueId?: any;
  linkedinUrl?: any;
  addressLine1?: any;
  city?: any;
  zipCode?: any;
  country?: any;
  stateName?: any;
  additionalInfo?: any;
  twitter?: any;
  otherDesc?: any;
  createdBy: string;
  createdDt: number;
  updatedBy: string;
  updatedDt: number;
  coachId?: any;
  taId?: any;
  jobId?: any;
  contactNumber?: any;
  governmentId?: any;
  alternativeEmail?: any;
  alternativeContact?: any;
  facebookId?: any;
  googleId?: any;
  linkedInId?: any;
  profileId?: any;
  profileName?: any;
  employeeNo: string;
  userInfoMstr: UserInfoMstr;
}

export interface PgUserInfoDtlsList {
  userInfoDtlsId?: any;
  pgUserInfoMstr: PgUserInfoMstr;
  pgSourceMstr?: any;
  adId?: any;
  fullName?: any;
  highestQualificationHeld?: any;
  currentJobTitle?: any;
  pgRequirement?: any;
  experienceInYrs?: any;
  pgExperienceLevel?: any;
  currentEmployer?: any;
  skypeId?: any;
  emailId?: any;
  uniqueId?: any;
  linkedinUrl?: any;
  addressLine1?: any;
  city?: any;
  zipCode?: any;
  country?: any;
  stateName?: any;
  additionalInfo?: any;
  twitter?: any;
  otherDesc?: any;
  createdBy?: any;
  createdDt?: any;
  updatedBy?: any;
  updatedDt?: any;
  taId?: any;
  jobId?: any;
  contactNumber?: any;
  governmentId?: any;
  alternativeEmail?: any;
  alternativeContact?: any;
  facebookId?: any;
  googleId?: any;
  linkedInId?: any;
  profileId?: any;
  profileName?: any;
  employeeNo?: any;
  firstTimeLogin: boolean;
  resUserInfoMstrId?: any;
  resStatus?: any;
  resPgUserSkillMappingName?: any;
  resPgUserSkillMapping: any[];
  resExperienceLevel?: any;
  userInfoMstr: UserInfoMstr;
}

export interface ComponentList {
  componentDtlsId: number;
  componentName: string;
  componentDesc?: any;
  componentCategory: string;
  userInfoMstrId: number;
  createdBy: string;
  createdDt: any;
}

export interface EmployeeDetailsResponse {
  status?: any;
  error?: any;
  pgUserInfoDtls: PgUserInfoDtls;
  pgUserInfoDtlsList: PgUserInfoDtlsList[];
  completedCount: number;
  inprogressCount: number;
  overdueCount: number;
  wishlistCount: number;
  innovationCount: number;
  componentCount: number;
  componentList: ComponentList[];
  ideasList?: any;
  pocList?: any;
}

export interface StatusCountDetails {
  Assessment: number;
  Completed: number;
  'In Progress': number;
  Open: number;
  Overdue: number;
}

export interface StatusCountDetails {
  Wishlist: number;
  Recommended: number;
  'In Progress': number;
  Assessment: number;
  Completed: number;
  Overdue: number;
}

export interface StatusCount {
  statusCount: StatusCountDetails;
  error?: any;
}

export interface ApplyForCoachResponse {
  status:             string;
  error:              null;
  pgUserInfoDtls:     null;
  pgUserInfoDtlsList: null;
  completedCount:     number;
  inprogressCount:    number;
  overdueCount:       number;
  wishlistCount:      number;
  innovationCount:    number;
  componentCount:     number;
  componentList:      null;
  ideasList:          null;
  pocList:            null;
  coEmployees:        null;
}


export interface EmployeeReview {
  assessmentType:      string;
  eventMasterId:       number;
  eventDetailsId:      number;
  name:                string;
  id:                  string;
  assessmentName:      string;
  assessmentMappingId: number;
  status:              string;
  experienceLevel:     string;
  skillTrackName:      string;
  useCaseDescription:  string;
  fileId:              number;
  eventDtlsId:         string;
  usecaseId:           number;
  updatedDate:         string;
  overdueDays:         number;
}

export interface EmployeeUseCase {
  usecaseDescription:   string;
  usecaseTitle:         string;
}

export interface EmployeeGitResponse {
  id:          number;
  gitUserId:   string;
  name:        string;
  username:    string;
  password:    string;
  email:       string;
  createdBy:   string;
  createdDate: any;
  updatedBy:   string;
  updatedDate: any;
  userInfoMstrId: string;
}

export interface EmployeeCodeReviewResponse {
  id:                 string;
  merge_req_id:       string;
  event_dtls_id:      string;
  user_info_mstr_id:  string;
  merge_request_url:  string;
  error:              string;
}

export class QuestionBase<T> {
  value: T;
  key: string;
  label: string;
  required: boolean;
  order: number;
  controlType: string;
  feedback: string;
  constructor(options: {
      value?: T,
      key?: string,
      label?: string,
      required?: boolean,
      order?: number,
      controlType?: string
      feedback?: string;
    } = {}) {
    this.value = options.value;
    this.key = options.key || '';
    this.label = options.label || '';
    this.required = !!options.required;
    this.order = options.order === undefined ? 1 : options.order;
    this.controlType = options.controlType || '';
    this.feedback = options.feedback;
  }
}

export class MultiChoiceQuestion extends QuestionBase<string> {
  controlType = 'checkbox';
  options: {key: string, value: string}[] = [];

  constructor(options: {} = {}) {
    super(options);
    this.options = options['options'] || [];
  }
}

export class RatingQuestion extends QuestionBase<string> {
  controlType = 'textbox';
  type: string;

  constructor(options: {} = {}) {
    super(options);
    this.type = options['type'] || '';
  }
}

export class SingleChoiceQuestion extends QuestionBase<string> {
  controlType = 'radioButton';
  options: {key: string, value: string}[] = [];

  constructor(options: {} = {}) {
    super(options);
    this.options = options['options'] || [];
  }
}

export class ReviewScore {
  errorBean: string;
  successMessage: string;
  averageScore: string;
  reviewerFeedback: ReviewerFeedBack[];
  useCasePassMark: number;
}

export class ReviewerFeedBack {
  errorBean: string;
  successMessage: string;
  comments: string;
  score: number;
  feedback: FeedBack[];
  eventDtlsId: number;
  reviewerId: number;
  status: string;
}

export class FeedBack {
  questionId: number;
  question: string;
  answer: string;
  rating: number;
}
