#!/usr/bin/env python3
"""
Tests for the Flask application
"""

import pytest
import json
# Fixtures are imported from conftest.py


def test_index_page(client):
    """Test that the index page loads correctly."""
    response = client.get('/')
    assert response.status_code == 200
    assert b'Balotario Licencia Clase A' in response.data
    assert b'Estudiar' in response.data
    assert b'Practicar' in response.data
    assert b'Examen' in response.data


def test_study_page(client):
    """Test that the study page loads correctly."""
    response = client.get('/study')
    assert response.status_code == 200
    assert b'Modo Estudio' in response.data


def test_practice_page(client):
    """Test that the practice page loads correctly."""
    response = client.get('/practice')
    assert response.status_code == 200
    assert b'Modo Pr\xc3\xa1ctica' in response.data  # "Práctica" in UTF-8


def test_exam_page(client):
    """Test that the exam page loads correctly."""
    response = client.get('/exam')
    assert response.status_code == 200
    assert b'Examen Simulado' in response.data


def test_api_questions_all(client):
    """Test the API endpoint for getting all questions."""
    response = client.get('/api/questions?mode=all')
    assert response.status_code == 200

    data = json.loads(response.data)
    assert isinstance(data, list)
    assert len(data) > 0

    # Check structure of first question
    if data:
        question = data[0]
        assert 'id' in question
        assert 'question' in question
        assert 'options' in question
        assert 'correct' in question
        assert 'has_image' in question
        assert isinstance(question['options'], list)
        assert len(question['options']) >= 2


def test_api_questions_range(client):
    """Test the API endpoint for getting questions by range."""
    response = client.get('/api/questions?mode=range&start=1&end=5')
    assert response.status_code == 200

    data = json.loads(response.data)
    assert isinstance(data, list)
    assert len(data) <= 5

    # Check that question IDs are within range
    for question in data:
        assert 1 <= question['id'] <= 5


def test_api_questions_random(client):
    """Test the API endpoint for getting random questions."""
    response = client.get('/api/questions?mode=random&count=10')
    assert response.status_code == 200

    data = json.loads(response.data)
    assert isinstance(data, list)
    assert len(data) <= 10


def test_api_questions_invalid_mode(client):
    """Test the API endpoint with invalid mode (falls back to all questions)."""
    response = client.get('/api/questions?mode=invalid')
    assert response.status_code == 200

    data = json.loads(response.data)
    assert isinstance(data, list)
    # Should return all questions as fallback
    assert len(data) > 0


def test_api_questions_missing_parameters(client):
    """Test the API endpoint with missing parameters (uses defaults)."""
    # Range mode without start/end (uses defaults)
    response = client.get('/api/questions?mode=range')
    assert response.status_code == 200

    data = json.loads(response.data)
    assert isinstance(data, list)
    assert len(data) > 0

    # Random mode without count (uses default of 20)
    response = client.get('/api/questions?mode=random')
    assert response.status_code == 200

    data = json.loads(response.data)
    assert isinstance(data, list)
    assert len(data) <= 20  # Should use default count


def test_static_files(client):
    """Test that static files are accessible."""
    # Test CSS file
    response = client.get('/static/css/fontawesome-local.css')
    assert response.status_code == 200

    # Test JS file
    response = client.get('/static/js/app.js')
    assert response.status_code == 200


def test_favicon(client):
    """Test that favicon is accessible."""
    response = client.get('/static/favicon.svg')
    assert response.status_code == 200


def test_question_parsing_consistency(client):
    """Test that question parsing is consistent across API calls."""
    # Get the same question range twice
    response1 = client.get('/api/questions?mode=range&start=1&end=3')
    response2 = client.get('/api/questions?mode=range&start=1&end=3')

    assert response1.status_code == 200
    assert response2.status_code == 200

    data1 = json.loads(response1.data)
    data2 = json.loads(response2.data)

    # Should return the same questions
    assert len(data1) == len(data2)
    for q1, q2 in zip(data1, data2):
        assert q1['id'] == q2['id']
        assert q1['question'] == q2['question']
        assert q1['correct'] == q2['correct']


def test_question_structure_validation(client):
    """Test that all questions have the required structure."""
    response = client.get('/api/questions?mode=range&start=1&end=10')
    assert response.status_code == 200

    data = json.loads(response.data)

    for question in data:
        # Required fields
        assert 'id' in question
        assert 'question' in question
        assert 'options' in question
        assert 'correct' in question
        assert 'has_image' in question

        # Data types
        assert isinstance(question['id'], int)
        assert isinstance(question['question'], str)
        assert isinstance(question['options'], list)
        assert isinstance(question['correct'], str)
        assert isinstance(question['has_image'], bool)

        # Content validation
        assert len(question['question']) > 0
        assert len(question['options']) >= 2
        assert question['correct'] in ['a', 'b', 'c', 'd']

        # If has image, should have image URL
        if question['has_image']:
            assert 'image' in question
            assert len(question['image']) > 0
