import machine
import time
import _thread
import config
import tempSensors
import shutdown
import control
import startup
import networking


# Initialize the WDT with a 10-second timeout
# wdt = machine.WDT(id=0, timeout=60000)  # 60 seconds

def get_reset_reason():
    reset_reason = machine.reset_cause()
    if reset_reason == machine.PWRON_RESET:
        print("Reboot was because of Power-On!")
    elif reset_reason == machine.WDT_RESET:
        print("Reboot was because of WDT!")
    return reset_reason


boot_reason = get_reset_reason()


def pulse_fuel_thread():
    #  TODO: Add some sort of heartbeat so if
    # the main thread fucks off, the pump stops
    while True:
        if config.pump_frequency > 0:
            period = 1.0 / config.pump_frequency
            config.PUMP_ON_TIME = 0.02
            off_time = period - config.PUMP_ON_TIME
            config.FUEL_PIN.on()
            time.sleep(config.PUMP_ON_TIME)
            config.FUEL_PIN.off()
            time.sleep(off_time)
            # print("PULSE!", config.pump_frequency, "Hz") #  uncomment if you want a debug when it pulses
        else:
            time.sleep(0.1)


_thread.start_new_thread(pulse_fuel_thread, ())


def emergency_stop(reason):
    while True:
        config.GLOW_PIN.off()
        config.FUEL_PIN.off()
        config.air_pwm.duty(1023)
        config.pump_frequency = 0
        if config.IS_WATER_HEATER:
            config.WATER_PIN.on()
        if config.HAS_SECOND_PUMP:
            config.WATER_SECONDARY_PIN.on()
        print(f"Emergency stop triggered due to {reason}. Please reboot to continue.")
        time.sleep(30)


def main():
    # states = ['INIT', 'OFF', 'STARTING', 'RUNNING', 'STANDBY', 'FAILURE', 'EMERGENCY_STOP']
    config.current_state = 'INIT'
    emergency_reason = None  # Variable to capture the reason for emergency stop

    while True:
        # Uncomment the following line if you're using a Watchdog Timer
        # wdt.feed()

        networking.run_networking()

        output_temp = tempSensors.read_output_temp()
        exhaust_temp = tempSensors.read_exhaust_temp()
        current_switch_value = config.SWITCH_PIN.value()

        # State transitions
        if config.current_state == 'INIT':
            reset_reason = get_reset_reason()
            if reset_reason == 'Some Specific Reason':
                emergency_reason = "Unusual Reset Reason"
                config.current_state = 'EMERGENCY_STOP'
            else:
                config.current_state = 'OFF'

        elif config.current_state == 'OFF':
            if current_switch_value == 0:
                if output_temp > config.TARGET_TEMP + 10:
                    config.current_state = 'STANDBY'
                elif config.startup_attempts < 3:
                    config.current_state = 'STARTING'
                else:
                    config.current_state = 'FAILURE'
            elif current_switch_value == 1:
                config.startup_attempts = 0  # Reset config.startup_attempts when switch is off
                config.current_state = 'OFF'
                if config.IS_WATER_HEATER:
                    config.WATER_PIN.off()
                if config.HAS_SECOND_PUMP:
                    config.WATER_SECONDARY_PIN.off()

        elif config.current_state == 'STARTING':
            startup.start_up()
            if config.startup_successful:
                config.current_state = 'RUNNING'
            else:
                config.startup_attempts += 1
                config.current_state = 'OFF'

        elif config.current_state == 'RUNNING':
            if exhaust_temp > config.EXHAUST_SAFE_TEMP:
                emergency_reason = "High Exhaust Temperature"
                config.current_state = 'EMERGENCY_STOP'
            elif output_temp > config.OUTPUT_SAFE_TEMP:
                emergency_reason = "High Output Temperature"
                shutdown.shut_down()
                config.current_state = 'EMERGENCY_STOP'
            elif output_temp > config.TARGET_TEMP + 10:
                shutdown.shut_down()
                config.current_state = 'STANDBY'
            elif current_switch_value == 1:
                shutdown.shut_down()
                config.current_state = 'OFF'
            else:
                control.control_air_and_fuel(output_temp, exhaust_temp)

        elif config.current_state == 'STANDBY':
            if output_temp < config.TARGET_TEMP - 10:
                config.current_state = 'STARTING'
            elif current_switch_value == 1:
                config.current_state = 'OFF'
            else:
                if config.IS_WATER_HEATER:
                    config.WATER_PIN.on()
                if config.HAS_SECOND_PUMP:
                    config.WATER_SECONDARY_PIN.on()

        elif config.current_state == 'FAILURE':
            print("Max startup attempts reached. Switch off and on to restart.")
            if current_switch_value == 1:
                config.current_state = 'OFF'

        elif config.current_state == 'EMERGENCY_STOP':
            emergency_stop(emergency_reason)
            if current_switch_value == 1:
                config.current_state = 'OFF'
                emergency_reason = None

        print(f"Current state: {config.current_state}")
        if emergency_reason:
            print(f"Emergency reason: {emergency_reason}")
        time.sleep(1)


if __name__ == "__main__":
    print("Reset/Boot Reason was:", boot_reason)
    main()
esp:0
esp:2
esp:4
esp:5
esp:12
esp:13
esp:14
esp:15
esp:16
esp:17
esp:18
esp:19
esp:21
esp:22
esp:23
esp:25
esp:26
esp:27
esp:32
esp:33
esp:34
esp:35
esp:3V3
esp:EN
esp:VP
esp:VN
esp:GND.1
esp:D2
esp:D3
esp:CMD
esp:5V
esp:GND.2
esp:TX
esp:RX
esp:GND.3
esp:D1
esp:D0
esp:CLK
led1:A
led1:C
led2:A
led2:C
led3:A
led3:C
led4:A
led4:C
ntc1:GND
ntc1:VCC
ntc1:OUT
sw1:1
sw1:2
sw1:3
ntc2:GND
ntc2:VCC
ntc2:OUT