use super::{ElevatorGroupObject, EscalatorObject, LiftObject};
use std::borrow::Cow;
use bacnet_types::enums::PropertyIdentifier as P;
use crate::property_metadata::{
PropertyConformance::{Optional, RequiredRead},
PropertyMetadata,
PropertyWriteCapability::{Always, ReadOnly, WhenOutOfService},
};
const ELEVATOR_GROUP_BASE: &[PropertyMetadata] = &[
PropertyMetadata::new(P::OBJECT_IDENTIFIER, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::OBJECT_NAME, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::DESCRIPTION, Optional, None, Always),
PropertyMetadata::new(P::OBJECT_TYPE, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::MACHINE_ROOM_ID, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::GROUP_ID, RequiredRead, None, Always),
PropertyMetadata::new(P::GROUP_MEMBERS, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::GROUP_MODE, Optional, None, Always),
PropertyMetadata::new(P::LANDING_CALLS, Optional, None, ReadOnly),
PropertyMetadata::new(P::LANDING_CALL_CONTROL, Optional, None, Always),
PropertyMetadata::new(P::PROPERTY_LIST, RequiredRead, None, ReadOnly),
];
const ESCALATOR_BASE: &[PropertyMetadata] = &[
PropertyMetadata::new(P::OBJECT_IDENTIFIER, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::OBJECT_NAME, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::OBJECT_TYPE, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::DESCRIPTION, Optional, None, Always),
PropertyMetadata::new(P::STATUS_FLAGS, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::ELEVATOR_GROUP, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::GROUP_ID, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::INSTALLATION_ID, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::POWER_MODE, Optional, None, Always),
PropertyMetadata::new(P::OPERATION_DIRECTION, RequiredRead, None, Always),
PropertyMetadata::new(P::ESCALATOR_MODE, Optional, None, Always),
PropertyMetadata::new(P::ENERGY_METER, Optional, None, Always),
PropertyMetadata::new(P::ENERGY_METER_REF, Optional, None, ReadOnly),
PropertyMetadata::new(P::RELIABILITY, Optional, None, ReadOnly),
PropertyMetadata::new(P::OUT_OF_SERVICE, RequiredRead, None, Always),
PropertyMetadata::new(P::FAULT_SIGNALS, Optional, None, Always),
PropertyMetadata::new(P::PASSENGER_ALARM, RequiredRead, None, Always),
PropertyMetadata::new(P::PROPERTY_LIST, RequiredRead, None, ReadOnly),
];
const LIFT_BASE: &[PropertyMetadata] = &[
PropertyMetadata::new(P::OBJECT_IDENTIFIER, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::OBJECT_NAME, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::OBJECT_TYPE, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::DESCRIPTION, Optional, None, Always),
PropertyMetadata::new(P::STATUS_FLAGS, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::ELEVATOR_GROUP, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::GROUP_ID, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::INSTALLATION_ID, RequiredRead, None, ReadOnly),
PropertyMetadata::new(P::FLOOR_TEXT, Optional, None, ReadOnly),
PropertyMetadata::new(P::ASSIGNED_LANDING_CALLS, Optional, None, WhenOutOfService),
PropertyMetadata::new(P::MAKING_CAR_CALL, Optional, None, WhenOutOfService),
PropertyMetadata::new(P::REGISTERED_CAR_CALL, Optional, None, WhenOutOfService),
PropertyMetadata::new(P::CAR_POSITION, RequiredRead, None, Always),
PropertyMetadata::new(P::CAR_MOVING_DIRECTION, RequiredRead, None, Always),
PropertyMetadata::new(P::CAR_ASSIGNED_DIRECTION, Optional, None, WhenOutOfService),
PropertyMetadata::new(P::CAR_DOOR_STATUS, RequiredRead, None, WhenOutOfService),
PropertyMetadata::new(P::CAR_DOOR_COMMAND, Optional, None, WhenOutOfService),
PropertyMetadata::new(P::CAR_DOOR_ZONE, Optional, None, WhenOutOfService),
PropertyMetadata::new(P::CAR_MODE, Optional, None, WhenOutOfService),
PropertyMetadata::new(P::CAR_LOAD, Optional, None, Always),
PropertyMetadata::new(P::CAR_LOAD_UNITS, Optional, None, ReadOnly),
PropertyMetadata::new(P::NEXT_STOPPING_FLOOR, Optional, None, WhenOutOfService),
PropertyMetadata::new(P::PASSENGER_ALARM, RequiredRead, None, Always),
PropertyMetadata::new(P::ENERGY_METER, Optional, None, Always),
PropertyMetadata::new(P::ENERGY_METER_REF, Optional, None, ReadOnly),
PropertyMetadata::new(P::RELIABILITY, Optional, None, ReadOnly),
PropertyMetadata::new(P::OUT_OF_SERVICE, RequiredRead, None, Always),
PropertyMetadata::new(P::CAR_DRIVE_STATUS, Optional, None, WhenOutOfService),
PropertyMetadata::new(P::FAULT_SIGNALS, RequiredRead, None, Always),
PropertyMetadata::new(P::LANDING_DOOR_STATUS, Optional, None, WhenOutOfService),
PropertyMetadata::new(P::PROPERTY_LIST, RequiredRead, None, ReadOnly),
];
pub(super) fn for_elevator_group_object(
_object: &ElevatorGroupObject,
) -> Cow<'_, [PropertyMetadata]> {
Cow::Borrowed(ELEVATOR_GROUP_BASE)
}
pub(super) fn for_escalator_object(_object: &EscalatorObject) -> Cow<'_, [PropertyMetadata]> {
Cow::Borrowed(ESCALATOR_BASE)
}
pub(super) fn for_lift_object(_object: &LiftObject) -> Cow<'_, [PropertyMetadata]> {
Cow::Borrowed(LIFT_BASE)
}