import os
import requests
from datetime import datetime

solr_url_search = "http://localhost:8983/solr/search/select"
current_date = datetime.now().strftime("%d.%m.%Y")
REPO_NAME = "DSpace Filatov"

def get_solr_data(query_params):
    """ Выполняет запрос к Solr и возвращает количество документов. """
    try:
        response = requests.get(solr_url_search, params=query_params)
        response.raise_for_status()
        data = response.json()
        return data['response']['numFound']
    except (requests.RequestException, KeyError) as e:
        print(f"Ошибка при запросе Solr: {e}")
        return 0

def get_first_last_dates():
    """ Получает даты первой и последней загрузки документа. """
    first_doc_params = {'q': 'archived:true', 'sort': 'dc.date.accessioned_dt asc', 'rows': 2}
    last_doc_params = {'q': 'archived:true', 'sort': 'dc.date.accessioned_dt desc', 'rows': 1}

    try:
        first_response = requests.get(solr_url_search, params=first_doc_params).json()
        last_response = requests.get(solr_url_search, params=last_doc_params).json()

        first_doc_date = first_response['response']['docs'][1].get('dc.date.accessioned_dt', 'N/A')
        last_doc_date = last_response['response']['docs'][0].get('dc.date.accessioned_dt', 'N/A')

        return first_doc_date, last_doc_date
    except Exception as e:
        print(f"Ошибка при получении дат: {e}")
        return 'N/A', 'N/A'

def get_field_stats(field):
    """ Возвращает количество документов по указанному полю Solr. """
    query_params = {'q': '*:*', 'facet': 'true', 'facet.field': field, 'rows': 0}
    try:
        response = requests.get(solr_url_search, params=query_params).json()
        return response['facet_counts']['facet_fields'][field]
    except Exception as e:
        print(f"Ошибка при запросе поля {field}: {e}")
        return []

def generate_repository_info():
    """ Генерирует информацию о репозитарии. """
    main_docs_query = {
        'q': 'archived:true',
        'fq': [
            'discoverable:true',
            'withdrawn:false',
            '-entityType:Person'
        ],
        'rows': 0,
        'q.op': 'AND'
    }

    person_docs_query = {
        'q': 'archived:true',
        'fq': [
            'discoverable:true',
            'withdrawn:false',
            'entityType:Person'
        ],
        'rows': 0,
        'q.op': 'AND'
    }

    total_docs = get_solr_data(main_docs_query)
    person_profiles = get_solr_data(person_docs_query)
    first_date, last_date = get_first_last_dates()
    lang_stats = get_field_stats('dc.language.iso')
    type_stats = get_field_stats('dc.type')

    with open('repository_info.html', 'w', encoding='utf-8') as file:
        html = f"""
<!DOCTYPE html>
<html lang="uk">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Інформація про Репозитарій {REPO_NAME}</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>
    <div class="container mt-4">
        <h1>Інформація про Репозитарій {REPO_NAME} на {current_date}</h1>
        <table class="table table-bordered mt-4">
            <tbody>
                <tr>
                    <th>Дата першої загрузки документа</th>
                    <td>{first_date}</td>
                </tr>
                <tr>
                    <th>Дата останньої загрузки документа</th>
                    <td>{last_date}</td>
                </tr>
                <tr>
                    <th>Загальна кількість документів</th>
                    <td>{total_docs}</td>
                </tr>"""
        if person_profiles > 0:
            html += f"""
                <tr>
                    <th>Профілі дослідників (entityType:Person)</th>
                    <td>{person_profiles}</td>
                </tr>"""

        html += """

                <tr>
                    <th>Кількість документів по мові (dc.language.iso)</th>
                    <td>
                        <ul>
        """
        for i in range(0, len(lang_stats), 2):
            lang = lang_stats[i]
            count = lang_stats[i + 1]
            html += f"<li>{lang}: {count}</li>"

        html += """
                        </ul>
                    </td>
                </tr>
                <tr>
                    <th>Кількість документів по типу (dc.type)</th>
                    <td>
                        <ul>
        """
        for i in range(0, len(type_stats), 2):
            doc_type = type_stats[i]
            count = type_stats[i + 1]
            html += f"<li>{doc_type}: {count}</li>"

        html += """
                        </ul>
                    </td>
                </tr>
            </tbody>
        </table>
        <a href="statistics.html" class="btn btn-primary mt-4">Перейти до статистики завантажень</a>
    </div>
</body>
</html>
"""
        file.write(html)

if __name__ == "__main__":
    generate_repository_info()
    print("Сторінка з інформацією про репозитарій успішно створена.")
