import os
from fastapi import APIRouter, UploadFile, File, Form, HTTPException
from pathlib import Path
from database import new_session, User, CSVFile
from repository import CSVFileRepository, UserRepository, H5ModelRepository, ModelStatisticsRepository
import shutil
import pandas as pd
from sqlalchemy import select
from schemas import UserCreate, ModelStatisticsCreate

router = APIRouter()

UPLOAD_FOLDER_CSV = Path("uploads/csv")
UPLOAD_FOLDER_CSV.mkdir(parents=True, exist_ok=True)

UPLOAD_FOLDER_MODELS = "uploads/models"
os.makedirs(UPLOAD_FOLDER_MODELS, exist_ok=True)

# Регистрация пользователя
@router.post("/users/")
async def create_user(user: UserCreate):
    user_id = await UserRepository.create_user(user)
    return {"user_id": user_id}

# Обновлённый метод для загрузки CSV файла
@router.post("/upload/csv/")
async def upload_csv(user_id: int = Form(...), file: UploadFile = File(...)):
    # Получаем данные пользователя
    async with new_session() as session:
        user = await session.get(User, user_id)
        if not user:
            return {"error": "Пользователь не найден"}
        username = user.username

    # Формируем путь для сохранения
    user_folder = UPLOAD_FOLDER_CSV / str(user_id)
    user_folder.mkdir(parents=True, exist_ok=True)
    file_path = user_folder / file.filename

    # Сохраняем файл
    with open(file_path, "wb") as buffer:
        shutil.copyfileobj(file.file, buffer)

    # Сохраняем данные в БД, заменяя обратные слэши на прямые
    normalized_path = str(file_path).replace("\\", "/")
    await CSVFileRepository.upload_file(user_id=user_id, file_path=normalized_path)
    return {"message": "CSV файл загружен", "file_path": normalized_path}


# Загрузка H5 модели
@router.post("/upload/h5/")
async def upload_h5_model(user_id: int = Form(...), file: UploadFile = File(...)):
    file_path = os.path.join(UPLOAD_FOLDER_MODELS, file.filename)
    with open(file_path, "wb") as buffer:
        shutil.copyfileobj(file.file, buffer)

    await H5ModelRepository.add_model(user_id=user_id, model_path=file_path)
    return {"message": "H5 модель загружена", "file_path": file_path}

# Добавление статистики модели
@router.post("/models/statistics/")
async def add_model_statistics(stats: ModelStatisticsCreate):
    await ModelStatisticsRepository.add_statistics(stats)
    return {"message": "Статистика модели сохранена"}


# Получение строк из CSV файла
@router.get("/csv/rows/")
async def get_csv_rows(
    user_id: int,
    file_name: str,
    start_row: int,
    end_row: int
):
    # Проверка существования пользователя
    async with new_session() as session:
        user = await session.get(User, user_id)
        if not user:
            raise HTTPException(status_code=404, detail="Пользователь не найден")

        # Формируем путь к файлу
        user_folder = UPLOAD_FOLDER_CSV / str(user_id)
        file_path = user_folder / file_name

        # Проверка файла в БД, заменяя обратные слэши на прямые
        normalized_file_path = str(file_path).replace("\\", "/")
        result = await session.execute(
            select(CSVFile).where(
                CSVFile.user_id == user_id,
                CSVFile.file_path == normalized_file_path
            )
        )
        csv_file = result.scalars().first()

        if not csv_file or not file_path.exists():
            raise HTTPException(status_code=404, detail=f"Файл '{file_name}' не найден для пользователя '{user_id}'")

    # Читаем файл и извлекаем строки
    try:
        if file_name.endswith(".xlsx"):
            df = pd.read_excel(file_path)
        elif file_name.endswith(".csv"):
            df = pd.read_csv(file_path)
        else:
            raise HTTPException(status_code=400, detail="Неподдерживаемый формат файла")

        rows = df.iloc[start_row:end_row].to_dict(orient="records")
        return {"rows": rows}

    except Exception as e:
        raise HTTPException(status_code=500, detail=f"Ошибка при чтении файла: {str(e)}")