from datetime import datetime, timedelta
from sqlalchemy.orm import Session
from app.crud import dashboard_ftth as dashboard_crud

class DashboardService:
    @staticmethod
    def get_dashboard_ftth_data(db2: Session, db3: Session, username: str) -> dict:
        dashboard = dashboard_crud.get_dashboard(db2, username)
        user = dashboard_crud.get_user_info(db3, username)
        tracking_status = dashboard_crud.get_tracking_status(db3, username)
        tracking_status_bool = tracking_status.tracking_status if tracking_status else False

        if dashboard is None:
            return {
                "KODE_SALES": "-",
                "KODE": "-",
                "HOR": "-",
                "TL": "-",
                "SM": "-",
                "BRAND": user.brand if user else None,
                "NAMA_SALES": "-",
                "tracking_status": tracking_status_bool,
            }

        dashboard_data = dashboard.__dict__.copy()
        dashboard_data.pop("_sa_instance_state", None)
        dashboard_data["tracking_status"] = tracking_status_bool

        if user:
            dashboard_data["BRAND"] = user.brand

        return dashboard_data

    @staticmethod
    def create_tracking_record(db3: Session, tracking_data: dict, username: str):
        lastTrack = dashboard_crud.get_tracking(db3, username)

        if tracking_data.get("status") == "dashboard" and lastTrack:
            if isinstance(lastTrack.timestamp, str):
                lastTrack.timestamp = datetime.strptime(lastTrack.timestamp, "%Y-%m-%d %H:%M:%S.%f")

            if (datetime.now() - lastTrack.timestamp) < timedelta(seconds=10):
                raise ValueError("Tracking sudah dilakukan dalam 10 detik terakhir")

        dashboard_crud.create_tracking(db3, tracking_data, username)

    @staticmethod
    def get_sliders_list(db3: Session) -> list[dict]:
        sliders_list = dashboard_crud.get_sliders(db3)
        return [
            {key: value for key, value in slider.__dict__.items() if key != "_sa_instance_state"}
            for slider in sliders_list
        ]

    @staticmethod
    def get_performance_data(db3: Session, username: str) -> dict:
        performance = dashboard_crud.get_performance(db3, username)
        if performance is None:
            raise ValueError("Performance data not found")

        perf_data = {
            key: value
            for key, value in performance.__dict__.items()
            if key != "_sa_instance_state"
        }
        return perf_data
