#!/usr/bin/env python3
"""
Two-Way Traffic Light Controller
==================================
Controls traffic lights at a simple crossroads intersection.

Circuit:
--------
Direction A (North-South): Red=GPIO2, Amber=GPIO3, Green=GPIO4
Direction B (East-West):   Red=GPIO17, Amber=GPIO27, Green=GPIO22

Logic:
------
- Only one direction has green at a time
- All-red safety buffer between direction changes
- UK-style red+amber before green

Author: Based on gpiozero documentation
"""

from gpiozero import TrafficLights
from time import sleep

# Define the two sets of traffic lights
lights_a = TrafficLights(2, 3, 4)    # North-South
lights_b = TrafficLights(17, 27, 22) # East-West

# Timing constants (in seconds)
GREEN_TIME = 10
AMBER_TIME = 3
ALL_RED_TIME = 2
RED_AMBER_TIME = 2

def set_lights(lights, red=False, amber=False, green=False):
    """
    Set the state of a traffic light set.
    
    Args:
        lights: TrafficLights object
        red: Boolean for red light
        amber: Boolean for amber light
        green: Boolean for green light
    """
    lights.red.value = red
    lights.amber.value = amber
    lights.green.value = green

def main():
    """
    Main traffic light control loop.
    Implements the complete two-way intersection cycle.
    """
    print("Two-Way Traffic Light Controller")
    print("=================================")
    print("Press Ctrl+C to stop")
    print()
    
    # Initialize: Both red
    set_lights(lights_a, red=True)
    set_lights(lights_b, red=True)
    sleep(2)
    
    try:
        while True:
            # ============================================
            # PHASE 1: Direction A gets green
            # ============================================
            print("Phase 1: A=Red+Amber, B=Red")
            set_lights(lights_a, red=True, amber=True)
            set_lights(lights_b, red=True)
            sleep(RED_AMBER_TIME)
            
            print("Phase 2: A=Green, B=Red")
            set_lights(lights_a, green=True)
            set_lights(lights_b, red=True)
            sleep(GREEN_TIME)
            
            print("Phase 3: A=Amber, B=Red")
            set_lights(lights_a, amber=True)
            set_lights(lights_b, red=True)
            sleep(AMBER_TIME)
            
            print("Phase 4: A=Red, B=Red (safety buffer)")
            set_lights(lights_a, red=True)
            set_lights(lights_b, red=True)
            sleep(ALL_RED_TIME)
            
            # ============================================
            # PHASE 2: Direction B gets green
            # ============================================
            print("Phase 5: A=Red, B=Red+Amber")
            set_lights(lights_a, red=True)
            set_lights(lights_b, red=True, amber=True)
            sleep(RED_AMBER_TIME)
            
            print("Phase 6: A=Red, B=Green")
            set_lights(lights_a, red=True)
            set_lights(lights_b, green=True)
            sleep(GREEN_TIME)
            
            print("Phase 7: A=Red, B=Amber")
            set_lights(lights_a, red=True)
            set_lights(lights_b, amber=True)
            sleep(AMBER_TIME)
            
            print("Phase 8: A=Red, B=Red (safety buffer)")
            set_lights(lights_a, red=True)
            set_lights(lights_b, red=True)
            sleep(ALL_RED_TIME)
            
            print("-" * 40)
    
    except KeyboardInterrupt:
        print("\n\nShutting down...")
        # Turn all lights off
        lights_a.off()
        lights_b.off()
        print("All lights off. Goodbye!")

if __name__ == "__main__":
    main()
