import os
from loguru import logger
import pandas as pd
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
import configparser
import socket
import time
import json

def check_internet():
    """Проверяет наличие интернет-соединения."""
    try:
        socket.create_connection(("www.google.com", 80), timeout=5)
        return True
    except OSError:
        logger.error("Соединение с интернетом отсутствует")
        return False

def get_headers(config):
    """Читает токен из конфигурационного файла и возвращает заголовки для запросов."""
    try:
        token = config['default']['YOUR_TOKEN']
        if not token:
            raise ValueError("Токен отсутствует в файле конфигурации")
        headers = {'Authorization': f'Token {token}'}
        return headers
    except KeyError as e:
        logger.error(f"Ошибка конфигурации при получении токена: {e}")
        raise

def read_config():
    """Читает конфигурационный файл и возвращает объект configparser."""
    config_file = 'config.ini'
    if not os.path.exists(config_file):
        logger.error(f"Файл конфигурации {config_file} не найден")
        raise FileNotFoundError(f"{config_file} не найден")

    config = configparser.ConfigParser()
    config.read(config_file)
    
    logger.debug(f"Содержимое config: {dict(config)}")  # Добавлено для отладки
    
    if 'default' not in config:
        logger.error("Секция 'default' отсутствует в файле конфигурации")
        raise KeyError("Секция 'default' отсутствует в файле конфигурации")
    
    try:
        api_url = config['default']['API_URL']
        token = config['default']['YOUR_TOKEN']
        if not api_url or not token:
            raise ValueError("API_URL или YOUR_TOKEN не указаны в файле конфигурации")
        return config
    except KeyError as e:
        logger.error(f"Ошибка конфигурации при чтении параметров: {e}")
        raise

def get_data_from_excel(file_path):
    """Читает данные из Excel-файла и возвращает их в виде списка списков."""
    try:
        if not os.path.exists(file_path):
            raise FileNotFoundError(f"Файл {file_path} не найден")
        
        _, file_extension = os.path.splitext(file_path)
        
        if file_extension.lower() == '.xls':
            df = pd.read_excel(file_path, engine='xlrd')
        elif file_extension.lower() == '.xlsx':
            df = pd.read_excel(file_path, engine='openpyxl')
        else:
            raise ValueError(f"Неподдерживаемый формат файла: {file_extension}")
        
        if df.empty:
            raise ValueError("Файл Excel пуст")
        
        logger.debug(f"Прочитано {len(df)} строк из Excel файла")
        return df.values.tolist()
    except Exception as e:
        logger.error(f"Ошибка при чтении Excel файла: {e}")
        raise

def post_data(session, url, headers, inn):
    """Отправляет POST-запрос с данными INN."""
    data = {"inn": inn}
    try:
        response = session.post(url, headers=headers, json=data, timeout=10)
        response.raise_for_status()
        logger.info(f"Данные для INN {inn} успешно отправлены. Код ответа: {response.status_code}, "
                    f"Содержимое ответа: {response.text}") 
        return response
    except requests.exceptions.RequestException as err:
        logger.error(f"Ошибка при отправке данных INN {inn}: {err}")
        if 'response' in locals():
            logger.error(f"Код ответа: {response.status_code}, Содержимое ответа: {response.text}")
        return None

def process_data(data, session, url, headers):
    """Обрабатывает данные из Excel и отправляет их на сервер."""
    successful_count = 0
    failed_count = 0
    
    for row in data:
        try:
            inn = row[0] 
            if not isinstance(inn, (int, str)) or (isinstance(inn, str) and not inn.isdigit()):
                logger.warning(f"Некорректное значение INN в строке: {row}")
                failed_count += 1
                continue

            response = post_data(session, url, headers, inn)
            if response is not None:
                successful_count += 1
            else:
                failed_count += 1
                time.sleep(1)
        except Exception as e:
            logger.error(f"Ошибка обработки строки данных {row}: {e}")
            failed_count += 1
            time.sleep(1)
            
    return successful_count, failed_count

if __name__ == "__main__":
    logger.add("logs.log", rotation="500 MB", level="DEBUG")  # Изменен уровень логирования на DEBUG
    logger.info("Скрипт запущен")
    
    try:
        config = read_config()
        API_URL = config['default']['API_URL']
        EXCEL_FILE = os.path.join(os.path.dirname(__file__), 'data.xlsx')
        logger.debug(f"API_URL: {API_URL}, EXCEL_FILE: {EXCEL_FILE}")
        
        if not os.path.exists(EXCEL_FILE):
            logger.error(f"Файл Excel {EXCEL_FILE} не найден")
            exit(1)
        logger.debug(f"Файл Excel найден: {EXCEL_FILE}")
        
    except Exception as e:
        logger.error(f"Ошибка инициализации: {e}")
        exit(1)
    
    if not check_internet():
        logger.error("Скрипт завершен из-за отсутствия соединения с интернетом")
        exit(1)

    try:
        data = get_data_from_excel(EXCEL_FILE)
        logger.debug(f"Прочитано {len(data)} строк из Excel файла")
    except Exception as e:
        logger.error(f"Ошибка при загрузке данных из файла Excel: {e}")
        exit(1)

    session = requests.Session()
    retries = Retry(total=5, backoff_factor=0.5, status_forcelist=[500, 502, 503, 504]) 
    session.mount('https://', HTTPAdapter(max_retries=retries))

    try:
        headers = get_headers(config)
        successful_count, failed_count = process_data(data, session, API_URL, headers)
        logger.info(f"Отправка завершена: {successful_count} успешных, {failed_count} неудачных")
    except Exception as e:
        logger.error(f"Ошибка при обработке данных: {e}")
        exit(1)python3 start.py 
2024-09-20 17:12:34.245 | INFO     | __main__:<module>:126 - Скрипт запущен
2024-09-20 17:12:34.245 | DEBUG    | __main__:read_config:43 - Содержимое config: {'DEFAULT': <Section: DEFAULT>, 'default': <Section: default>}
2024-09-20 17:12:34.246 | DEBUG    | __main__:<module>:132 - API_URL: https://jetlend.ru/partner/api, EXCEL_FILE: data.xlsx
2024-09-20 17:12:34.246 | DEBUG    | __main__:<module>:137 - Файл Excel найден: data.xlsx
2024-09-20 17:12:34.444 | DEBUG    | __main__:get_data_from_excel:77 - Прочитано 15 строк из Excel файла
2024-09-20 17:12:34.444 | DEBUG    | __main__:<module>:149 - Прочитано 15 строк из Excel файла
2024-09-20 17:12:34.749 | ERROR    | __main__:post_data:93 - Ошибка при отправке данных INN 7203386151: 404 Client Error: Not Found for url: https://jetlend.ru/partner/api
2024-09-20 17:12:34.749 | ERROR    | __main__:post_data:95 - Код ответа: 404, Содержимое ответа: 
<!doctype html>
<html lang="en">
<head>
  <title>Not Found</title>
</head>
<body>
  <h1>Not Found</h1><p>The requested resource was not found on this server.</p>
</body>
</html>

2024-09-20 17:12:35.861 | ERROR    | __main__:post_data:93 - Ошибка при отправке данных INN 7203517534: 404 Client Error: Not Found for url: https://jetlend.ru/partner/api
2024-09-20 17:12:35.863 | ERROR    | __main__:post_data:95 - Код ответа: 404, Содержимое ответа: 
<!doctype html>
<html lang="en">
<head>
  <title>Not Found</title>
</head>
<body>
  <h1>Not Found</h1><p>The requested resource was not found on this server.</p>
</body>
</html>

2024-09-20 17:12:36.982 | ERROR    | __main__:post_data:93 - Ошибка при отправке данных INN 5043080673: 404 Client Error: Not Found for url: https://jetlend.ru/partner/api
2024-09-20 17:12:36.983 | ERROR    | __main__:post_data:95 - Код ответа: 404, Содержимое ответа: 
<!doctype html>