import os
import time
import pygame
from datetime import datetime
from PIL import Image

# --- GPIO Raspberry Pi ---
try:
    import RPi.GPIO as GPIO
    IS_PI = True
except ImportError:
    IS_PI = False

# --- Configuration générale ---
BUTTON_PIN = 18
COOLDOWN_SECONDS = 10
PHOTO_PATH = "/home/photobox/Images"
PHOTO_FILENAME_TEMPLATE = "photo_{timestamp}.jpg"
PRINT_COMMAND_TEMPLATE = "lp -d Selphy-CP1500 {}"
PRINTER_NAME = "Selphy-CP1500"
PHOTO_WIDTH, PHOTO_HEIGHT = 1920, 1080
COUNTDOWN_TIME = 5

# --- Configuration des logos ---
LOGO_PATH = "/home/photobox/logos"
LOGO_FILES = ["logo_bricc.png", "logo_tacti.png", "logo_miete.png"]
LOGO_SIZE = (120, 60)
LOGO_PADDING = 15

# --- Préparation des dossiers ---
os.makedirs(PHOTO_PATH, exist_ok=True)

# --- Setup GPIO ---
if IS_PI:
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)

# --- Pygame setup ---
pygame.init()
WINDOW_SIZE = pygame.display.Info().current_w, pygame.display.Info().current_h
screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
pygame.display.set_caption("Photobox")
pygame.font.init()
font = pygame.font.SysFont(None, 200)
pygame.mouse.set_visible(False)

# --- Chargement des logos ---
def load_logos():
    logos = []
    current_x = WINDOW_SIZE[0] - LOGO_PADDING
    bottom_y = WINDOW_SIZE[1] - LOGO_PADDING
    for filename in reversed(LOGO_FILES):
        try:
            path = os.path.join(LOGO_PATH, filename)
            logo_img = pygame.image.load(path).convert_alpha()
            logo_img = pygame.transform.scale(logo_img, LOGO_SIZE)
            rect = logo_img.get_rect(bottomright=(current_x, bottom_y))
            logos.append((logo_img, rect))
            current_x -= (LOGO_SIZE[0] + LOGO_PADDING)
        except Exception as e:
            print(f"ERREUR: Impossible de charger le logo '{filename}': {e}")
    return logos

logos_to_display = load_logos()

def draw_logos():
    for surface, rect in logos_to_display:
        screen.blit(surface, rect)

# --- Fonctions principales ---
def show_text(text, duration=1):
    screen.fill((0, 0, 0))
    render = font.render(str(text), True, (255, 255, 255))
    rect = render.get_rect(center=(WINDOW_SIZE[0] // 2, WINDOW_SIZE[1] // 2))
    screen.blit(render, rect)
    draw_logos()
    pygame.display.flip()
    time.sleep(duration)

def show_ready():
    show_text("Prêt !", duration=0.1)

def countdown():
    for i in range(COUNTDOWN_TIME, 0, -1):
        show_text(i)

def capture_photo():
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    filename = os.path.join(PHOTO_PATH, PHOTO_FILENAME_TEMPLATE.format(timestamp=timestamp))
    capture_cmd = f"libcamera-jpeg -o {filename} -t 1000 --width {PHOTO_WIDTH} --height {PHOTO_HEIGHT}"
    os.system(capture_cmd)
    return filename

def show_image(image_path):
    try:
        img = pygame.image.load(image_path)
        img = pygame.transform.scale(img, WINDOW_SIZE)
        screen.blit(img, (0, 0))
        draw_logos()
        pygame.display.flip()
        time.sleep(3)
    except Exception as e:
        print(f"Erreur d'affichage image: {e}")
        show_text("Erreur Image", duration=3)

def printer_is_online():
    try:
        status = os.popen(f"lpstat -p {PRINTER_NAME}").read()
        return "is idle" in status or "printing" in status
    except Exception:
        return False

def print_photo(image_path):
    png_path = image_path.replace(".jpg", ".png")
    img = Image.open(image_path)
    img.save(png_path)
    if not printer_is_online():
        show_text("Erreur: imprimante \néteinte", duration=3)
        return
    show_text("Impression...", duration=1.5)
    os.system(PRINT_COMMAND_TEMPLATE.format(png_path))

def wait_for_button_press():
    if not IS_PI:
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    exit()
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_SPACE:
                        return
                    if event.key == pygame.K_ESCAPE:
                        pygame.quit()
                        exit()
            time.sleep(0.1)
    else:
        while True:
            if GPIO.input(BUTTON_PIN) == GPIO.LOW:
                return
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    GPIO.cleanup()
                    exit()
            time.sleep(0.1)

# --- Boucle principale ---
def main_loop():
    if not printer_is_online():
        show_text("Erreur: Imprimante hors ligne", duration=5)
        pygame.quit()
        if IS_PI:
            GPIO.cleanup()
        exit()

    last_capture_time = 0
    try:
        while True:
            show_ready()
            wait_for_button_press()
            current_time = time.time()
            if current_time - last_capture_time < COOLDOWN_SECONDS:
                continue
            countdown()
            show_text("Souriez !", duration=1.5)
            photo_path = capture_photo()
            show_image(photo_path)
            print_photo(photo_path)
            last_capture_time = time.time()
    except KeyboardInterrupt:
        pygame.quit()
        if IS_PI:
            GPIO.cleanup()

if __name__ == "__main__":
    main_loop()