using System;
using System.Collections.Generic;
using System.ComponentModel;
using TINK.Model.Bike;
using TINK.Model.State;

namespace TINK.Model.Bikes.Bike.BC
{
    public interface IBikeInfoMutable
    {
        /// <summary>
        /// Holds the unique id of the bike;
        /// </summary>
        int Id { get; }

        /// <summary> True if bike is a demo bike. </summary>
        bool IsDemo { get; }

        /// <summary> Returns the group (TINK, Konrad, ...). </summary>
        IEnumerable<string> Group { get; }

        /// <summary>
        /// Holds the count of wheels.
        /// </summary>
        WheelType? WheelType { get; }

        /// <summary>
        /// Holds the type of bike.
        /// </summary>
        TypeOfBike? TypeOfBike { get; }

        /// <summary> Holds the description of the bike. </summary>
        string Description { get; }

        /// <summary>
        /// Station a which bike is located, null otherwise.
        /// </summary>
        int? CurrentStation { get; }

        /// <summary>
        /// Holds the rent state of the bike.
        /// </summary>
        IStateInfoMutable State { get; }

        /// <summary>
        /// Uri of the operator or null, in case of single operator setup.
        /// </summary>
        Uri OperatorUri { get; }

        event PropertyChangedEventHandler PropertyChanged;
    }

    public enum NotifyPropertyChangedLevel
    {
        /// <summary> Notify about all property changes.</summary>
        All,

        /// <summary> Notify about no property changes.</summary>
        None
    }
}