from fastapi import APIRouter, Depends, UploadFile, Form, Query
from sqlalchemy.orm import Session
from sqlalchemy import func, distinct
from src.utils.db import get_db
from src.apps.auth.controller import get_current_user
from src.apps.datasource.controller import upload_csv_file
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from src.utils.db import get_db
from src.apps.auth.controller import get_current_user
from src.apps.datasource.controller import add_external_data_source
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from src.apps.datasource.schemas import ExternalDatasourceCreate, InternalDatasourceCreate
from sqlalchemy.orm import Session
from src.apps.datasource.controller import fetch_datasource_by_branch


router = APIRouter()

@router.post("/upload-csv/")
async def upload_csv(
    file: UploadFile,
    store_id: int = Form(...),  # Accept store_id as a form field
    branch_id: int = Form(...),  # Accept branch_id as a form field
    db: Session = Depends(get_db),
    user=Depends(get_current_user),
):
    """API endpoint for uploading CSV files and processing them."""
    return await upload_csv_file(file, store_id, branch_id, db, user)



@router.post("/add-external-source/", dependencies=[Depends(get_current_user)])
def add_external_source(
    data: ExternalDatasourceCreate,
    db: Session = Depends(get_db),
    user=Depends(get_current_user),
):
    """
    API route to add an external data source (Protected route).
    - Requires user authentication.
    - Accepts `store_id`,`branch_id`, 'Source type', 'URL'
    - Returns a structured API response.
    """
    return add_external_data_source(data, db, user)


###------------BY BRANCH ID-----------

@router.get("/{branch_id}/", dependencies=[Depends(get_current_user)])
def get_datasource(
    branch_id: int, 
    page: int = Query(None, description="Page number (starts from 1)", ge=1),
    page_size: int = Query(None, description="Number of records per page", ge=1, le=100),
    db: Session = Depends(get_db), 
    user=Depends(get_current_user)
):
    """
    API route to fetch datasource records by branch ID (Protected route).
    - Requires authentication.
    - Accepts `branch_id` as an integer.
    - If pagination (`page`, `page_size`) is provided, return paginated results.
    - If pagination is not provided, return all records.
    - Sorting Order: Status (`completed` > `pending` > `failed`), then `created_at` (latest first).
    """
    return fetch_datasource_by_branch(db, branch_id, user.user_id, page, page_size)
