
    j                         d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z   G d de      Z!y)a  
Dashboard views for Aimantis hotel management platform.

Provides optimized, cached dashboard API with:
- Structure-based filtering
- Multi-tenant isolation
- Service-layer architecture
- Django cache integration
- Serializer-driven responses
- drf-spectacular compatibility
    status)IsAuthenticated)Response)APIView)cache)	Structure)DASHBOARD_CACHE_TIMEOUTDASHBOARD_CACHE_KEY_PREFIXDEFAULT_UPCOMING_EVENTS_LIMIT)HasStructureAccess)DashboardResponseSerializer)ChartsService)OccupancyService)OverviewService)PricingService)UpcomingEventsService)	get_todayc                   ^    e Zd ZdZeegZddedefdZ	defdZ
dedefd	Zddedefd
Zd Zy)DashboardWidgetsViewa3  
    Dashboard widgets API endpoint.
    
    Returns comprehensive dashboard data including:
    - Overview metrics (check-ins, check-outs, occupancy)
    - Occupancy forecasts (today, 7 days, 30 days)
    - Average nightly rates
    - Upcoming events (chronological)
    - Monthly occupancy charts
    
    Supports structure filtering via query parameter.
    Response is cached for performance.
    
    Query Parameters:
        structure (int): Structure ID to filter by (optional)
        events_limit (int): Max upcoming events to return (default: 5)
    Nstructure_idreturnc                 Z    t               j                         }|xs d}t         d| d| S )z
        Generate cache key for the dashboard data.
        
        Args:
            structure_id: Optional structure ID
            
        Returns:
            Cache key string
        all:)r   	isoformatr   )selfr   todaystructure_parts       /backend/dashboard/views.py_get_cache_keyz#DashboardWidgetsView._get_cache_key9   s7     %%'%.,-Q~.>awGG    	cache_keyc                 ,    t        j                  |      S )z
        Attempt to retrieve cached dashboard response.
        
        Args:
            cache_key: Cache key to look up
            
        Returns:
            Cached data or None
        )r   get)r   r#   s     r    _get_cached_responsez)DashboardWidgetsView._get_cached_responseG   s     yy##r"   datac                 <    t        j                  ||t               y)z
        Cache the dashboard response.
        
        Args:
            cache_key: Cache key
            data: Data to cache
        )timeoutN)r   setr
   )r   r#   r'   s      r    _cache_responsez$DashboardWidgetsView._cache_responseS   s     			)T+BCr"   c                     |rIt         j                  j                  |      j                         }|r|j                  |j
                  dS dddS )z
        Get structure information for the response.
        
        Args:
            structure_id: Optional structure ID
            
        Returns:
            Dict with structure id and name
        )id)r-   nameNzAll Structures)r	   objectsfilterfirstr-   r.   )r   r   	structures      r    _get_structure_infoz(DashboardWidgetsView._get_structure_info]   sM     !))00L0AGGII'llINNCC $455r"   c                 F   |j                   j                  d      }|j                   j                  d      }|rt        |      nd}|rt        |      nt        }| j	                  |      }| j                  |      }|rt        |t        j                        S t               }t        |      }t        |      }t        |      }	t        ||      }
t        |      }|j                         | j!                  |      |j#                         |j%                         |	j'                         |
j)                         |j+                         d}t-        |      }|j/                  d	
       |j0                  }| j3                  ||       t        |t        j                        S )zx
        GET /api/dashboard/widgets
        
        Retrieve dashboard data with optional structure filtering.
        r2   events_limitNr   )r   )r   limit)dater2   overview	occupancyaverage_ratesupcoming_eventscharts)r'   T)raise_exception)query_paramsr%   intr   r!   r&   r   r   HTTP_200_OKr   r   r   r   r   r   r   r3   get_overviewget_occupancyget_average_rates
get_eventsget_charts_datar   is_validr'   r+   )r   requestr   r5   r#   cached_datar   overview_serviceoccupancy_servicepricing_serviceevents_servicecharts_serviceresponse_data
serializerserialized_datas                  r    r%   zDashboardWidgetsView.geto   sv    ++//<++//? -9s<(d,8s<(>[ ''5	//	:K0B0BCC  +E,,G(lC.%
 'LA OO%11,?(557*88:,>>@-88:$446
 1mD
D1$// 	Y80B0BCCr"   )N)__name__
__module____qualname____doc__r   r   permission_classesr?   strr!   r&   dictr+   r3   r%    r"   r    r   r   $   sf    $ *+=>H3 H# H
$c 
$D DD D6 6t 6$6Dr"   r   N)"rT   rest_frameworkr   rest_framework.permissionsr   rest_framework.responser   rest_framework.viewsr   django.core.cacher   structures.modelsr	   dashboard.constantsr
   r   r   dashboard.permissionsr   dashboard.serializersr   !dashboard.services.charts_servicer   $dashboard.services.occupancy_servicer   #dashboard.services.overview_servicer   "dashboard.services.pricing_servicer   *dashboard.services.upcoming_events_servicer   dashboard.services.utilsr   r   rX   r"   r    <module>rh      sR   
 " 6 , ( # ' 
 5 = ; A ? = L .AD7 ADr"   