/**
 * Generated by orval v8.9.1 🍺
 * Do not edit manually.
 * Api
 * Model Directory & Booking Platform API
 * OpenAPI spec version: 0.1.0
 */
export interface UploadUrlRequest {
  /**
     * Original file name.
     * @minLength 1
     */
  name: string;
  /**
     * File size in bytes.
     * @minimum 1
     */
  size: number;
  /**
     * MIME type of the file (e.g. `image/jpeg`).
     * @minLength 1
     */
  contentType: string;
}

export interface UploadUrlResponse {
  /** Presigned GCS URL for PUT upload. */
  uploadURL: string;
  /** Normalized object path (e.g. `/objects/uploads/uuid`). Store this in your database. */
  objectPath: string;
  metadata?: UploadUrlRequest;
}

export interface ErrorEnvelope {
  error: string;
}

export interface HealthStatus {
  status: string;
}

export interface RegisterInput {
  email: string;
  password: string;
  name: string;
  phone?: string;
}

export interface LoginInput {
  email: string;
  password: string;
}

export type UserRole = typeof UserRole[keyof typeof UserRole];


export const UserRole = {
  user: 'user',
  model: 'model',
  admin: 'admin',
} as const;

export interface User {
  id: number;
  email: string;
  name: string;
  /** @nullable */
  phone?: string | null;
  role: UserRole;
  isOnline: boolean;
  /** @nullable */
  avatarUrl?: string | null;
  /** @nullable */
  bio?: string | null;
  createdAt: string;
}

export interface AuthResponse {
  user: User;
  token: string;
}

export interface UserUpdate {
  name?: string;
  bio?: string;
  avatarUrl?: string;
}

export interface DashboardSummary {
  totalBookings: number;
  activeBookings: number;
  membershipLevel: string;
  profilesCount: number;
  locationsCount: number;
}

/**
 * @nullable
 */
export type ProfileProStatus = typeof ProfileProStatus[keyof typeof ProfileProStatus] | null;


export const ProfileProStatus = {
  professional: 'professional',
  non_professional: 'non_professional',
} as const;

export type ProfileApprovalStatus = typeof ProfileApprovalStatus[keyof typeof ProfileApprovalStatus];


export const ProfileApprovalStatus = {
  pending: 'pending',
  approved: 'approved',
  rejected: 'rejected',
} as const;

export interface Profile {
  id: number;
  profileId: string;
  /** @nullable */
  userId?: number | null;
  name: string;
  city: string;
  /** @nullable */
  photoUrl?: string | null;
  /** @nullable */
  bio?: string | null;
  /** @nullable */
  proStatus?: ProfileProStatus;
  /** @nullable */
  price1h?: number | null;
  /** @nullable */
  price2h?: number | null;
  /** @nullable */
  priceFullDay?: number | null;
  /** @nullable */
  priceNight?: number | null;
  /** @nullable */
  services?: string | null;
  /** @nullable */
  contactPlatform?: string | null;
  /** @nullable */
  whatsappNumber?: string | null;
  approvalStatus: ProfileApprovalStatus;
  isFeatured: boolean;
  isActive: boolean;
  tags?: string[];
  createdAt: string;
}

export type RegisterModelInputProStatus = typeof RegisterModelInputProStatus[keyof typeof RegisterModelInputProStatus];


export const RegisterModelInputProStatus = {
  professional: 'professional',
  non_professional: 'non_professional',
} as const;

export interface RegisterModelInput {
  name: string;
  city: string;
  proStatus: RegisterModelInputProStatus;
  price1h: number;
  price2h: number;
  priceFullDay: number;
  priceNight?: number;
  services: string;
  photoUrl?: string;
  bio?: string;
  contactPlatform?: string;
  whatsappNumber: string;
}

export interface ProfileInput {
  name: string;
  city: string;
  photoUrl?: string;
  bio?: string;
  isFeatured?: boolean;
  tags?: string[];
}

export type ProfileUpdateProStatus = typeof ProfileUpdateProStatus[keyof typeof ProfileUpdateProStatus];


export const ProfileUpdateProStatus = {
  professional: 'professional',
  non_professional: 'non_professional',
} as const;

export type ProfileUpdateApprovalStatus = typeof ProfileUpdateApprovalStatus[keyof typeof ProfileUpdateApprovalStatus];


export const ProfileUpdateApprovalStatus = {
  pending: 'pending',
  approved: 'approved',
  rejected: 'rejected',
} as const;

export interface ProfileUpdate {
  name?: string;
  city?: string;
  photoUrl?: string;
  bio?: string;
  proStatus?: ProfileUpdateProStatus;
  price1h?: number;
  price2h?: number;
  priceFullDay?: number;
  priceNight?: number;
  services?: string;
  contactPlatform?: string;
  whatsappNumber?: string;
  approvalStatus?: ProfileUpdateApprovalStatus;
  isFeatured?: boolean;
  isActive?: boolean;
  tags?: string[];
}

export type LocationType = typeof LocationType[keyof typeof LocationType];


export const LocationType = {
  hotel: 'hotel',
  venue: 'venue',
  safehouse: 'safehouse',
} as const;

export interface Location {
  id: number;
  name: string;
  city: string;
  type: LocationType;
  rating: number;
  /** @nullable */
  photoUrl?: string | null;
  /** @nullable */
  description?: string | null;
  /** @nullable */
  address?: string | null;
  isFeatured: boolean;
  isActive: boolean;
  createdAt: string;
}

export type LocationInputType = typeof LocationInputType[keyof typeof LocationInputType];


export const LocationInputType = {
  hotel: 'hotel',
  venue: 'venue',
  safehouse: 'safehouse',
} as const;

export interface LocationInput {
  name: string;
  city: string;
  type: LocationInputType;
  rating?: number;
  photoUrl?: string;
  description?: string;
  address?: string;
  isFeatured?: boolean;
}

export type LocationUpdateType = typeof LocationUpdateType[keyof typeof LocationUpdateType];


export const LocationUpdateType = {
  hotel: 'hotel',
  venue: 'venue',
  safehouse: 'safehouse',
} as const;

export interface LocationUpdate {
  name?: string;
  city?: string;
  type?: LocationUpdateType;
  rating?: number;
  photoUrl?: string;
  description?: string;
  address?: string;
  isFeatured?: boolean;
  isActive?: boolean;
}

export interface Service {
  id: number;
  name: string;
  /** @nullable */
  description?: string | null;
  hourlyRate: number;
  isActive: boolean;
  createdAt: string;
}

/**
 * @nullable
 */
export type BookingDuration = typeof BookingDuration[keyof typeof BookingDuration] | null;


export const BookingDuration = {
  '1h': '1h',
  '2h': '2h',
  full_day: 'full_day',
  night: 'night',
} as const;

/**
 * @nullable
 */
export type BookingLocationType = typeof BookingLocationType[keyof typeof BookingLocationType] | null;


export const BookingLocationType = {
  in_studio: 'in_studio',
  customer_location: 'customer_location',
} as const;

export type BookingStatus = typeof BookingStatus[keyof typeof BookingStatus];


export const BookingStatus = {
  pending: 'pending',
  accepted: 'accepted',
  paid: 'paid',
  proof_uploaded: 'proof_uploaded',
  completed: 'completed',
  rejected: 'rejected',
  cancelled: 'cancelled',
  refunded: 'refunded',
} as const;

export interface Booking {
  id: number;
  userId: number;
  /** @nullable */
  profileId?: number | null;
  /** @nullable */
  locationId?: number | null;
  /** @nullable */
  serviceId?: number | null;
  /** @nullable */
  profileName?: string | null;
  /** @nullable */
  locationName?: string | null;
  /** @nullable */
  serviceName?: string | null;
  /** @nullable */
  customerName?: string | null;
  /** @nullable */
  duration?: BookingDuration;
  /** @nullable */
  locationType?: BookingLocationType;
  /** @nullable */
  totalPrice?: number | null;
  status: BookingStatus;
  /** @nullable */
  notes?: string | null;
  /** @nullable */
  scheduledAt?: string | null;
  createdAt: string;
}

export type BookingInputDuration = typeof BookingInputDuration[keyof typeof BookingInputDuration];


export const BookingInputDuration = {
  '1h': '1h',
  '2h': '2h',
  full_day: 'full_day',
  night: 'night',
} as const;

export type BookingInputLocationType = typeof BookingInputLocationType[keyof typeof BookingInputLocationType];


export const BookingInputLocationType = {
  in_studio: 'in_studio',
  customer_location: 'customer_location',
} as const;

export interface BookingInput {
  profileId: number;
  locationId?: number;
  serviceId: number;
  duration: BookingInputDuration;
  locationType: BookingInputLocationType;
  notes?: string;
  scheduledAt: string;
}

export type BookingStatusInputStatus = typeof BookingStatusInputStatus[keyof typeof BookingStatusInputStatus];


export const BookingStatusInputStatus = {
  pending: 'pending',
  accepted: 'accepted',
  paid: 'paid',
  proof_uploaded: 'proof_uploaded',
  completed: 'completed',
  rejected: 'rejected',
  cancelled: 'cancelled',
  refunded: 'refunded',
} as const;

export interface BookingStatusInput {
  status: BookingStatusInputStatus;
}

export interface ProofUploadInput {
  photoUrl: string;
}

export type ProofReviewInputStatus = typeof ProofReviewInputStatus[keyof typeof ProofReviewInputStatus];


export const ProofReviewInputStatus = {
  approved: 'approved',
  rejected: 'rejected',
} as const;

export interface ProofReviewInput {
  status: ProofReviewInputStatus;
  note?: string;
}

export type AdminOrderProofStatus = typeof AdminOrderProofStatus[keyof typeof AdminOrderProofStatus];


export const AdminOrderProofStatus = {
  pending: 'pending',
  approved: 'approved',
  rejected: 'rejected',
} as const;

export interface AdminOrderProof {
  id: number;
  bookingId: number;
  userId?: number;
  photoUrl: string;
  status: AdminOrderProofStatus;
  /** @nullable */
  note?: string | null;
  /** @nullable */
  reviewedAt?: string | null;
  createdAt: string;
  /** @nullable */
  bookingStatus?: string | null;
  /** @nullable */
  totalPrice?: number | null;
  /** @nullable */
  duration?: string | null;
  /** @nullable */
  profileName?: string | null;
  /** @nullable */
  customerName?: string | null;
}

export interface EscrowStats {
  held: number;
  balance: number;
}

export type WalletTransactionType = typeof WalletTransactionType[keyof typeof WalletTransactionType];


export const WalletTransactionType = {
  deposit: 'deposit',
  order_payment: 'order_payment',
  earning: 'earning',
  commission: 'commission',
  withdrawal: 'withdrawal',
  refund: 'refund',
  escrow_in: 'escrow_in',
  escrow_out: 'escrow_out',
} as const;

export interface WalletTransaction {
  id: number;
  userId: number;
  type: WalletTransactionType;
  amount: number;
  balanceAfter: number;
  /** @nullable */
  bookingId?: number | null;
  /** @nullable */
  description?: string | null;
  createdAt: string;
}

export interface Wallet {
  balance: number;
  transactions: WalletTransaction[];
}

export type WalletDepositStatus = typeof WalletDepositStatus[keyof typeof WalletDepositStatus];


export const WalletDepositStatus = {
  pending: 'pending',
  approved: 'approved',
  rejected: 'rejected',
} as const;

export interface WalletDeposit {
  id: number;
  userId: number;
  amount: number;
  method: string;
  transactionId: string;
  status: WalletDepositStatus;
  /** @nullable */
  note?: string | null;
  /** @nullable */
  reviewedAt?: string | null;
  createdAt: string;
  userName?: string;
  userEmail?: string;
}

export type WithdrawalMethod = typeof WithdrawalMethod[keyof typeof WithdrawalMethod];


export const WithdrawalMethod = {
  bkash: 'bkash',
  nagad: 'nagad',
  rocket: 'rocket',
} as const;

export type WithdrawalStatus = typeof WithdrawalStatus[keyof typeof WithdrawalStatus];


export const WithdrawalStatus = {
  pending: 'pending',
  approved: 'approved',
  rejected: 'rejected',
} as const;

export interface Withdrawal {
  id: number;
  userId: number;
  amount: number;
  method: WithdrawalMethod;
  accountNumber: string;
  status: WithdrawalStatus;
  /** @nullable */
  note?: string | null;
  /** @nullable */
  reviewedAt?: string | null;
  createdAt: string;
  userName?: string;
  userEmail?: string;
}

export interface AdminWallet {
  id: number;
  userId: number;
  balance: number;
  userName?: string;
  userEmail?: string;
  userRole?: string;
  createdAt?: string;
}

export interface CommissionStats {
  today: number;
  thisMonth: number;
  total: number;
}

export interface DepositInput {
  amount: number;
  method: string;
  transactionId: string;
}

export type WithdrawalInputMethod = typeof WithdrawalInputMethod[keyof typeof WithdrawalInputMethod];


export const WithdrawalInputMethod = {
  bkash: 'bkash',
  nagad: 'nagad',
  rocket: 'rocket',
} as const;

export interface WithdrawalInput {
  amount: number;
  method: WithdrawalInputMethod;
  accountNumber: string;
}

export interface WalletCreditInput {
  amount: number;
  note?: string;
}

export type WalletReviewStatus = typeof WalletReviewStatus[keyof typeof WalletReviewStatus];


export const WalletReviewStatus = {
  approved: 'approved',
  rejected: 'rejected',
} as const;

export interface WalletReview {
  status: WalletReviewStatus;
  note?: string;
}

export interface Membership {
  id: number;
  userId: number;
  userName: string;
  userEmail: string;
  tier: string;
  /** @nullable */
  expiresAt?: string | null;
  createdAt: string;
}

export interface MembershipUpdate {
  tier: string;
  expiresAt?: string;
}

export interface MembershipPlan {
  id: number;
  key: string;
  name: string;
  price: number;
  durationDays: number;
  /** @nullable */
  description?: string | null;
  features: string[];
  sortOrder: number;
  isActive: boolean;
}

export interface MembershipPlanInput {
  key: string;
  name: string;
  price: number;
  durationDays?: number;
  description?: string;
  features?: string[];
  sortOrder?: number;
  isActive?: boolean;
}

export interface MembershipPlanUpdate {
  name?: string;
  price?: number;
  durationDays?: number;
  description?: string;
  features?: string[];
  sortOrder?: number;
  isActive?: boolean;
}

export interface PaymentMethod {
  id: number;
  method: string;
  label: string;
  receivingNumber: string;
  /** @nullable */
  instructions?: string | null;
  isActive: boolean;
  sortOrder: number;
}

export interface PaymentMethodUpdate {
  label?: string;
  receivingNumber?: string;
  instructions?: string;
  isActive?: boolean;
  sortOrder?: number;
}

export type MembershipPaymentStatus = typeof MembershipPaymentStatus[keyof typeof MembershipPaymentStatus];


export const MembershipPaymentStatus = {
  pending: 'pending',
  approved: 'approved',
  rejected: 'rejected',
} as const;

export interface MembershipPayment {
  id: number;
  userId: number;
  userName?: string;
  userEmail?: string;
  planId: number;
  planName?: string;
  method: string;
  transactionId: string;
  amount: number;
  paymentNumber: string;
  status: MembershipPaymentStatus;
  /** @nullable */
  note?: string | null;
  /** @nullable */
  reviewedAt?: string | null;
  createdAt: string;
}

export interface SubscribeInput {
  planId: number;
  method: string;
  transactionId: string;
}

export type MembershipPaymentReviewStatus = typeof MembershipPaymentReviewStatus[keyof typeof MembershipPaymentReviewStatus];


export const MembershipPaymentReviewStatus = {
  approved: 'approved',
  rejected: 'rejected',
} as const;

export interface MembershipPaymentReview {
  status: MembershipPaymentReviewStatus;
  note?: string;
}

export interface NetworkMember {
  id: number;
  name: string;
  /** @nullable */
  avatarUrl?: string | null;
  isOnline: boolean;
  membershipTier: string;
  joinedAt: string;
}

export interface Asset {
  id: number;
  title: string;
  /** @nullable */
  description?: string | null;
  category: string;
  url: string;
  /** @nullable */
  iconName?: string | null;
}

export type RegisterModelAccountInputProStatus = typeof RegisterModelAccountInputProStatus[keyof typeof RegisterModelAccountInputProStatus];


export const RegisterModelAccountInputProStatus = {
  professional: 'professional',
  non_professional: 'non_professional',
} as const;

export interface RegisterModelAccountInput {
  name: string;
  email: string;
  password: string;
  city: string;
  proStatus: RegisterModelAccountInputProStatus;
  price1h: number;
  price2h: number;
  priceFullDay: number;
  priceNight?: number;
  services: string;
  whatsappNumber: string;
  photoUrl?: string;
  bio?: string;
}

export interface ForgotPasswordInput {
  email: string;
}

export interface ResetPasswordInput {
  token: string;
  password: string;
}

export interface FavoriteInput {
  profileId: number;
}

export interface EarningsSummary {
  availableBalance: number;
  totalEarnings: number;
  completedBookings: number;
  recent: WalletTransaction[];
}

export type ModelProfileUpdateProStatus = typeof ModelProfileUpdateProStatus[keyof typeof ModelProfileUpdateProStatus];


export const ModelProfileUpdateProStatus = {
  professional: 'professional',
  non_professional: 'non_professional',
} as const;

export interface ModelProfileUpdate {
  name?: string;
  city?: string;
  bio?: string;
  photoUrl?: string;
  proStatus?: ModelProfileUpdateProStatus;
  price1h?: number;
  price2h?: number;
  priceFullDay?: number;
  priceNight?: number;
  services?: string;
  whatsappNumber?: string;
}

export interface AddPhotoInput {
  url: string;
  sortOrder?: number;
}

export interface ProfilePhoto {
  id: number;
  profileId: number;
  url: string;
  sortOrder: number;
  createdAt: string;
}

export type ListProfilesParams = {
search?: string;
city?: string;
};

export type ListLocationsParams = {
type?: ListLocationsType;
city?: string;
};

export type ListLocationsType = typeof ListLocationsType[keyof typeof ListLocationsType];


export const ListLocationsType = {
  hotel: 'hotel',
  venue: 'venue',
  safehouse: 'safehouse',
} as const;

