// ── USER ──────────────────────────────────────────────────────────────────
class UserModel {
  final int? id;
  final String nombre;
  final String email;
  final String password;
  final String rol;

  UserModel({this.id, required this.nombre, required this.email,
      required this.password, required this.rol});

  Map<String, dynamic> toMap() =>
      {'id':id,'nombre':nombre,'email':email,'password':password,'rol':rol};

  factory UserModel.fromMap(Map<String, dynamic> m) => UserModel(
      id:m['id'], nombre:m['nombre'], email:m['email'],
      password:m['password'], rol:m['rol']);
}

// ── DOMICILIO (User → Domicilio → Zona → Ruta) ────────────────────────────
class DomicilioModel {
  final int? id;
  final int userId;
  final String alias;      // "Casa", "Trabajo", etc.
  final String calle;
  final String colonia;    // Zona de cobertura
  final String routeId;   // Ruta asignada
  final String horarioEstimado;
  final bool isPrimary;

  DomicilioModel({this.id, required this.userId, this.alias = 'Casa',
      required this.calle, required this.colonia, required this.routeId,
      required this.horarioEstimado, this.isPrimary = true});

  Map<String, dynamic> toMap() => {'id':id,'user_id':userId,'alias':alias,
      'calle':calle,'colonia':colonia,'route_id':routeId,
      'horario_estimado':horarioEstimado,'is_primary':isPrimary?1:0};

  factory DomicilioModel.fromMap(Map<String, dynamic> m) => DomicilioModel(
      id:m['id'], userId:m['user_id'], alias:m['alias']??'Casa',
      calle:m['calle'], colonia:m['colonia'], routeId:m['route_id'],
      horarioEstimado:m['horario_estimado'], isPrimary:m['is_primary']==1);
}

// ── RUTA DINÁMICA (creada por admin) ──────────────────────────────────────
class RouteDefinitionModel {
  final int? id;
  final String routeId;
  final String nombre;
  final List<String> dias;        // ['LUNES','MIERCOLES','VIERNES']
  final String horaInicio;        // '06:00'
  final String horaFin;           // '08:00'
  final String turno;             // MATUTINO|VESPERTINO|NOCTURNO
  final List<String> colonias;    // colonias que cubre
  final bool activa;

  RouteDefinitionModel({this.id, required this.routeId, required this.nombre,
      required this.dias, required this.horaInicio, required this.horaFin,
      required this.turno, required this.colonias, this.activa = true});

  Map<String, dynamic> toMap() => {
    'id':id,'route_id':routeId,'nombre':nombre,
    'dias':dias.join(','),'hora_inicio':horaInicio,'hora_fin':horaFin,
    'turno':turno,'colonias':colonias.join('|'),'activa':activa?1:0,
  };

  factory RouteDefinitionModel.fromMap(Map<String, dynamic> m) =>
      RouteDefinitionModel(
        id:m['id'], routeId:m['route_id'], nombre:m['nombre'],
        dias:(m['dias']??'').toString().split(',').where((s)=>s.isNotEmpty).toList(),
        horaInicio:m['hora_inicio']??'06:00', horaFin:m['hora_fin']??'08:00',
        turno:m['turno']??'MATUTINO',
        colonias:(m['colonias']??'').toString().split('|').where((s)=>s.isNotEmpty).toList(),
        activa:m['activa']==1,
      );
}

// ── RESEÑA DEL SERVICIO ───────────────────────────────────────────────────
class ReviewModel {
  final int? id;
  final int userId;
  final String colonia;
  final String routeId;
  final int estrellas;       // 1-5
  final String comentario;
  final String fecha;
  final String nombreUsuario;

  ReviewModel({this.id, required this.userId, required this.colonia,
      required this.routeId, required this.estrellas, required this.comentario,
      required this.fecha, this.nombreUsuario = ''});

  Map<String, dynamic> toMap() => {'id':id,'user_id':userId,'colonia':colonia,
      'route_id':routeId,'estrellas':estrellas,'comentario':comentario,
      'fecha':fecha,'nombre_usuario':nombreUsuario};

  factory ReviewModel.fromMap(Map<String, dynamic> m) => ReviewModel(
      id:m['id'], userId:m['user_id'], colonia:m['colonia'],
      routeId:m['route_id'], estrellas:m['estrellas'],
      comentario:m['comentario']??'', fecha:m['fecha'],
      nombreUsuario:m['nombre_usuario']??'Ciudadano');
}

// ── ASSIGNMENT ────────────────────────────────────────────────────────────
class AssignmentModel {
  final int? id;
  final int conductorId;
  final String routeId;
  final String diaSemana;
  final String turno;

  AssignmentModel({this.id, required this.conductorId, required this.routeId,
      required this.diaSemana, required this.turno});

  Map<String, dynamic> toMap() => {'id':id,'conductor_id':conductorId,
      'route_id':routeId,'dia_semana':diaSemana,'turno':turno};

  factory AssignmentModel.fromMap(Map<String, dynamic> m) => AssignmentModel(
      id:m['id'], conductorId:m['conductor_id'], routeId:m['route_id'],
      diaSemana:m['dia_semana'], turno:m['turno']);
}

// ── ROUTE STATUS ──────────────────────────────────────────────────────────
class RouteStatusModel {
  final String routeId;
  final String status;
  final String? mensaje;
  final String updatedAt;

  RouteStatusModel({required this.routeId, required this.status,
      this.mensaje, required this.updatedAt});

  Map<String, dynamic> toMap() => {'route_id':routeId,'status':status,
      'mensaje':mensaje,'updated_at':updatedAt};

  factory RouteStatusModel.fromMap(Map<String, dynamic> m) => RouteStatusModel(
      routeId:m['route_id'], status:m['status'],
      mensaje:m['mensaje'], updatedAt:m['updated_at']);
}

// ── ALERTA ────────────────────────────────────────────────────────────────
class AlertaModel {
  final int? id;
  final String tipo;
  final String routeId;
  final String mensaje;
  final String fecha;
  final bool resuelta;

  AlertaModel({this.id, required this.tipo, required this.routeId,
      required this.mensaje, required this.fecha, this.resuelta=false});

  Map<String, dynamic> toMap() => {'id':id,'tipo':tipo,'route_id':routeId,
      'mensaje':mensaje,'fecha':fecha,'resuelta':resuelta?1:0};

  factory AlertaModel.fromMap(Map<String, dynamic> m) => AlertaModel(
      id:m['id'], tipo:m['tipo'], routeId:m['route_id'],
      mensaje:m['mensaje'], fecha:m['fecha'], resuelta:m['resuelta']==1);
}

// ── REPORTE ───────────────────────────────────────────────────────────────
class ReporteModel {
  final int? id;
  final int userId;
  final String tipo;
  final String descripcion;
  final String colonia;
  final String routeId;
  final String fecha;
  final String estado;
  final int calificacion;

  ReporteModel({this.id, required this.userId, required this.tipo,
      required this.descripcion, required this.colonia, required this.routeId,
      required this.fecha, this.estado='PENDIENTE', this.calificacion=5});

  Map<String, dynamic> toMap() => {'id':id,'user_id':userId,'tipo':tipo,
      'descripcion':descripcion,'colonia':colonia,'route_id':routeId,
      'fecha':fecha,'estado':estado,'calificacion':calificacion};

  factory ReporteModel.fromMap(Map<String, dynamic> m) => ReporteModel(
      id:m['id'], userId:m['user_id'], tipo:m['tipo'],
      descripcion:m['descripcion'], colonia:m['colonia'],
      routeId:m['route_id']??'', fecha:m['fecha'],
      estado:m['estado'], calificacion:m['calificacion']??5);
}
