export interface User {
  id: number;
  company_id: number;
  department_id: number | null;
  employee_code: string;
  first_name: string;
  last_name: string | null;
  email: string;
  phone: string | null;
  designation: string | null;
  status: 'ACTIVE';
  roles: Role[];
}

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

export interface Permission {
  id: number;
  permission_key: string;
  description: string | null;
}

export interface Job {
  id: number;
  company_id: number;
  job_number: string;
  title: string;
  description: string | null;
  job_type_id: number | null;
  priority_id: number | null;
  status_id: number;
  status: string;
  status_name?: string;
  created_by: number;
  customer_id: number | null;
  site_id: number | null;
  required_geofence_id: number | null;
  scheduled_start: string | null;
  scheduled_end: string | null;
  actual_start: string | null;
  actual_end: string | null;
  completion_percentage: number;
  remarks: string | null;
  location_address: string | null;
  location_latitude: number | null;
  location_longitude: number | null;
  created_at?: string;
}

export interface JobAssignment {
  company_id: number;
  job_id: number;
  user_id: number;
  assignment_role: string;
  assigned_by: number;
  assigned_at: string;
  status: string;
  first_name?: string;
  last_name?: string;
  email?: string;
}

export interface JobNote {
  id: number;
  company_id: number;
  job_id: number;
  user_id: number;
  note: string;
  note_type: string;
  created_at?: string;
  first_name?: string;
  last_name?: string;
}

export interface JobCheckin {
  id: number;
  company_id: number;
  job_id: number;
  user_id: number;
  checkin_time: string;
  checkin_latitude: number;
  checkin_longitude: number;
  checkin_accuracy: number | null;
  checkin_inside_geofence: boolean;
  manual_override: boolean;
  override_reason: string | null;
  checkout_time: string | null;
  checkout_latitude: number | null;
  checkout_longitude: number | null;
  checkout_accuracy: number | null;
  checkout_inside_geofence: boolean | null;
}

export interface JobMedia {
  id: number;
  company_id: number;
  job_id: number;
  user_id: number;
  media_type: 'BEFORE' | 'DURING' | 'AFTER';
  file_name: string;
  file_path: string;
  file_url: string;
  mime_type: string;
  file_size: number;
  latitude: number | null;
  longitude: number | null;
  gps_accuracy: number | null;
  captured_at: string;
  uploaded_at: string;
  device_id: string | null;
  description: string | null;
}

export interface JobStatusHistory {
  id: number;
  company_id: number;
  job_id: number;
  old_status_id: number;
  new_status_id: number;
  changed_by: number;
  reason: string | null;
  changed_at?: string;
  old_status_name?: string;
  new_status_name?: string;
}

export interface Geofence {
  id: number;
  company_id: number;
  name: string;
  type: 'CIRCLE';
  latitude: number;
  longitude: number;
  radius: number;
  status: 'ACTIVE';
  created_by: number;
}

export interface LocationLog {
  id: number;
  company_id: number;
  user_id: number;
  job_id: number | null;
  device_id: string | null;
  latitude: number;
  longitude: number;
  accuracy: number | null;
  altitude: number | null;
  speed: number | null;
  heading: number | null;
  battery_level: number | null;
  recorded_at: string;
}

export interface Material {
  id: number;
  company_id: number;
  category_id: number | null;
  unit_id: number | null;
  material_code: string;
  material_name: string;
  description: string | null;
  status: 'ACTIVE' | 'INACTIVE';
  stock_quantity: number;
  category_name?: string;
  unit_name?: string;
}

export interface MaterialCategory {
  id: number;
  company_id: number;
  name: string;
}

export interface MaterialUnit {
  id: number;
  name: string;
}

export interface MaterialRequest {
  id: number;
  company_id: number;
  job_id: number;
  material_id: number;
  requested_quantity: number;
  approved_quantity: number;
  issued_quantity: number;
  status: 'REQUESTED' | 'APPROVED' | 'REJECTED' | 'ORDERED';
  requested_by: number;
  approved_by: number | null;
  assigned_to: number | null;
  material_status: 'STOCK' | 'IN_USE' | 'RETURNED';
  remarks: string | null;
  material_name?: string;
  material_code?: string;
  category_name?: string;
  unit_name?: string;
  stock_quantity?: number;
  job_number?: string;
  job_title?: string;
  assigned_to_name?: string;
  assigned_to_last?: string;
  requested_by_name?: string;
  requested_by_last?: string;
  created_at?: string;
}

export interface MaterialOrder {
  id: number;
  company_id: number;
  job_id: number | null;
  order_number: string;
  requested_by: number;
  order_status: 'REQUESTED' | 'APPROVED' | 'ORDERED' | 'RECEIVED' | 'CANCELLED';
  order_date: string;
  expected_delivery_date: string | null;
  remarks: string | null;
  first_name?: string;
  last_name?: string;
  item_count?: number;
  items?: MaterialOrderItem[];
}

export interface MaterialOrderItem {
  id: number;
  order_id: number;
  material_id: number;
  quantity: number;
  unit_price: number;
  remarks: string | null;
  material_name?: string;
  material_code?: string;
}

export interface DashboardStats {
  total_jobs: number;
  draft_jobs: number;
  checked_in_jobs: number;
  in_progress_jobs: number;
  completed_jobs: number;
  active_users: number;
  recent_locations: LocationLog[];
}

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

export interface ApiResponse<T> {
  data?: T;
  message?: string;
  error?: string;
}

export type JobStatus = 'DRAFT' | 'CHECKED_IN' | 'IN_PROGRESS' | 'COMPLETED';
