import 'package:flutter/foundation.dart';

/// Model representing a taxi service with contact and location information
@immutable
class TaxiModel {
  final String id;
  final String name;
  final String phone;
  final String corregimiento;
  final String shift;
  final bool isActive;
  final DateTime createdAt;
  final DateTime updatedAt;

  const TaxiModel({
    required this.id,
    required this.name,
    required this.phone,
    required this.corregimiento,
    required this.shift,
    required this.isActive,
    required this.createdAt,
    required this.updatedAt,
  });

  /// Create TaxiModel from Supabase JSON response
  factory TaxiModel.fromJson(Map<String, dynamic> json) {
    return TaxiModel(
      id: json['id'] as String,
      name: json['name'] as String,
      phone: json['phone'] as String,
      corregimiento: json['corregimiento'] as String,
      shift: json['shift'] as String,
      isActive: json['is_active'] as bool? ?? true,
      createdAt: DateTime.parse(json['created_at'] as String),
      updatedAt: DateTime.parse(json['updated_at'] as String),
    );
  }

  /// Convert TaxiModel to JSON for Supabase operations
  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'name': name,
      'phone': phone,
      'corregimiento': corregimiento,
      'shift': shift,
      'is_active': isActive,
      'created_at': createdAt.toIso8601String(),
      'updated_at': updatedAt.toIso8601String(),
    };
  }

  /// Create a copy with modified properties
  TaxiModel copyWith({
    String? id,
    String? name,
    String? phone,
    String? corregimiento,
    String? shift,
    bool? isActive,
    DateTime? createdAt,
    DateTime? updatedAt,
  }) {
    return TaxiModel(
      id: id ?? this.id,
      name: name ?? this.name,
      phone: phone ?? this.phone,
      corregimiento: corregimiento ?? this.corregimiento,
      shift: shift ?? this.shift,
      isActive: isActive ?? this.isActive,
      createdAt: createdAt ?? this.createdAt,
      updatedAt: updatedAt ?? this.updatedAt,
    );
  }

  @override
  bool operator ==(Object other) {
    if (identical(this, other)) return true;
    return other is TaxiModel && other.id == id;
  }

  @override
  int get hashCode => id.hashCode;

  @override
  String toString() {
    return 'TaxiModel(id: $id, name: $name, phone: $phone, corregimiento: $corregimiento, shift: $shift, isActive: $isActive)';
  }
}

/// Model representing a user's favorite taxi
@immutable
class FavoriteTaxiModel {
  final String id;
  final String userId;
  final String taxiId;
  final DateTime createdAt;

  const FavoriteTaxiModel({
    required this.id,
    required this.userId,
    required this.taxiId,
    required this.createdAt,
  });

  /// Create FavoriteTaxiModel from Supabase JSON response
  factory FavoriteTaxiModel.fromJson(Map<String, dynamic> json) {
    return FavoriteTaxiModel(
      id: json['id'] as String,
      userId: json['user_id'] as String,
      taxiId: json['taxi_id'] as String,
      createdAt: DateTime.parse(json['created_at'] as String),
    );
  }

  /// Convert FavoriteTaxiModel to JSON for Supabase operations
  Map<String, dynamic> toJson() {
    return {
      'id': id,
      'user_id': userId,
      'taxi_id': taxiId,
      'created_at': createdAt.toIso8601String(),
    };
  }

  @override
  bool operator ==(Object other) {
    if (identical(this, other)) return true;
    return other is FavoriteTaxiModel && other.id == id;
  }

  @override
  int get hashCode => id.hashCode;

  @override
  String toString() {
    return 'FavoriteTaxiModel(id: $id, userId: $userId, taxiId: $taxiId)';
  }
}
