import pygame
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
import numpy as np

# Funkcja definiująca źródło światła
def setup_lighting():
    ambient_light = [0.3, 0.3, 0.3, 1.0]
    diffuse_light = [0.7, 0.7, 0.7, 1.0]
    light_position = [0.0, 150.0, 150.0, 1.0]

    glLightfv(GL_LIGHT0, GL_AMBIENT, ambient_light)
    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse_light)
    glLightfv(GL_LIGHT0, GL_POSITION, light_position)

    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)
    glEnable(GL_COLOR_MATERIAL)
    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE)

# Funkcja wczytująca teksturę
def load_texture():
    texture_surface = pygame.image.load('robot_texture.png')
    texture_data = pygame.image.tostring(texture_surface, 'RGB', True)
    width = texture_surface.get_width()
    height = texture_surface.get_height()

    glEnable(GL_TEXTURE_2D)
    texture_id = glGenTextures(1)
    glBindTexture(GL_TEXTURE_2D, texture_id)
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texture_data)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)

    return texture_id

# Funkcja rysująca prostokąt

def draw_rect():
        # Przednia ściana (czerwona) z teksturą
    glColor3d(1, 0, 0)
    glBegin(GL_QUADS)   
    glVertex3d(10, 0, 0)
    glVertex3d(10, 40, 0)
    glVertex3d(-10, 40, 0)
    glVertex3d(-10, 0, 0)
    glEnd()

# Inicjalizacja Pygame i PyOpenGL
pygame.init()
display = (800, 600)
pygame.display.set_mode(display, DOUBLEBUF | OPENGL)
gluPerspective(45, (display[0] / display[1]), 0.1, 400.0)
glTranslatef(0.0, 0.0, -300)
glEnable(GL_DEPTH_TEST)
glFrontFace(GL_CCW)
glClearColor(1.0, 1.0, 1.0, 1.0)

# Ustawienie źródła światła
# setup_lighting()

# Wczytanie tekstury
# texture_id = load_texture()

# Kąty obrotu
x_angle = y_angle = z_angle = 0

# Zmienne przegubowe robota
rot_1 = rot_2 = rot_3 = 0.0

# Główna pętla
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        # Sprawdzenie naciśnięć klawiszy do obracania prostopadłościanu
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                y_angle -= 5
            if event.key == pygame.K_RIGHT:
                y_angle += 5
            if event.key == pygame.K_UP:
                x_angle -= 5
            if event.key == pygame.K_DOWN:
                x_angle += 5
            if event.key == pygame.K_q:
                z_angle -= 5
            if event.key == pygame.K_e:
                z_angle += 5
    # Czyszczenie ekranu i ustawienie obrotu
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glPushMatrix()
    
    glRotatef(x_angle, 1.0, 0.0, 0.0)
    glRotatef(y_angle, 0.0, 1.0, 0.0)
    glRotatef(z_angle, 0.0, 0.0, 1.0)

    ####################################################
    # Tu trzeba pisać kod naszej sceny::               #
    ####################################################
    glPolygonMode(GL_BACK, GL_LINE)
    #glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)

    draw_rect()
    
    glPopMatrix()

    pygame.display.flip()
    pygame.time.wait(10)

pygame.quit()
