import requests
from bs4 import BeautifulSoup
from pprint import pprint
import re


def parse_html(url=str):
    """
    Фунция принимает строку URL,
    выполняет запрос,
    создает и возращает объект BeautifulSoup(HTML).
    """
    # Запрос страницы
    response = requests.get(url)
    # Проверка статуса страницы
    if not(200 <= response.status_code <= 299):
        print("Ошибка при запросе:", response.status_code)
        return response.status_code
    # Создание обьекта BeautifulSoup
    soup = BeautifulSoup(response.text, 'html.parser')
    return soup

def parse_date_report(url=str):
    """
    Функия ожидает list из URL ввида:
        url = https://formats.saby.ru/report/fns/128513
    Заходит по URL, запоминает дату.
    Возвращает две строки ввида:
        'date =  01.07.22'
        'id_date = 5.01' 
    """
    soup = parse_html(url)
    # Поиск в HTML строки ввида: 'Действующий формат (с 10.01.23) 5.01'
    div_element = soup.find('div', class_='controls-Dropdown__text')
    # Извлекаем текст из элемента
    text = div_element.get_text()
    print(text, ' ',url)
    #Парсим нужные данные
    date = '' 
    id_date = ''
    if ('_') in text:
        regex = r'\w+\s\w+\s(\S+) (\S+)'
        date, id_date = re.search(regex, text).groups()
    else:
        regex = r'(\d{2}\D\d{2}\D\d{2})(?:(?:.+)?\))? #?(\d+(?:\D\d+)?)'
        date, id_date = re.search(regex, text).groups()
    print('date: ', date, 'id: ', id_date)
    return date, id_date

def parse_reports(soup=BeautifulSoup, 
                  report_title = str, 
                  url_formats = str, 
                  name_title = str):
    """       
    Достаются все необходимые данные, возвращаются в ввиде словаря:
        {106538: ('fns', 'НД по косвенным налогам', '01.08.23', '5.04')}
    """
    # Содрежит url всех report(не используется)
    #list_report_url = []
    result_dict_data = {}
    # Перебарает все URL, ищутся по тегу 'a'
    for link in soup.find_all('a'):
        # Ищет по тегу: href 
        href = link.get('href')
        if f'{report_title}/' in href:
            # id записи
            id = href.rstrip('/').split('/')[-1]
            #URL записи 
            url_report = f'{url_formats}{href}'
            #Добавление url в лист(не используется)
            #list_report_url.append(url_title)
            link = soup.find('a', href=href)
            # Имя записи
            span = link.find('span', class_="ProxySbisRu__registry-BrowserItem_typeName")
            # Передаем текущию запись цикла
            date, id_date = parse_date_report(url_report)
            # Добавление всех данных в итоговый словарь            
            result_dict_data.update({id: (name_title, span.text, date, id_date)})

    return result_dict_data

def write_report_data(filename, dict_name = dict, name_title = str):
    """
    Сохраняем запись, каждая запись с новой строки:
    'ключ: значение'
    'ключ: значение'
    """
    dash = '-'*30
    with open(filename, 'a', encoding='utf-8') as f:
        f.write(f'\n{dash}START_{name_title}{dash}\n')
        for key, value in dict_name.items():
            str_k_v = f'{key}: {value}\n'
            f.write(str_k_v)
        f.write(f'{dash}END_{name_title}{dash}\n')

def serth_title():
    """
    Функция ищет все тайтлы,
    возвращает лист сотоящий из:
        ['/report/fns', ...]
    """
    url_format_report = 'https://formats.saby.ru/report'
    html = parse_html(url_format_report)
    list_reports = []
    # Перебераем все URL
    for link in html.find_all('a'):
        # Ищет по тегу: href 
        href = link.get('href')
        if re.search(r'\/report\/(\w+)$', href):
                print('Cовпадение найдено: ', href)
                list_reports.append(href)
    return list_reports

# Имя файла в который будет записан результат кода
filename_save = 'ReportData.txt'
#Удаляем старые записи, что бы довабить новые 
with open(filename_save, 'w') as f:
    #Файл перезаписывается в пустой
    f.write('')
# Лист имеет вид: ['/report/fns', '/report/sfr'...]
list_title = serth_title()

URL_FORMATS = 'https://formats.saby.ru'

for report_title in list_title:
    name_title = report_title.rstrip('/').split('/')[-1]
    
    url_title = f'{URL_FORMATS}{report_title}'
    # Объект HTML
    soup = parse_html(url_title)
    # Словарь с нужными данными
    dict_result = parse_reports(soup, report_title, URL_FORMATS, name_title)
    # Запись данных в текстовый файл
    write_report_data(filename_save, dict_result, name_title)




