#!/usr/bin/env python3
"""
Three-Way Traffic Light Controller (Paired Operation)
=====================================================
Controls traffic lights at a T-junction where the main road
(A and B) operates together against the side road (C).

Circuit:
--------
Direction A (Main road - North): Red=GPIO2, Amber=GPIO3, Green=GPIO4
Direction B (Main road - South): Red=GPIO17, Amber=GPIO27, Green=GPIO22
Direction C (Side road):          Red=GPIO10, Amber=GPIO9, Green=GPIO11

Logic:
------
- A and B are paired (same road, opposite directions)
- When A+B are green, C is red
- When C is green, A+B are red
- All-red safety buffers between changes

Author: Based on gpiozero documentation
"""

from gpiozero import TrafficLights
from time import sleep

# Define the three sets of traffic lights
lights_a = TrafficLights(2, 3, 4)     # Main road North
lights_b = TrafficLights(17, 27, 22)  # Main road South
lights_c = TrafficLights(10, 9, 11)   # Side road

# Timing constants (in seconds)
MAIN_ROAD_GREEN = 12  # A+B get more time (busier road)
SIDE_ROAD_GREEN = 8   # C gets less time
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 for T-junction.
    """
    print("Three-Way Traffic Light Controller (Paired Operation)")
    print("=====================================================")
    print("Press Ctrl+C to stop")
    print()
    print("A+B: Main road (paired)")
    print("C:   Side road")
    print()
    
    # Initialize: All red
    set_lights(lights_a, red=True)
    set_lights(lights_b, red=True)
    set_lights(lights_c, red=True)
    sleep(2)
    
    try:
        while True:
            # ============================================
            # PHASE 1: Main road (A+B) gets green
            # ============================================
            print("Phase 1: A+B=Red+Amber, C=Red")
            set_lights(lights_a, red=True, amber=True)
            set_lights(lights_b, red=True, amber=True)
            set_lights(lights_c, red=True)
            sleep(RED_AMBER_TIME)
            
            print("Phase 2: A+B=Green, C=Red")
            set_lights(lights_a, green=True)
            set_lights(lights_b, green=True)
            set_lights(lights_c, red=True)
            sleep(MAIN_ROAD_GREEN)
            
            print("Phase 3: A+B=Amber, C=Red")
            set_lights(lights_a, amber=True)
            set_lights(lights_b, amber=True)
            set_lights(lights_c, red=True)
            sleep(AMBER_TIME)
            
            print("Phase 4: A+B=Red, C=Red (safety buffer)")
            set_lights(lights_a, red=True)
            set_lights(lights_b, red=True)
            set_lights(lights_c, red=True)
            sleep(ALL_RED_TIME)
            
            # ============================================
            # PHASE 2: Side road (C) gets green
            # ============================================
            print("Phase 5: A+B=Red, C=Red+Amber")
            set_lights(lights_a, red=True)
            set_lights(lights_b, red=True)
            set_lights(lights_c, red=True, amber=True)
            sleep(RED_AMBER_TIME)
            
            print("Phase 6: A+B=Red, C=Green")
            set_lights(lights_a, red=True)
            set_lights(lights_b, red=True)
            set_lights(lights_c, green=True)
            sleep(SIDE_ROAD_GREEN)
            
            print("Phase 7: A+B=Red, C=Amber")
            set_lights(lights_a, red=True)
            set_lights(lights_b, red=True)
            set_lights(lights_c, amber=True)
            sleep(AMBER_TIME)
            
            print("Phase 8: A+B=Red, C=Red (safety buffer)")
            set_lights(lights_a, red=True)
            set_lights(lights_b, red=True)
            set_lights(lights_c, red=True)
            sleep(ALL_RED_TIME)
            
            print("-" * 50)
    
    except KeyboardInterrupt:
        print("\n\nShutting down...")
        # Turn all lights off
        lights_a.off()
        lights_b.off()
        lights_c.off()
        print("All lights off. Goodbye!")

if __name__ == "__main__":
    main()
