import cv2
import numpy as np

print("\n=== LEITOR AVALIA 2026 ===\n")

# carregar imagem
img = cv2.imread("fotos/teste1.jpg")

if img is None:
    print("Erro: imagem não encontrada")
    exit()

# converter cinza
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

blur = cv2.GaussianBlur(gray,(5,5),0)

thresh = cv2.threshold(
blur,
0,
255,
cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)[1]

# encontrar contornos externos
contours,_ = cv2.findContours(
thresh,
cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_SIMPLE)

# maior contorno = quadro das respostas
maior=max(contours,key=cv2.contourArea)

x,y,w,h=cv2.boundingRect(maior)

recorte=img[y:y+h,x:x+w]

# trabalhar no quadro
gray2=cv2.cvtColor(recorte,cv2.COLOR_BGR2GRAY)

blur2=cv2.GaussianBlur(gray2,(7,7),0)

thresh2=cv2.threshold(
blur2,
0,
255,
cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)[1]


# detectar círculos
circulos=cv2.HoughCircles(
blur2,
cv2.HOUGH_GRADIENT,
1.2,
40,
param1=50,
param2=30,
minRadius=10,
maxRadius=25
)

lista=[]

if circulos is None:
    print("Nenhuma bolinha detectada")
    exit()

circulos=np.round(circulos[0,:]).astype("int")

for (x,y,r) in circulos:

    mask=np.zeros(thresh2.shape,dtype="uint8")

    cv2.circle(mask,(x,y),r,255,-1)

    total=cv2.countNonZero(
        cv2.bitwise_and(thresh2,thresh2,mask=mask)
    )

    lista.append((x,y,total))


print("Bolinhas encontradas:",len(lista))


# ordenar por altura
lista = sorted(lista, key=lambda i:i[1])

linhas=[]

tolerancia=20

for item in lista:

    colocado=False

    for linha in linhas:

        if abs(linha[0][1]-item[1])<tolerancia:

            linha.append(item)
            colocado=True
            break

    if not colocado:

        linhas.append([item])


linhas=sorted(linhas,key=lambda l:l[0][1])


respostas={}

questao_esq=1
questao_dir=11


for linha in linhas:

    if len(linha)<8:
        continue

    # ordenar esquerda → direita
    linha=sorted(linha,key=lambda i:i[0])

    esquerda=linha[:4]
    direita=linha[4:8]


    # coluna esquerda
    valores=[i[2] for i in esquerda]

    alternativa=np.argmax(valores)

    respostas[questao_esq]=["A","B","C","D"][alternativa]


    # coluna direita
    valores=[i[2] for i in direita]

    alternativa=np.argmax(valores)

    respostas[questao_dir]=["A","B","C","D"][alternativa]


    questao_esq+=1
    questao_dir+=1


print("\nRESPOSTAS ENCONTRADAS:\n")

for i in range(1,21):
    print(i,respostas.get(i,"-"))