from datetime import datetime, timedelta
from enum import Enum

from dagster.preview.freshness import FreshnessPolicy

class Group(Enum):
    RDS = "rds"
    SEGMENT_EVENTS = "segment_events"
    BACKEND_EVENTS = "backend_events"
    DYNAMODB = "dynamodb"
    IDENTITY = "identity"
    SESSIONS = "sessions"
    CLIPS = "clips"
    HOOKS = "hooks"
    PLAYLISTS = "playlists"
    PERSONALIZATION = "personalization"
    RECOMMENDATION = "recommendation"
    RECOMMENDAtIONS = "reccomendations"
    NOTIFICATIONS = "notifications"
    LISTENING = "listening"
    SUBSCRIPTIONS = "subscriptions"
    AGG = "agg"
    USER_METRICS = "user_metrics"

class Team(Enum):
    CORE_POD = "team:core-pod"
    DATA_POD = "team:data-pod"

class QueryType(Enum):
    SELECT = "select"
    DDL = "ddl"


class Role(Enum):
    ACCOUNTADMIN = "ACCOUNTADMIN"

class SnowflakeDB(Enum):
    SUNO_PROD = "SUNO_PROD"

class SnowflakeSchema(Enum):
    PROD = "PROD"


class Warehouse(Enum):
    SMALL = "SUNO_PROD_X_SMAL"  # not a mispelling
    MEDIUM = "SUNO_PROD_MEDIUM"
    LARGE = "SUNO_PROD_LARGE"
    
    # clip related
    SUNO_PROD_RDS_CLIP_HOURLY_UPDATE_MEDIUM = "SUNO_PROD_RDS_CLIP_HOURLY_UPDATE_MEDIUM"

    # agg related
    SUNO_PROD_AGG_HOURLY_LARGE = "SUNO_PROD_AGG_HOURLY_LARGE"

    # ml related
    SUNO_PROD_ML_HOURLY_LARGE = "SUNO_PROD_ML_HOURLY_LARGE"

    # rds related
    SUNO_PROD_RDS_HOURLY_X_SMALL = "SUNO_PROD_RDS_HOURLY_X_SMALL"
    SUNO_PROD_RDS_HOURLY_MEDUIM = "SUNO_PROD_RDS_HOURLY_MEDUIM"
    
    # fact related
    FACT_PLAY_LARGE = "FACT_PLAY_HOURLY_LARGE"
    FACT_PLAY_SMALL = "FACT_PLAY_HOURLY_SMALL"
    FACT_PLAY_BACKFILL_LARGE = "FACT_PLAY_BACKFILL_LARGE"
    FACT_PLAY_BACKFILL_SMALL = "FACT_PLAY_BACKFILL_SMALL"

    # ML related
    SUNO_PROD_USER_TOP_SCORE_SONGS = "SUNO_PROD_USER_TOP_SCORE_SONGS"

    # dynamodb related
    DYNAMODB_EVENTS_LARGE = "DYNAMODB_EVENTS_LARGE"
    DYNAMODB_EVENTS_SMALL = "DYNAMODB_EVENTS_SMALL"

    # frontend related
    WEB_EVENT_X_SMALL = "SUNO_PROD_WEB_HOURLY_X_SMALL"
    WEB_EVENT_SMALL = "WEB_EVENT_HOURLY_SMALL"

    # backend related
    BACKEND_EVENTS_X_SMALL = "BACKEND_EVENTS_HOURLY_X_SMALL"

    # hook related
    FACT_HOOK_PLAY_LARGE = "FACT_HOOK_PLAY_LARGE"
    FACT_HOOK_PLAY_SMALL = "FACT_HOOK_PLAY_SMALL"
    DIM_HOOK_LARGE = "DIM_HOOK_HOURLY_LARGE"
    DIM_HOOK_MEDIUM = "DIM_HOOK_HOURLY_MEDIUM"
    HOOK_SESSION_LARGE = "HOOK_SESSION_LARGE"
    HOOK_SESSION_X_SMALL = "HOOK_SESSION_X_SMALL"
    REC_HOOK_X_SMALL = "REC_HOOK_X_SMALL"


class PartitionExpr(Enum):
    DAILY = "p_date"
    HOURLY = "p_date || '-' || p_hour || ':00'"


# Time window freshness policies check whether the asset has been materialized in the last N hours.
# Cron freshness policies check whether an asset has been materialized on an expected schedule with a buffer for runtime.
TIME_WINDOW_FRESHNESS_POLICY_WARN_1H_FAIL_2H = FreshnessPolicy.time_window(fail_window=timedelta(hours=2), warn_window=timedelta(hours=1))
TIME_WINDOW_FRESHNESS_POLICY_WARN_24H_FAIL_25H = FreshnessPolicy.time_window(fail_window=timedelta(hours=25), warn_window=timedelta(hours=24))


MIN_TIMESTAMP = datetime.min
