export interface ApiSuccessResponse<T = unknown> {
  success: true;
  message: string;
  data: T;
}

export interface ApiErrorResponse {
  success: false;
  message: string;
  errorCode: string;
  details?: Record<string, unknown>;
}

export interface PaginatedResponse<T> {
  items: T[];
  page: number;
  limit: number;
  total: number;
  totalPages: number;
}

export interface PaginationQuery {
  page?: number;
  limit?: number;
}

export type ApiResponse<T = unknown> = ApiSuccessResponse<T> | ApiErrorResponse;

export interface SendOtpRequest {
  phone: string;
}

export interface VerifyOtpRequest {
  phone: string;
  otp: string;
}

export interface VerifyOtpResponse {
  accessToken: string;
  refreshToken: string;
  user: {
    id: string;
    fullName: string;
    roles: string[];
  };
}

export interface RefreshTokenRequest {
  refreshToken: string;
}

export interface CreateUserRequest {
  phone: string;
  email?: string;
  fullName: string;
  profilePhotoUrl?: string;
}

export interface UpdateUserRequest {
  email?: string;
  fullName?: string;
  profilePhotoUrl?: string;
  isActive?: boolean;
}

export interface AssignRoleRequest {
  roleId: string;
  schoolId?: string;
}

export interface CreateSchoolRequest {
  name: string;
  address: string;
  city: string;
  state: string;
  pincode: string;
  contactPhone: string;
}

export interface UpdateSchoolRequest {
  name?: string;
  address?: string;
  city?: string;
  state?: string;
  pincode?: string;
  contactPhone?: string;
}

export interface UpdateSchoolStatusRequest {
  status: 'ACTIVE' | 'INACTIVE' | 'SUSPENDED';
}

export interface CreateStudentRequest {
  fullName: string;
  classGrade?: string;
  section?: string;
  rollNumber?: string;
  photoUrl?: string;
}

export interface UpdateStudentRequest {
  fullName?: string;
  classGrade?: string;
  section?: string;
  rollNumber?: string;
  photoUrl?: string;
  isActive?: boolean;
}

export interface CreateParentRequest {
  phone: string;
  fullName: string;
  email?: string;
  relationship: 'FATHER' | 'MOTHER' | 'GUARDIAN';
  isPrimary: boolean;
}

export interface CreateGuardianRequest {
  phone: string;
  fullName: string;
  email?: string;
  accessLevel: 'FULL' | 'TRIP_ONLY' | 'NONE';
}

export interface UpdateGuardianAccessRequest {
  accessLevel: 'FULL' | 'TRIP_ONLY' | 'NONE';
}

export interface CreateVehicleRequest {
  vehicleNumber: string;
  vehicleType: 'BUS' | 'AUTO' | 'VAN';
  capacity: number;
}

export interface UpdateVehicleRequest {
  vehicleNumber?: string;
  vehicleType?: 'BUS' | 'AUTO' | 'VAN';
  capacity?: number;
  gpsDeviceId?: string;
}

export interface UpdateVehicleStatusRequest {
  status: 'ACTIVE' | 'INACTIVE' | 'MAINTENANCE';
}

export interface CreateDriverRequest {
  phone: string;
  fullName: string;
  licenseNumber: string;
  vehicleId?: string;
}

export interface UpdateDriverRequest {
  licenseNumber?: string;
  vehicleId?: string;
  isActive?: boolean;
}

export interface CreateAttendantRequest {
  phone: string;
  fullName: string;
  vehicleId?: string;
}

export interface UpdateAttendantRequest {
  vehicleId?: string;
  isActive?: boolean;
}

export interface CreateRouteRequest {
  name: string;
  type: 'MORNING' | 'EVENING' | 'BOTH';
  vehicleId?: string;
}

export interface UpdateRouteRequest {
  name?: string;
  type?: 'MORNING' | 'EVENING' | 'BOTH';
  isActive?: boolean;
}

export interface CreateRouteStopRequest {
  stopName: string;
  latitude: number;
  longitude: number;
  sequenceOrder: number;
  estimatedTime?: string;
}

export interface UpdateRouteStopRequest {
  stopName?: string;
  latitude?: number;
  longitude?: number;
  sequenceOrder?: number;
  estimatedTime?: string;
}

export interface StartTripRequest {
  routeId: string;
  vehicleId: string;
  type: 'MORNING' | 'EVENING';
}

export interface CreateTripEventRequest {
  eventType: string;
  description?: string;
  latitude?: number;
  longitude?: number;
}

export interface UpdateTripStatusRequest {
  status: string;
}

export interface GpsIngestRequest {
  deviceImei: string;
  vehicleId: string;
  latitude: number;
  longitude: number;
  speed?: number;
  heading?: number;
  ignitionStatus?: boolean;
  recordedAt: string;
}

export interface CreateGpsDeviceRequest {
  deviceImei: string;
  vehicleId?: string;
  firmwareVersion?: string;
}

export interface UpdateGpsDeviceRequest {
  vehicleId?: string;
  status?: 'ACTIVE' | 'INACTIVE' | 'MAINTENANCE';
  firmwareVersion?: string;
}

export interface CreateGeofenceRequest {
  name: string;
  type: 'SCHOOL_ARRIVAL' | 'STOP_ZONE';
  centerLat: number;
  centerLng: number;
  radiusMeters: number;
}

export interface UpdateGeofenceRequest {
  name?: string;
  centerLat?: number;
  centerLng?: number;
  radiusMeters?: number;
  isActive?: boolean;
}

export interface GeofenceCheckRequest {
  lat: number;
  lng: number;
  schoolId: string;
}

export interface CreateRfidCardRequest {
  cardUid: string;
}

export interface AssignRfidCardRequest {
  cardId: string;
  studentId: string;
}

export interface UpdateRfidCardStatusRequest {
  status: 'ACTIVE' | 'INACTIVE' | 'LOST' | 'REPLACED';
}

export interface RfidScanRequest {
  cardUid: string;
  tripId: string;
  vehicleId: string;
  scanType: string;
  scanSource: string;
  scannedAt: string;
}

export interface RfidManualOverrideRequest {
  studentId: string;
  tripId: string;
  scanType: 'MANUAL_BOARDING' | 'MANUAL_DEBOARDING';
  reason: string;
  overriddenBy: string;
}

export interface SendNotificationRequest {
  userId: string;
  eventType: string;
  title: string;
  body: string;
  channel: 'PUSH' | 'SMS' | 'WHATSAPP';
}

export interface CreateNotificationTemplateRequest {
  eventType: string;
  title: string;
  bodyTemplate: string;
  channel: 'PUSH' | 'SMS' | 'WHATSAPP';
}

export interface CreateTicketRequest {
  category: string;
  priority: string;
  subject: string;
  message: string;
  schoolId?: string;
}

export interface UpdateTicketStatusRequest {
  status: string;
}

export interface CreateTicketMessageRequest {
  message: string;
}

export interface EscalateTicketRequest {
  reason: string;
}

export interface CreateInsurancePartnerRequest {
  name: string;
  contactPerson?: string;
  contactPhone?: string;
  licenseNumber?: string;
}

export interface CreateInsuranceRequestPayload {
  studentId: string;
  consent: boolean;
  notes?: string;
}

export interface UpdateInsuranceRequestStatusRequest {
  status: string;
  notes?: string;
}

export interface CreateWelcomeKitRequest {
  studentId: string;
}

export interface UpdateWelcomeKitStatusRequest {
  status: string;
}

export interface CreateWelcomeKitItemRequest {
  itemType: string;
  status?: string;
  notes?: string;
}

export interface UpdateWelcomeKitItemStatusRequest {
  status: 'INCLUDED' | 'MISSING' | 'REPLACED';
}

export interface CreateSubscriptionRequest {
  schoolId: string;
  planName: string;
  studentLimit: number;
  vehicleLimit: number;
  startDate: string;
  endDate: string;
}

export interface UpdateSubscriptionRequest {
  planName?: string;
  studentLimit?: number;
  vehicleLimit?: number;
  endDate?: string;
  status?: 'ACTIVE' | 'EXPIRED' | 'CANCELLED';
}

export interface CreateInvoiceRequest {
  schoolId: string;
  subscriptionId?: string;
  amount: number;
  currency?: string;
  dueDate: string;
}

export interface ReportDateQuery {
  date?: string;
  schoolId?: string;
}

export interface ReportRangeQuery {
  from?: string;
  to?: string;
  schoolId?: string;
}

export interface DriverDelayReportRequest {
  reason: string;
  estimatedDelay: number;
}

export interface DriverSosRequest {
  message?: string;
  lat: number;
  lng: number;
}

export interface AttendantManualStatusRequest {
  scanType: 'MANUAL_BOARDING' | 'MANUAL_DEBOARDING' | 'ABSENT';
  reason: string;
  tripId: string;
}
