
    soj'                         d dl Z d dl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  G d d	e          ZdS )
    N)Image	ImageDraw	ImageFont)	AssetPath)	GameBoard)GameDifficulty)Terminology)generate_temp_file_pathc                       e Zd Z	 	 	 	 	 ddededeee                  deeeef                  deeeef                  ded	ef fd
Zd Z	dde
fdZdede
fdZdefdZde
fdZdde
fdZde
fdZededefd            Z xZS )ShamblesNr   terminology	grid_sizegridword_coordinatesexcluded_coordinates
image_pathrevealed_letters_countc                    t                                                       || _        || _        || _        || _        ||ng | _        || _        || _        | j        | 	                                 | j        X	 t          j        | j                  5  	 ddd           n# 1 swxY w Y   n$# t          $ r |                                  Y nw xY w| j        |                                  dS dS )a  
        Constructor
        :param terminology: The terminology
        :param grid_size: The grid size
        :param grid: The grid of letters
        :param word_coordinates: The coordinates of the word
        :param excluded_coordinates: The coordinates of the letters that have been blanked out to
        make it easier
        :param image_path: The crossword image path
        :param revealed_letters_count: The revealed letters count
        N)super__init__r   r   r   r   r   r   r   create_gridr   openFileNotFoundErrorset_grid_image)	selfr   r   r   r   r   r   r   	__class__s	           (/app/src/model/game/shambles/Shambles.pyr   zShambles.__init__   sQ   * 	&"	 0$8$D  " 	! %&<#9 ?&&Z00                $ & & &##%%%%%& ?"!!!!! #"s6   :B- B!B- !B%%B- (B%)B- -CCc                       j         j                            dd          } j        }t	          |           j        k    rt          d          |                                } fdt           j                  D             }t          j	        g d          }t	          |          }|dk    r j        |z
  } j        dz
  }n'|dk    r j        dz
  } j        |z
  }n j        |z
  x}}t          j
        d	|          }t          j
        d	|          }	t          |          D ])}
|d
v r||
z   n|}|dv r|	|
z   n|	}||
         ||         |<   *t          j        }t          |          D ]C}t          |          D ]1}||         |         dk    rt          j	        |          ||         |<   2Dg }t          |          D ]A}
|                    ||
|dk    z  z   |
|dk    z  z   |	|
|dk    z  z   |
|dk    z  z   f           B| _        | _        dS )z7
        Create the grid
        :return: None
          z:The length of the word cannot be larger than the grid sizec                 L    g | ] }d  t          j                  D             !S )c                     g | ]}d S )r    ).0_s     r   
<listcomp>z3Shambles.create_grid.<locals>.<listcomp>.<listcomp>O   s    444444    )ranger   )r$   r%   r   s     r   r&   z(Shambles.create_grid.<locals>.<listcomp>O   s2    TTT44eDN33444TTTr'   )
horizontalverticaldiagonalr)      r*   r   )r)   r+   )r*   r+   r+   N)r   namereplacer   len
ValueErrorupperr(   randomchoicerandintstringascii_uppercaseappendr   r   )r   wordr   r   	directionword_lenmax_start_xmax_start_ystart_xstart_yixyalphabetr   s   `              r   r   zShambles.create_grid>   s    $,,S"55N	 t99t~%%YZZZ zz|| UTTTeDN>S>STTT M"H"H"HII	 t99$$.83K.1,KK*$$.1,K.83KK(,(AAK+ .K00.K00 x 	! 	!A(,FFF!GA(,DDD!'AaDGAJJ )y!! 	9 	9A9%% 9 971:$$!'x!8!8DGAJ9
 x 	 	A##a9#<==YR\E\@]]a9
#:;;a9PZCZ>[[    	 0r'   Fhighlight_answerc                 P   t          j        t          j                  5 }|                                \  }}}}||z
  }||z
  }|| j        z  }	|| j        z  }
t          |	dz  dz            }t          |dz            }t          j        t          j	        |          }t          | j                  D ]}t          | j                  D ]}| j        |         |         }|dk    r||	z  |	dz  z   }||
z  |
dz  z   }|                    |          |}}||dz  z  }||dz  z  }d}|r||g| j        v rd}t          j        |          }|                    ||f||||d	           t#          d
          }|                    |           || _        ddd           dS # 1 swxY w Y   dS )z:
        Set the grid image
        :return: None
           
      r      whitez#39FF14black)fontfillstroke_widthstroke_filljpgN)r   r   r   GAME_BACKGROUNDgetbboxr   intr   truetypeFONT_BLOGGER_SANS_BOLDr(   r   	getlengthr   r   Drawtextr
   saver   )r   rC   imageleftr1   rightlowerwidthheight
cell_widthcell_height	font_sizerM   rK   rA   r@   letterx_posy_posletter_widthletter_height
fill_colordraw	save_paths                           r   r   zShambles.set_grid_image   s5    Z	122 4	(e(-%D%DLEU]F /J 4>1K JNR/00Iy2~..L %i&F	RRD 4>**  t~..  A!Yq\!_F}} !Ja ? !K+/ A 7;nnV6L6Lim !11!22%,
+ 3A$:O0O0O)2J  )~e44		"EN"!%!+)5(/ "   +> 066IJJy!!!'DOi4	( 4	( 4	( 4	( 4	( 4	( 4	( 4	( 4	( 4	( 4	( 4	( 4	( 4	( 4	( 4	( 4	( 4	(s   E/FF"Fanswerreturnc                 r    |duo3|                                 | j        j                                         k    S )zh
        Check if the answer is correct
        :param answer: The answer
        :return: bool
        N)r\   r   r-   )r   rj   s     r   
is_correctzShambles.is_correct   s3     T!Ufllnn8H8M8S8S8U8U&UUr'   c                     t          | j                  t          | j        d                   z  }|t          | j                  z
  t          | j                  z
  S )zU
        Get the number of letters that can be excluded
        :return: int
        r   )r/   r   r   r   )r   grid_total_sizes     r   get_excludable_letters_countz%Shambles.get_excludable_letters_count   sJ     di..3ty|+<+<<T%:!;!;;c$B[>\>\\\r'   c                 2    |                                  dk    S )zO
        Check if another letter can be excluded
        :return: bool
        r   )rp   r   s    r   can_reduce_levelzShambles.can_reduce_level   s     0022Q66r'   Tshould_set_imagec                    |                                  st          d          g }t          t          | j                            D ]Y}t          t          | j        |                             D ]/}||g| j        vr"||g| j        vr|                    ||f           0Zt          | j                  D ]v}t          j
        |          }d| j        |d                  |d         <   | j                            |           |                    |           t          |          dk    r nw|r|                                  dS dS )z
        Reduce the level of the terminology
        :param should_set_image: Whether to set the image
        :return: None
        zCannot reduce level   ·r,   r   N)rs   r0   r(   r/   r   r   r   r7   r   r2   r3   remover   )r   rt   non_excluded_coordinatesrA   r@   r%   
coordinates          r   reduce_levelzShambles.reduce_level   su    $$&& 	42333 $& s49~~&& 	< 	<A3ty|,,-- < <q6!:::1vTMb?b?b,33QF;;;< t~&& 	 	A'?@@J 7;DIjm$Z]3 %,,Z888 %++J777 +,,11 2  	"!!!!!	" 	"r'   c                 F    | j         t          | j        j                  k    S )zS
        Check if all the letters have been revealed
        :return: bool
        )r   r/   r   r-   rr   s    r   have_revealed_all_lettersz"Shambles.have_revealed_all_letters   s     
 *c$2B2G.H.HHHr'   
difficultyc                 :   | xt           j        k    r t          j                                        S xt           j        k    r t          j                                        S t           j        k    rt          j                                        S 	 t          d          )zL
        Get the grid size by difficulty level
        :return: int
        zInvalid difficulty)
r   EASYEnvSHAMBLES_GRID_SIZE_EASYget_intMEDIUMSHAMBLES_GRID_SIZE_MEDIUMHARDSHAMBLES_GRID_SIZE_HARDr0   )r}   s    r   get_grid_size_by_difficultyz$Shambles.get_grid_size_by_difficulty  s     $$$$$2::<<<&&&&&4<<>>>$$$2::<<< !5666r'   )NNNNr   )F)T)__name__
__module____qualname__r	   rR   liststrtupler   r   boolr   rm   rp   rs   rz   r|   staticmethodr   r   __classcell__)r   s   @r   r   r      s       
 !%266:&'-" -" -" -" 49o	-"
 uS#X/-" #5c?3-" -" !$-" -" -" -" -" -"^@1 @1 @1D;( ;(t ;( ;( ;( ;(zV V V V V V]c ] ] ] ]7$ 7 7 7 7#" #"T #" #" #" #"JI4 I I I I 7 73 7 7 7 \7 7 7 7 7r'   r   )r2   r5   PILr   r   r   resources.EnvironmentEnvironmentr   src.model.enums.AssetPathr   src.model.game.GameBoardr   src.model.game.GameDifficultyr   src.model.wiki.Terminologyr	   src.utils.download_utilsr
   r   r#   r'   r   <module>r      s      + + + + + + + + + + # # # # # # / / / / / / . . . . . . 8 8 8 8 8 8 2 2 2 2 2 2 < < < < < <F7 F7 F7 F7 F7y F7 F7 F7 F7 F7r'   