
    .i&                     H    d Z ddlmZ ddlmZmZmZmZmZm	Z	  G d d      Z
y)zh
Servicios para consultar datos deportivos desde tikistats_internal
filtrados por permisos del usuario.
    )Q   )TeamTeamDivisionMatchPlayerCompetitionDivisionc                   `    e Zd ZdZd Zd Zd ZddZd ZddZ	d	 Z
dd
Zd Zd ZddZd Zy)SportsDataServicea  
    Servicio para obtener datos deportivos respetando permisos del usuario.
    
    Uso:
    ----
    from clients.permissions import PermissionChecker
    from router_sports.services import SportsDataService
    
    checker = PermissionChecker(request.user)
    service = SportsDataService(checker)
    
    teams = service.get_accessible_teams()
    matches = service.get_accessible_matches()
    c                     || _         y)zb
        Args:
            permission_checker: Instancia de PermissionChecker del usuario
        N)checker)selfpermission_checkers     @/var/www/app.tikistats.com/public_html/router_sports/services.py__init__zSportsDataService.__init__   s    
 *    c                 P   | j                   j                         }|-t        j                  j	                  d      j                         S |r/t        j                  j	                  d      j                  |      S t        j                  j	                  d      j                         S )z
        Retorna QuerySet de equipos que el usuario puede ver.
        
        Returns:
            QuerySet[Team]: Equipos permitidos
        tikistats_internalid__in)r   get_allowed_teamsr   objectsusingallfilternone)r   allowed_team_idss     r   get_accessible_teamsz&SportsDataService.get_accessible_teams%   s      <<99;#<<%%&:;??AA<<%%&:;BBJZB[[ <<%%&:;@@BBr   c                     | j                   j                  |      sy	 t        j                  j	                  d      j                  |      S # t        j                  $ r Y yw xY w)u   
        Obtiene un equipo específico si el usuario tiene permiso.
        
        Args:
            team_id: ID del equipo
        
        Returns:
            Team o None si no tiene permiso
        Nr   id)r   can_view_teamr   r   r   getDoesNotExist)r   team_ids     r   get_teamzSportsDataService.get_team8   sZ     ||))'2	<<%%&:;??7?KK   		s   .A A#"A#Nc                 l   | j                   j                         }t        j                  j	                  d      j                  dddd      j                  d      }|r|j                  |      }|n;|r)|j                  t        |	      t        |
      z        }n|j                         }|r|d| }|S )u  
        Retorna QuerySet de partidos que el usuario puede ver.
        
        Args:
            limit: Número máximo de partidos a retornar
            division_id: Filtrar por división específica
        
        Returns:
            QuerySet[Match]: Partidos permitidos
        r   home_team_division__teamaway_team_division__teamhome_team_division__divisioncompetition-date)home_team_division__division_idN)home_team_division__team_id__in)away_team_division__team_id__in)
r   r   r   r   r   select_relatedorder_byr   r   r   )r   limitdivision_idr   matchess        r   get_accessible_matchesz(SportsDataService.get_accessible_matchesN   s      <<99; --%%&:;JJ&&*	

 (7
 	 nn0; % G
 #nn2BC2BCDG llnG fuoGr   c                     | j                   j                  |      sy	 t        j                  j	                  d      j                  ddd      j                  |      S # t        j                  $ r Y yw xY w)u   
        Obtiene un partido específico si el usuario tiene permiso.
        
        Args:
            match_id: ID del partido
        
        Returns:
            Match o None si no tiene permiso
        Nr   r)   r*   r,   r!   )r   can_view_matchr   r   r   r1   r$   r%   )r   match_ids     r   	get_matchzSportsDataService.get_match}   sr     ||**84	==&&';<KK** cXc	
 !! 		s   ?A A43A4c                 b   | j                   j                  |      s-t        j                  j	                  d      j                         S t        j                  j	                  d      j                  t        |      t        |      z        j                  ddd      j                  d      d| S )	u  
        Obtiene partidos de un equipo específico.
        
        Args:
            team_id: ID del equipo
            limit: Número máximo de partidos
        
        Returns:
            QuerySet[Match]: Partidos del equipo (si tiene permiso)
        r   home_team_division__team_idaway_team_division__team_idr)   r*   r,   r-   N)
r   r#   r   r   r   r   r   r   r1   r2   )r   r&   r3   s      r   get_matches_by_teamz%SportsDataService.get_matches_by_team   s     ||))'2==&&';<AACC}}""#78??'2'23
 .&&
 (7
FU$ 	$r   c                 P   | j                   j                         }|-t        j                  j	                  d      j                         S |r/t        j                  j	                  d      j                  |      S t        j                  j	                  d      j                         S )z
        Retorna QuerySet de jugadores que el usuario puede ver.
        
        Returns:
            QuerySet[Player]: Jugadores permitidos
        r   r   )r   get_allowed_playersr   r   r   r   r   r   )r   allowed_player_idss     r   get_accessible_playersz(SportsDataService.get_accessible_players   s     "\\==?%>>''(<=AACC>>''(<=DDL^D__ >>''(<=BBDDr   c                    | j                   j                  |      s-t        j                  j	                  d      j                         S t        j                  j	                  d      j                  |d      }|r|j                  |      }|j                  dd      }t        j                  j	                  d      j                  |      j                  d	d
      S )u  
        Obtiene jugadores de un equipo (con o sin división específica).
        
        Args:
            team_id: ID del equipo
            division_id: ID de la división (opcional)
        
        Returns:
            QuerySet[Player]: Jugadores del equipo
        r   active)team_division__team_idstate)team_division__division_id	player_idT)flatr   positionnationality)
r   r#   r   r   r   r   TeamDivisionPlayerr   values_listr1   )r   r&   r4   team_division_players
player_idss        r   get_players_by_teamz%SportsDataService.get_players_by_team   s     ||))'2>>''(<=BBDD !3 : : @ @AU V ] ]#* !^ !

 $9$@$@+6 %A %! +66{6N
~~##$89@@ A 

.]
3	4r   c                 \    t         j                  j                  d      j                         S )z(Retorna todas las divisiones disponiblesr   )r
   r   r   r   )r   s    r   get_divisionszSportsDataService.get_divisions   s#    %%&:;??AAr   c                     	 t         j                  j                  d      j                  |      S # t         j                  $ r Y yw xY w)u   
        Obtiene una división específica.
        
        Args:
            division_id: ID de la división
        
        Returns:
            Division o None
        r   r!   N)r
   r   r   r$   r%   )r   r4   s     r   get_divisionzSportsDataService.get_division   sE    	##))*>?CC{CSS$$ 		s   .1 AAc                     t         j                  j                  d      j                  dd      j	                  d      }|r|j                  |      }|S )u   
        Retorna competiciones (opcionalmente filtradas por división).
        
        Args:
            division_id: ID de la división (opcional)
        
        Returns:
            QuerySet[Competition]
        r   divisionregionz-start_date)r4   )r	   r   r   r1   r2   r   )r   r4   competitionss      r   get_competitionsz"SportsDataService.get_competitions   sV     #**001EFUU

(=
! 	 '..;.GLr   c                    | j                   j                  |d      sy| j                  |d      }|j                         }|j	                  |      j                         }|j	                  |      j                         }|||dS )	u   
        Obtiene estadísticas básicas de un equipo.
        
        Args:
            team_id: ID del equipo
        
        Returns:
            dict con estadísticas o None si no tiene permiso
        historic)depthNd   )r3   r<   r>   )total_matcheshome_matchesaway_matches)r   r#   r@   countr   )r   r&   r5   r`   ra   rb   s         r   get_team_statsz SportsDataService.get_team_stats  s     ||))')D**7#*>~~'~JPPR~~'~JPPR +((
 	
r   )NN)   )N)__name__
__module____qualname____doc__r   r   r'   r6   r:   r@   rD   rR   rT   rV   r[   rd    r   r   r   r   
   sH    *C&,-^,$6E&4FB&.
r   r   N)ri   django.db.modelsr   modelsr   r   r   r   r	   r
   r   rj   r   r   <module>rm      s!   
  L L_
 _
r   