
    i>                     4    S SK rS SKrS SKJr   " S S5      rg)    N)Configc                   h    \ rS rSrSr\S 5       r\S 5       r\S 5       r\S 5       r	\S 5       r
Srg	)
AppSettingsModel   z
Model for managing application-wide settings in a key-value store.
The `setting_value` is stored as a JSON string to accommodate various data types.
c                  D    [         R                  R                  [        R                  [        R
                  [        R                  [        R                  [        R                  S9$ ! [         R                  R                   a  n [        SU  35         Sn A gSn A ff = f)z"Establishes a database connection.)hostportuserpassworddatabasez$Error connecting to MySQL Database: N)mysql	connectorconnectr   DB_HOSTDB_PORTDB_USERDB_PASSWORDDB_NAMEErrorprint)es    1/var/www/fran/franai/models/app_settings_model.pyget_db_connection"AppSettingsModel.get_db_connection   sw    
	??**^^^^^^++ +   $$ 	8<=	s   A&A) )BBBc                  
   [         R                  5       n U (       d  g U R                  5       nUR                  S5        U R	                  5         [        S5        U R                  5       (       a!  WR                  5         U R                  5         gg! [        R                  R                   a  n[        SU 35         SnANhSnAff = f! U R                  5       (       a!  WR                  5         U R                  5         f f = f)z;Creates the app_settings table if it doesn't already exist.Na=  
                CREATE TABLE IF NOT EXISTS app_settings (
                    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                    setting_key TEXT NOT NULL,
                    setting_value TEXT NOT NULL,
                    UNIQUE INDEX idx_setting_key (setting_key(191))
                )
            z=[OK] 'app_settings' table exists or was successfully created.z%Error creating 'app_settings' table: )r   r   cursorexecutecommitr   r   r   r   is_connectedclose)connr   r   s      r   create_table_if_not_exists+AppSettingsModel.create_table_if_not_exists   s      113	[[]FNN   KKMQR   ""

 # $$ 	?9!=>>	?   ""

 #s)   <B C/C=C
 CC
 
8Dc                  0   [         R                  5       n U (       d  0 $ 0 n U R                  SS9nUR                  S5        UR	                  5        H"  n [
        R                  " US   5      XS   '   M$     UU R                  5       (       a!  UR                  5         U R                  5         $ $ ! [
        R                  [        4 a     [        SUS    S35        US   XS   '    M  f = f! [        R                  R                   aP  n[        SU 35        0 s S	nAU R                  5       (       a!  WR                  5         U R                  5         $ $ S	nAff = f! U R                  5       (       a!  WR                  5         U R                  5         f f = f)
z8Retrieves all settings and returns them as a dictionary.T)
dictionaryz3SELECT setting_key, setting_value FROM app_settingssetting_valuesetting_keyu*   ⚠️ Warning: Could not decode setting 'z'. Storing as raw value.zError fetching all settings: N)r   r   r   r   fetchalljsonloadsJSONDecodeError	TypeErrorr   r   r    r   r   r   )r!   settingsr   rowr   s        r   get_all_settings!AppSettingsModel.get_all_settings4   sh     113I	[[D[1FNNPQ(H37::c/>R3SH/0 ) 
   ""

 # ,,i8 HFs=GYFZZrst363GH/0H
 $$ 	1!56I  ""

 #		   ""

 #sS   3C, B/3C, /6C)%C, (C))C, ,E
EEE EE 8Fc                 6   [         R                  5       nU(       d  g UR                  5       nSnU R                  5        VVs/ s H  u  pEU[        R
                  " U5      4PM     nnnUR                  X65        UR                  5         [        S[        U5       S35         UR                  5       (       a!  UR                  5         UR                  5         ggs  snnf ! [        R                  R                   a^  n[        SU 35        UR                  5          SnAUR                  5       (       a!  WR                  5         UR                  5         ggSnAff = f! UR                  5       (       a!  WR                  5         UR                  5         f f = f)zd
Updates or inserts multiple settings from a dictionary.
Returns True on success, False on failure.
Fz
                INSERT INTO app_settings (setting_key, setting_value)
                VALUES (%s, %s)
                ON DUPLICATE KEY UPDATE
                    setting_value = VALUES(setting_value)
            z[OK] Successfully saved z settings to the database.TzError saving settings: N)r   r   r   itemsr)   dumpsexecutemanyr   r   lenr   r    r   r   r   rollback)settings_dictr!   r   querykeyvaluedata_to_insertr   s           r   update_settings AppSettingsModel.update_settingsP   sQ     113	[[]FE <I;N;N;P;PZSdjj'(;P   u5KKM,S-@,AA[\]   ""

 # $$ 	+A3/0MMO  ""

 #	
   ""

 #s;   %C! $C'<C! C! !E?EE  EE   8Fc                     SSSSSSSSS	S
SS.
0n [         R                  5       nU(       d  g UR                  5       nU R                  5        H.  u  p4SnUR	                  XS[
        R                  " U5      45        M0     UR                  5         UR                  S:  a  [        SUR                   S35        UR                  5       (       a!  WR                  5         UR                  5         gg! [        R                  R                   a  n[        SU 35         SnANhSnAff = f! UR                  5       (       a!  WR                  5         UR                  5         f f = f)zk
Populates the database with default settings if they don't already exist.
This is safe to run on startup.
quality_thresholdsP      g?(   d      K   g333333?7   )
envBrightnessMinenvBrightnessMaxglareMaxPercentagebacklightThresholdfaceBrightnessMinfaceBrightnessMaxdarkPixelThresholddarkPixelPercentagelightingStdDevMaxsharpnessMinNzLINSERT IGNORE INTO app_settings (setting_key, setting_value) VALUES (%s, %s)r   z[OK] Seeded z default setting(s).z Error seeding default settings: )r   r   r   r2   r   r)   r3   r   rowcountr   r   r   r   r   r    )default_thresholdsr!   r   r9   r:   r8   r   s          r   seed_default_settings&AppSettingsModel.seed_default_settingss   s:    !$&$'&+&(%(%(&('*%' ##
  113	[[]F0668
fuDJJu,=&>? 9
 KKM"V__$55IJK   ""

 # $$ 	:4QC899	:   ""

 #s*   BC/ /D%D D(  D%%D( (8E  N)__name__
__module____qualname____firstlineno____doc__staticmethodr   r"   r/   r<   rS   __static_attributes__rU       r   r   r      sl    
    2  6    D ( (r]   r   )mysql.connectorr   r)   franai.services.configr   r   rU   r]   r   <module>r`      s      )W Wr]   