import { Role } from "./constants/navLink.constants";

declare global {
  interface Window {
    APP_CONFIG: {
      RAZORPAY_KEY_ID: string;
    };
  }
}

export enum Difficulty {
  Easy = 'Easy',
  Medium = 'Medium',
  Hard = 'Hard',
}

export interface IQuestionOption {
  option: string;
  optionImage?: string;
}

export interface IQuestion {
  id: string;
  exams: string[];
  tests: string[];
  subject: string;
  language: string;
  topic: string;
  questionText: string;
  questionImage: string | null;
  options: IQuestionOption[];
  correctAnswer: number;
  marks: number;
  difficulty: 'Easy' | 'Medium' | 'Hard';
  createdBy: string;
  explanation: string;
  explanationImage: string | null;
  createdAt: string;
  updatedAt: string;
  isAlreadyUsed: number;
  usedInTests?: { id: string; title: string }[];
}

export interface Result {
  id: string;
  studentId: string;
  examId: string;
  examTitle: string;
  date: string;
  score: number;
  totalMarks: number;
}

// Login types 
export interface ILoginInput {
  email: string,
  password?: string
}

export interface ILoginPayload {
  firstName: string,
  lastName?: string,
  email: string,
  password: string
}

export interface ILoginResUser {
  id: string,
  firstName: string,
  lastName: string,
  email: string,
  gstNumber?: string,
  state?: string,
  pincode?: string,
  role: Role,
  permissions: null | string[]
  phone?: string | number;
  designation?: string;
  institutionName?: string;
  institutionId?: string;
  institutionAddress?: string;
  contactPerson?: string;
  profilePic?: string;
  logoPic?: string;
  referralCode?: string;
}

// Staff Management
export interface IStaffMember {
  id: string,
  referralCode?: string,
  firstName: string,
  lastName: string,
  email: string,
  role: Role | string,
  roleId: string;
  roleName?: string;
  phone?: string | number;
  designation?: string;
  exams?: string[];
  subjects?: ISubjectTopics[] | string[];
  isVerified?: boolean;
  registrationDate?: string | Date;
  createdAt?: string | Date;
}


// Options
export interface IOption {
  label: string, value: string, topics?: string[] | IOption[]
}

export interface IOptionsList {
  [optionName: string]: IOption[]
}

// Permissions 
export type IPermissionOfStaff = "Subjects" | "Students" | "Exams" | "QuestionBank" | "Reports" | "Subscriptions" | "Payments";

// Question Bank Options
export interface IQuestionBankOptions {
  option: string;
  optionImage?: File | string;
}

// Question Bank
export interface QuestionFormValues {
  subject: string;
  topic: string;
  questionText: string;
  questionImage?: File | string;
  options: IQuestionBankOptions[];
  correctAnswer: number;
  marks?: number;
  difficulty?: "Easy" | "Medium" | "Hard";
  explanation?: string;
  explanationImage?: File | string;
};

export interface OldQuestionFormValues {
  questionText: string;
  questionImage?: File | string;
  options: IQuestionBankOptions[];
  correctAnswer: number;
  explanation?: string;
  explanationImage?: File | string;
}

// Exam
export interface ITest {
  id: string,

  title: string;
  exam: string;
  language: string;
  questions: IQuestion[];
  totalQuestions: number;
  marks: number;
  duration: number;
  publish: boolean;
  hasResults?: boolean;
  questionCount?: number;
};

export interface ExamFormValues {
  title: string;
  exam: string;
  subject?: string;
  language: string;
  questions: string[];
  marks: number;
  duration: number;
  isPublished?: boolean;
};

// Transaction
export interface ITransaction {
  transactionId: string;
  amount: number;
  paymentMethod: string;
  offer?: string;
  transactionBy: string;
  date: string;
}

// Student Report
export interface IStudentReport {
  examId: string;
  score: number;
}

// Subscription 
export interface ISubscription {
  plan: string,
  status: string,
  startDate: string,
  endDate: string,
  trialEndsAt: string,
  autoRenew: boolean,
  amount: number
}

// Student 
export interface IStudent {
  id: string,
  userId: string,
  firstName: string,
  lastName: string,
  phone: string,
  email: string,
  subscription: ISubscription,
  createdAt: string,
  examsId?: string,
  examName?: string,
  language?: string,
  referralId?: string,
  referralCode?: string,
  isVerified?: boolean,
  subscriptionPlanId?: string,
  currentSubscriptionPlanId?: string,
  studentInstitutionId?: string
  referral?: string,
  subscriptionPlan?: ISubscriptionPlan,
  subscriptionRequest?:any
}


export interface ISubscriptionPlan {
  id: string;
  planName: string;
  planType: string;
  actualPrice: number;
  discountPercentage: number;
  gstPercentage: number;
  priceAfterDiscount: number;
  finalPrice?: number;
  basicPrice?: number;
  duration: number;
  features: string[];
  description?: string;
  subscriptionAccountId?: string;
  subscriptionAccount?: { id: string; name: string };
  institutionSubscriptions?: any[];
  isActive: boolean;
  isVisible?: boolean;
  createdAt?: string;
  updatedAt?: string;
}

export const staffPermissionsList = {
  roles: "Roles",
  staffs: "Staffs",
  students: "Students",
  exams: "Exams",
  syllabus: "Syllabus",
  subjects: "Subjects",
  questionBank: "QuestionBank",
  notesAndLinks: "NotesAndLinks",
  practiceTests: "PracticeTests",
  mockTest: "MockTests",
  oldQuestionsPapers: "PreviousQuestionsPapers",
  subscriptionRequests: "SubscriptionRequests",
  reportsScores: "ReportsScores",
  studentsReport: "ProgressOverview",
  paymentReports: "PaymentDetails",
  supportFeedback: "SupportFeedback",
};

export const institutionPermissionsList = {
  roles: "Roles",
  staffs: "Staffs",
  students: "Students",
  exams: "Exams",
  syllabus: "Syllabus",
  subjects: "Subjects",
  questionBank: "QuestionBank",
  notesAndLinks: "NotesAndLinks",
  practiceTests: "PracticeTests",
  mockTest: "MockTests",
  oldQuestionsPapers: "PreviousQuestionsPapers",
  subscriptionRequests: "SubscriptionRequests",
  reportsScores: "ReportsScores",
  studentsReport: "ProgressOverview",
  paymentReports: "PaymentDetails",
  supportFeedback: "SupportFeedback",
};


// Pagination
export interface IPagination {
  page: number;
  limit: number;
  total: number;
  totalPages: number;
}

// Subjects
export interface ISubjectTopics {
  id: string;
  language?: string;
  subjectName: string;
  topics?: string[];
}

// Subjects Questions
export interface ISubjectQuestions {
  id: string;
  language?: string;
  subjectName: string;
  topicsCount: number;
  questionsCount: number;
  testsCount: number;
}

// Subject Topics Questions
export interface ISubjectTopicQuestions {
  topic: string;
  questionsCount: number;
}

// Exams
export interface IExam {
  id?: string;
  examName: string;
  baseExamName?: string;
  sharedFromName?: string;
  testCount?: number;
  questionsCount?: number;
  isPublished?: boolean;
  mockTestCount?: number;
  papersCount?: number;
  createdAt?: string;
  updatedAt?: string;
}

// Syllabus
export interface ISyllabus {
  id: string;

  exam: string;
  examName?: string;
  syllabusFiles: string[];
  description: string;
  notification?: string;
  createdAt?: string;
  updatedAt?: string;
}

// Notification
export interface INotification {
  id: string;

  exam: string;
  examName?: string;
  title: string;
  description: string;
  date: string;
  files?: string[];
  createdAt?: string;
  updatedAt?: string;
}

// Old Questions
// Old Questions (Individual questions)
export interface IOldQuestions {
  id: string;
  exams: string[];
  language: string;
  year: string;
  questionText: string;
  questionImage: string;
  options: IQuestionOption[];
  correctAnswer: number;
  marks: number;
  difficulty: "Easy" | "Medium" | "Hard";
  publish: boolean;
  createdBy: string;
  explanation?: string;
  explanationImage?: string;
  createdAt: string;
  updatedAt: string;
}

// Old Question Paper
export interface IOldQuestionPaper {
  id: string;
  exam: string;
  examName?: string;
  year: number;
  language: string;
  title: string;
  totalQuestions?: number;
  duration: string;
  marks: number;
  difficulty: "Easy" | "Medium" | "Hard";
  publish: boolean;
  createdBy?: string;
  createdAt?: string;
  updatedAt?: string;
  referenceSourceId?: string | null;
  referenceInstitutionId?: string | null;
  referenceInstitutionName?: string | null;
}

// Old Question Paper Year
export interface IOldQuestionPaperYear {
  id?: string;
  title: string;
  year: string;
  duration?: number;
  marks?: number;
  language?: string;
  publish?: boolean;
  totalQuestions: number;
  isPaperCreated: boolean;
  referenceSourceId?: string | null;
  referenceInstitutionId?: string | null;
  referenceInstitutionName?: string | null;
}

export interface ISupport {
  id: string;

  user: { id: string; name: string; email: string };
  message: string;
  question?: { id: string; questionText: string };
  questionId?: string | null;
  questionType?: string | null;
  testName?: string;
  testType?: string;
  status: string;
  createdAt: string;
  updatedAt: string;
}

export interface IFeedback {
  id: string;
  user: { id: string; name: string; email: string; institutionName?: string | null; contactPerson?: string | null; };
  feedbackMessage: string;
  replyMessage?: string;
  status: string;
  rating?: number;
  target: "INSTITUTION" | "PLATFORM";
  studentInstitutionId?: string;
  institutionId?: string;
  submittedAt: string;
  repliedAt?: string;
  createdAt: string;
  updatedAt: string;
}

export interface IRole {
  id: string;
  roleName: string;
  permissions: string[];
  createdAt?: string;
  updatedAt?: string;
}

export interface IReferenceSequence {
  id: string;
  type: string;
  prefix: string;
  lastCount: number;
  isActive: boolean;
  endedAt?: string | null;
  createdAt?: string;
  updatedAt?: string;
}

export enum FeedbackStatus {
  PENDING = "PENDING",
  REVIEWED = "REVIEWED",
  RESOLVED = "RESOLVED",
  CLOSED = "CLOSED"
}

export enum SubscriptionStatus {
  TRIAL = "trial",
  ACTIVE = "active",
  EXPIRED = "expired",
  CANCELLED = "cancelled",
}

// Language Options

// export const languageOptions: IOption[] = [
//   "Assamese",
//   "Bengali",
//   "Bodo",
//   "Dogri",
//   "English",
//   "Gujarati",
//   "Hindi",
//   "Kannada",
//   "Kashmiri",
//   "Kondan",
//   "Maithili",
//   "Malayalam",
//   "Manipuri",
//   "Marathi",
//   "Nepali",
//   "Oriya",
//   "Punjabi",
//   "Sanskrit",
//   "Santhali",
//   "Sindhi",
//   "Tamil",
//   "Telugu",
//   "Urdu"
// ]
//   .sort((a, b) => a.localeCompare(b))
//   .map(lang => ({ label: lang, value: lang }));


export const indianStateOptions: IOption[] = [
  "Andaman and Nicobar Islands",
  "Andhra Pradesh",
  "Arunachal Pradesh",
  "Assam",
  "Bihar",
  "Chandigarh",
  "Chhattisgarh",
  "Dadra and Nagar Haveli and Daman and Diu",
  "Delhi",
  "Goa",
  "Gujarat",
  "Haryana",
  "Himachal Pradesh",
  "Jammu and Kashmir",
  "Jharkhand",
  "Karnataka",
  "Kerala",
  "Ladakh",
  "Lakshadweep",
  "Madhya Pradesh",
  "Maharashtra",
  "Manipur",
  "Meghalaya",
  "Mizoram",
  "Nagaland",
  "Odisha",
  "Puducherry",
  "Punjab",
  "Rajasthan",
  "Sikkim",
  "Tamil Nadu",
  "Telangana",
  "Tripura",
  "Uttar Pradesh",
  "Uttarakhand",
  "West Bengal",
]
  .sort((a, b) => a.localeCompare(b))
  .map((state) => ({
    label: state,
    value: state,
  }));