import asyncio
from datetime import date, datetime, timedelta
import io
from fastapi.responses import StreamingResponse
from datetime import date
from openpyxl import Workbook
from typing import Any, Dict
from app.core.auth import get_current_user
from app.core.database import get_db
from app.core.response import send_error, send_response
import app.helpers.dashboard as dashboard_helper
from app.models.fingerspot_user import FingerspotUser
from app.models.presensi_fingerspot import PresensiFingerspot, PresensiFingerspotLog
from app.models.user import User
from fastapi import APIRouter, Request, Depends
from sqlalchemy.orm import Session
import logging
from dateutil.relativedelta import relativedelta

router = APIRouter(prefix="/dashboard", tags=["Report"])


@router.get("/pengajuan")
async def get_pengajuan(
    request: Request,
    db: Session = Depends(get_db),
    user=Depends(get_current_user),
):
    try:
        params = request.query_params or {}
        month = params.get("month")
        yearly = params.get("yearly")
        if not month:
            return send_error("Please fill month")
        if yearly:
            range_dif = {"years": 1, "months": 1}
        else:
            range_dif = {"months": 1}
        end_date = (
            datetime.strptime(month, "%Y-%m")
            + relativedelta(months=1)
            - relativedelta(days=1)
        )
        start_date = (end_date - relativedelta(**range_dif)) - relativedelta(days=1)
        if not (start_date and end_date):
            return send_error("Please fill start_date and end_date")
        report = dashboard_helper.get_dashboard_pengajuan(db, start_date, end_date)
        return send_response(report)
    except Exception as e:
        logging.error("HTTP request failed", exc_info=e)
        return send_error("An error occurred during sync initiation", 500)


@router.get("/presensi")
async def get_presensi(
    request: Request,
    db: Session = Depends(get_db),
    user=Depends(get_current_user),
):
    try:
        params = request.query_params or {}
        month = params.get("month")
        yearly = params.get("yearly")
        if not month:
            return send_error("Please fill month")
        if yearly:
            range_dif = {"years": 1, "months": 1}
        else:
            range_dif = {"months": 1}
        end_date = (
            datetime.strptime(month, "%Y-%m")
            + relativedelta(months=1)
            - relativedelta(days=1)
        )
        start_date = (end_date - relativedelta(**range_dif)) - relativedelta(days=1)
        if not (start_date and end_date):
            return send_error("Please fill start_date and end_date")
        report = dashboard_helper.get_dashboard_presensi(db, start_date, end_date)
        return send_response(report)
    except Exception as e:
        logging.error("HTTP request failed", exc_info=e)
        return send_error("An error occurred during sync initiation", 500)


@router.get("/dana")
async def get_dana(
    request: Request,
    db: Session = Depends(get_db),
    user=Depends(get_current_user),
):
    try:
        params = request.query_params or {}
        month = params.get("month")
        if not month:
            return send_error("Please fill month")
        end_date = (
            datetime.strptime(month, "%Y-%m")
            + relativedelta(months=1)
            - relativedelta(microseconds=1)
        )
        start_date = end_date.replace(day=1) - relativedelta(years=1, months=1)
        if not (start_date and end_date):
            return send_error("Please fill start_date and end_date")
        report = dashboard_helper.get_dashboard_dana(db, start_date, end_date)
        return send_response(report)
    except Exception as e:
        logging.error("HTTP request failed", exc_info=e)
        return send_error("An error occurred during sync initiation", 500)
