export type Person = {
    name: string;
    age: number;
    email: string;
}


export interface User {
  id: number;
  name?: string | null;
  email: string;
  mobile: string;
  profilePicUrl?: string;
  address?: string;
  joinDate?: Date;
  specializations: DoctorSpecialization[] | null;
  qualifications?: string;
  hospital?: string;
  hospitalId?: number;
  consultationFee?: string;
}

export interface Hospital {
  id: number;
  name: string;
  description?: string;
  address: string;
  adminId?: number;
  adminName?: string;
  hospitalImages?: string[]
}

export interface DoctorSpecialization {
  id: number;
  name: string | null;
  description: string | null;
}

export interface DoctorInfo {
  id: number;
  qualifications: string | null;
  dailyTokenCount: number;
  consultationFee: number | string;
}

export interface Doctor {
  id: number;
  name: string;
  username?: string | null;
  email?: string | null;
  mobile?: string;
  doctorInfo?: DoctorInfo;
  specializations?: DoctorSpecialization[] | null;
  qualifications: string | null;
}

export interface DoctorDetails {
  id: number;
  name: string;
  username?: string | null;
  email?: string | null;
  mobile?: string;
  profilePicUrl?: string | null;
  address?: string | null;
  joinDate?: string | null;
  role: string;
  roles: string[];
  doctorId: number;
  qualifications?: string | null;
  dailyTokenCount: number;
  consultationFee: number;
  hospital?: string;
  hospitalId?: number;
  description?: string | null;
  yearsOfExperience?: number | null;
  specializations: {
    id: number;
    name: string;
    description: string | null;
  }[];
  isConsultationsPaused: boolean;
  pauseReason: string | null;
}

// Define local DashboardDoctor type based on the API response structure
export interface DashboardDoctor {
  availableTokens: number;
  consultationFee: string;
  consultationsDone: number;
  currentConsultationNumber: number;
  id: number;
  isAvailable: boolean;
  name: string;
  profilePicUrl?: string | null;
  qualifications: string | null;
  tokensIssuedToday: number;
  totalTokenCount: number;
}

// Token types
export interface TokenDoctor {
  id: number;
  name: string;
  mobile: string;
  profilePicUrl: string | null;
}

export interface UpcomingToken {
  id: number;
  tokenDate: string;
  queueNumber: number;
  description: string | null;
  createdAt: string;
  doctor: TokenDoctor;
  currentConsultationNumber?: number; // Current consultation number for the doctor
}

export interface PastToken {
  id: number;
  tokenDate: string;
  queueNumber: number;
  description: string | null;
  createdAt: string;
  doctor: TokenDoctor;
  status?: 'COMPLETED' | 'MISSED' | 'CANCELLED';
  consultationNotes?: string | null;
}

export interface UpcomingAppointment {
  id: number;
  doctorName: string;
  doctorImageUrl?: string;
  date: string;
  hospital: string;
  queueNumber: number;
  status: string;
}

export interface MyTokensResponse {
  message: string;
  tokens: UpcomingToken[];
}

export interface PastTokensResponse {
  message: string;
  tokens: PastToken[];
}

export interface BookTokenPayload {
  doctorId: number;
  userId: number;
  tokenDate: string;
  description?: string;
}

export interface BookTokenResponse {
  message: string;
  token: {
    id: number;
    doctorId: number;
    userId: number;
    tokenDate: string;
    queueNumber: number;
    description: string | null;
    createdAt: string;
  };
}

// Doctor availability types
export interface DoctorAvailability {
  id: number;
  doctorId: number;
  date: string;
  totalTokenCount: number;
  filledTokenCount: number;
  consultationsDone: number;
  isStopped: boolean;
  availableTokens: number;
  isPaused: boolean;
  isLeave: boolean;
  pauseReason: string | null;
}

export interface DoctorAvailabilityWithDate {
  date: string;
  availability: DoctorAvailability | null;
}

export interface DoctorAvailabilityResponse {
  message: string;
  doctorId: number;
  availabilities: DoctorAvailabilityWithDate[];
}

export interface DoctorAvailabilityPayload {
  doctorId: number;
  date: string;
  tokenCount: number;
  isStopped?: boolean;
  filledTokenCount?: number;
  consultationsDone?: number;
}


export interface token_user {
  id: number;
  name: string;
  mobile: string;
  age: number;
  gender: string;
}

export interface ProductSummary {
  id: number;
  name: string;
  shortDescription?: string;
  price: number;
  unit: string;
  isOutOfStock: boolean;
  nextDeliveryDate: string | null;
  images: string[];
}

export interface GetSlotsProductIdsPayload {
  slotIds: number[];
}

export interface GetSlotsProductIdsResponse {
  [slotId: number]: number[];
}

export interface Order {
  id: string;
  orderId: string;
  readableId: string;
  customerName: string;
  address: string;
  totalAmount: number;
  items: {
    name: string;
    quantity: number;
    price: number;
    amount: number;
    unit: string;
    isPackaged: boolean;
    isPackageVerified: boolean;
  }[];
  deliveryTime: string;
  status: 'pending' | 'delivered' | 'cancelled';
  isPackaged: boolean;
  isDelivered: boolean;
  isCod: boolean;
  paymentMode: string;
  paymentStatus: string;
  slotId: number;
}

export interface Slot {
  id: number;
  deliveryTime: string;
  freezeTime: string;
  isActive: boolean;
  deliverySequence?: number[];
}

export interface Coupon {
  id: number;
  couponCode: string;
  isUserBased: boolean;
  discountPercent: string | null;
  flatDiscount: string | null;
  minOrder: string | null;
  targetUser: {
    id: number;
    name: string | null;
    mobile: string;
  } | null;
  productIds: number[] | null;
  createdBy: number;
  creator: {
    id: number;
    name: string | null;
  } | null;
  maxValue: string | null;
  isApplyForAll: boolean;
  validTill: Date | null;
  maxLimitForUser: number | null;
  isInvalidated: boolean;
  createdAt: Date;
}

export interface CreateCouponPayload {
  couponCode: string;
  discountPercent?: number;
  flatDiscount?: number;
  minOrder?: number;
  maxValue?: number;
  validTill?: string;
  maxLimitForUser?: number;
  isApplyForAll: boolean;
  isUserBased: boolean;
  targetUsers?: number[];
  productIds?: number[];
  applicableUsers?: number[];
  applicableProducts?: number[];
  exclusiveApply?: boolean;
}

// Patient History Types
export interface PatientHistoryToken {
  id: number;
  queueNum: number;
  tokenDate: string;
  doctorName: string;
  status: string;
  description: string;
  consultationNotes?: string;
}

export interface PatientHistory {
  id: number;
  name: string;
  mobile: string;
  age: number;
  gender: string;
  totalTokens: number;
  completedTokens: number;
  upcomingTokens: number;
  firstVisitDate: string;
  lastVisitDate: string;
  tokens: PatientHistoryToken[];
}

export interface GetHospitalPatientHistoryResponse {
  message: string;
  patients: PatientHistory[];
  totalCount: number;
  page: number;
  limit: number;
}

export interface PatientHistoryFilters {
  patientIds?: string[];
  doctorIds?: string[];
  statuses?: string[];
  startDate?: string | null;
  endDate?: string | null;
}


// Export the types from token-types.ts
export * from './token-types';