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

# Зашлушка, тут должен быть другой utl или список url
URL_TITLE = "https://formats.saby.ru/report/fns"
# Перенапраляет на https://formats.saby.ru/respons
URL_FORMATS = 'https://formats.saby.ru'
# Имя сохраняемого файла 
filename_report = 'report fns.txt'

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

def parse_date_title(url=str):
    """
    Функия ожидает list из URL ввида:
        url = https://formats.saby.ru/report/fns/128513
    Заходит на каждый URL, запоминает дату.
    Возвращает словарь две строки:
        date =  01.07.22
        id_date = 5.01data_title
    """
    # Запрос страницы:
    response = requests.get(url)
    # Проверка статуса запроса
    if not(200 <= response.status_code <= 299):
        print('parse_date_title: ', response.status_code)
        return response.status_code
    # Парсинг в HTML
    soup_fns = BeautifulSoup(response.text, 'html.parser')
    # Поиск в HTML строки ввида: Действующий формат (с 10.01.23) 5.01
    div_element = soup_fns.find('div', class_='controls-Dropdown__text')
    # Извлекаем текст из элемента
    text = div_element.get_text()
    regex = r'.+\D+(\d+\D+\d+\D+\d+).+(\d+\D+\d+)'
    date, id_date = re.search(regex, text).groups()
    return date, id_date


def parse_reports(soup=BeautifulSoup, url=str):
    """
    Ожидается url ввида: 
        https://formats.saby.ru/reports/{title}/{id}
    Достаются все необходимые данные, возвращаются в ввиде словаря:
        {106538: ('fns', 'НД по косвенным налогам', '01.08.23', '5.04')}
    """
    # Содрежит url всех записей 
    list_report_url = []
    dict_data = {}
    # Ищет последний значение в url(пока заглушка) 
    title = URL_TITLE.rstrip('/').split('/')[-1]
    # Цикл в котором добавляем в лист url ввида: 
    # https://formats.saby.ru/report/fns/116682
    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_title = f'{url}{href}'
            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_title(url_title)
            # Добавление всех данных в итоговый словарь
            dict_data.update({id: (title, span.text, date, id_date)})

    return dict_data

def write_report_data(filename, dict_name = dict):
    """
    Сохраняем запись:
    https://formats.saby.ru/report/fns/106013 Действующий формат (с 26.02.24) 5.04
    """
    with open(filename, 'w', encoding='utf-8') as f:
        for key, value in dict_name.items():
            str_k_v = f'{key}: {value}\n'
            f.write(str_k_v)

# Объект HTML
html = parse_html(URL_FORMATS)

# Словарь с нужными данными
dict_result = parse_reports(html, URL_FORMATS)

# Запись данных в текстовый файл
write_report_data(filename_report, dict_result)
