import os
import sys

sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

from app import app, pages, team_settings, users


def test_home_page_renders():
    client = app.test_client()
    response = client.get('/')
    assert response.status_code == 200


def test_team_page_renders():
    client = app.test_client()
    response = client.get('/team')
    assert response.status_code == 200


def test_background_image_is_rendered_when_configured():
    client = app.test_client()
    original = team_settings.get('background_image', '')
    try:
        from app import site_settings
        site_settings['background_image'] = 'demo-background.png'
        response = client.get('/')
        assert response.status_code == 200
        assert b'site-background' in response.data
        assert b'/static/uploads/demo-background.png' in response.data
    finally:
        site_settings['background_image'] = original


def test_admin_page_requires_login():
    client = app.test_client()
    response = client.get('/admin', follow_redirects=False)
    assert response.status_code == 302
    assert response.headers['Location'].endswith('/login')


def test_nested_admin_routes_require_login():
    client = app.test_client()
    response = client.get('/admin/pages', follow_redirects=False)
    assert response.status_code == 302
    assert response.headers['Location'].endswith('/login')


def test_admin_login_allows_access():
    client = app.test_client()
    response = client.post('/login', data={
        'username': '2rareadmin',
        'password': '2rare2026'
    }, follow_redirects=True)
    assert response.status_code == 200
    assert b'Admin dashboard' in response.data


def test_user_accounts_can_be_created_and_deleted_via_admin():
    client = app.test_client()
    client.post('/login', data={
        'username': '2rareadmin',
        'password': '2rare2026'
    }, follow_redirects=True)

    create_response = client.post('/admin/create-user', data={
        'username': 'testuser',
        'password': 'secret123'
    }, follow_redirects=True)
    assert create_response.status_code == 200
    assert any(user['username'] == 'testuser' for user in users)

    delete_response = client.post('/admin/delete-user/testuser', follow_redirects=True)
    assert delete_response.status_code == 200
    assert not any(user['username'] == 'testuser' for user in users)


def test_team_settings_can_be_updated_via_admin():
    client = app.test_client()
    client.post('/login', data={
        'username': '2rareadmin',
        'password': '2rare2026'
    }, follow_redirects=True)
    response = client.post('/admin/update-team', data={
        'team_title': '2rare Team',
        'team_intro': 'Updated team intro.',
        'stat_label_1': 'Wins',
        'stat_value_1': '33',
        'stat_label_2': 'Losses',
        'stat_value_2': '6',
        'stat_label_3': 'Events',
        'stat_value_3': '12',
        'stat_label_4': 'Followers',
        'stat_value_4': '60K',
        'social_name_1': 'Discord',
        'social_url_1': 'https://discord.gg/example',
        'social_label_1': 'Join the squad',
        'social_name_2': 'TikTok',
        'social_url_2': 'https://tiktok.com/@2rare',
        'social_label_2': 'Watch highlights',
        'social_name_3': 'YouTube',
        'social_url_3': 'https://youtube.com/@2rare',
        'social_label_3': 'Watch recaps'
    }, follow_redirects=True)
    assert response.status_code == 200
    assert b'updated successfully' in response.data


def test_add_page_via_admin():
    client = app.test_client()
    client.post('/login', data={
        'username': '2rareadmin',
        'password': '2rare2026'
    }, follow_redirects=True)
    initial_count = len(pages)
    response = client.post('/admin/add-page', data={
        'title': 'Roster',
        'slug': 'roster',
        'content': 'Meet the 2rare roster.'
    }, follow_redirects=True)
    assert response.status_code == 200
    assert len(pages) == initial_count
    assert any(page['slug'] == 'roster' for page in pages)


def test_roster_members_can_be_updated_via_admin():
    client = app.test_client()
    client.post('/login', data={
        'username': '2rareadmin',
        'password': '2rare2026'
    }, follow_redirects=True)
    response = client.post('/admin/update-team', data={
        'team_title': '2rare Team',
        'team_intro': 'Updated team intro.',
        'stat_label_1': 'Wins',
        'stat_value_1': '33',
        'social_name_1': 'Discord',
        'social_url_1': 'https://discord.gg/example',
        'social_label_1': 'Join the squad',
        'roster_name_1': 'Aiden',
        'roster_role_1': 'Captain',
        'roster_name_2': 'Mina',
        'roster_role_2': 'Support'
    }, follow_redirects=True)
    assert response.status_code == 200
    assert any(member['name'] == 'Aiden' for member in team_settings.get('roster', []))

    team_response = client.get('/team')
    assert response.status_code == 200
    assert b'Aiden' in team_response.data
    assert b'Captain' in team_response.data


def test_selected_items_can_be_removed_via_admin():
    client = app.test_client()
    client.post('/login', data={
        'username': '2rareadmin',
        'password': '2rare2026'
    }, follow_redirects=True)

    response = client.post('/admin/update-team', data={
        'team_title': '2rare Team',
        'team_intro': 'Updated intro.',
        'stat_label_1': 'Wins',
        'stat_value_1': '33',
        'stat_label_2': 'Losses',
        'stat_value_2': '6',
        'remove_stat_2': '1',
        'social_name_1': 'Discord',
        'social_url_1': 'https://discord.gg/example',
        'social_label_1': 'Join the squad',
        'social_name_2': 'TikTok',
        'social_url_2': 'https://tiktok.com/@2rare',
        'social_label_2': 'Watch highlights',
        'remove_social_2': '1',
        'post_title_1': 'New clip',
        'post_url_1': 'https://example.com/clip',
        'post_platform_1': 'TikTok',
        'post_title_2': 'Match recap',
        'post_url_2': 'https://example.com/recap',
        'post_platform_2': 'YouTube',
        'remove_post_2': '1',
        'roster_name_1': 'Aiden',
        'roster_role_1': 'Captain',
        'roster_link_1': 'https://example.com/aiden',
        'roster_name_2': 'Mina',
        'roster_role_2': 'Support',
        'roster_link_2': 'https://example.com/mina',
        'remove_roster_2': '1',
    }, follow_redirects=True)

    assert response.status_code == 200
    assert [stat['label'] for stat in team_settings['stats']] == ['Wins']
    assert [social['name'] for social in team_settings['socials']] == ['Discord']
    assert [post['title'] for post in team_settings['posts']] == ['New clip']
    assert [member['name'] for member in team_settings['roster']] == ['Aiden']


def test_match_style_stats_can_be_saved_via_admin():
    client = app.test_client()
    client.post('/login', data={
        'username': '2rareadmin',
        'password': '2rare2026'
    }, follow_redirects=True)

    response = client.post('/admin/update-team', data={
        'team_title': '2rare Team',
        'team_intro': 'Updated intro.',
        'stat_label_1': 'Quarterfinals',
        'stat_opponent_1': 'Nexus',
        'stat_score_1': '3 - 1',
        'stat_result_1': 'Win',
        'stat_date_1': 'Jun 14',
        'stat_details_1': 'Grand Finals qualifier',
    }, follow_redirects=True)

    assert response.status_code == 200
    assert team_settings['stats'][0]['opponent'] == 'Nexus'
    assert team_settings['stats'][0]['score'] == '3 - 1'
    assert team_settings['stats'][0]['result'] == 'Win'
