#include "ratgdo_binary_sensor.h"
#include "../ratgdo_state.h"
#include "esphome/core/log.h"

namespace esphome {
namespace ratgdo {

    static const char* const TAG = "ratgdo.binary_sensor";

    void RATGDOBinarySensor::setup()
    {
        if (this->binary_sensor_type_ == SensorType::RATGDO_SENSOR_MOTION) {
            this->publish_initial_state(false);
            this->parent_->subscribe_motion_state([=](MotionState state) {
                this->publish_state(state == MotionState::DETECTED);
            });
        } else if (this->binary_sensor_type_ == SensorType::RATGDO_SENSOR_OBSTRUCTION) {
            this->publish_initial_state(false);
            this->parent_->subscribe_obstruction_state([=](ObstructionState state) {
                this->publish_state(state == ObstructionState::OBSTRUCTED);
            });
        } else if (this->binary_sensor_type_ == SensorType::RATGDO_SENSOR_MOTOR) {
            this->parent_->subscribe_motor_state([=](MotorState state) {
                this->publish_state(state == MotorState::ON);
            });
        } else if (this->binary_sensor_type_ == SensorType::RATGDO_SENSOR_BUTTON) {
            this->publish_initial_state(false);
            this->parent_->subscribe_button_state([=](ButtonState state) {
                this->publish_state(state == ButtonState::PRESSED);
            });
        } else if (this->binary_sensor_type_ == SensorType::RATGDO_SENSOR_VEHICLE_DETECTED) {
            this->publish_initial_state(false);
            this->parent_->subscribe_vehicle_detected_state([=](VehicleDetectedState state) {
                this->publish_state(state == VehicleDetectedState::YES);
                this->parent_->presence_change(state == VehicleDetectedState::YES);
            });
        } else if (this->binary_sensor_type_ == SensorType::RATGDO_SENSOR_VEHICLE_ARRIVING) {
            this->publish_initial_state(false);
            this->parent_->subscribe_vehicle_arriving_state([=](VehicleArrivingState state) {
                this->publish_state(state == VehicleArrivingState::YES);
            });
        } else if (this->binary_sensor_type_ == SensorType::RATGDO_SENSOR_VEHICLE_LEAVING) {
            this->publish_initial_state(false);
            this->parent_->subscribe_vehicle_leaving_state([=](VehicleLeavingState state) {
                this->publish_state(state == VehicleLeavingState::YES);
            });
        }
    }

    void RATGDOBinarySensor::dump_config()
    {
        LOG_BINARY_SENSOR("", "RATGDO BinarySensor", this);
        if (this->binary_sensor_type_ == SensorType::RATGDO_SENSOR_MOTION) {
            ESP_LOGCONFIG(TAG, "  Type: Motion");
        } else if (this->binary_sensor_type_ == SensorType::RATGDO_SENSOR_OBSTRUCTION) {
            ESP_LOGCONFIG(TAG, "  Type: Obstruction");
        } else if (this->binary_sensor_type_ == SensorType::RATGDO_SENSOR_MOTOR) {
            ESP_LOGCONFIG(TAG, "  Type: Motor");
        } else if (this->binary_sensor_type_ == SensorType::RATGDO_SENSOR_BUTTON) {
            ESP_LOGCONFIG(TAG, "  Type: Button");
        } else if (this->binary_sensor_type_ == SensorType::RATGDO_SENSOR_VEHICLE_DETECTED) {
            ESP_LOGCONFIG(TAG, " Type: VehicleDetected");
        } else if (this->binary_sensor_type_ == SensorType::RATGDO_SENSOR_VEHICLE_ARRIVING) {
            ESP_LOGCONFIG(TAG, " Type: VehicleArriving");
        } else if (this->binary_sensor_type_ == SensorType::RATGDO_SENSOR_VEHICLE_LEAVING) {
            ESP_LOGCONFIG(TAG, " Type: VehicleLeaving");
        }
    }

} // namespace ratgdo
} // namespace esphome