
    i                         d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	 ddl
mZ  ej                  e      Z G d d      Zy)zF
Configuration manager for loading and managing application settings.
    N)Path)DictOptional)load_dotenvc                   ^    e Zd ZdZddee   fdZddZddZddZ	dd	Z
dd
efdZdefdZy)ConfigManagerzFManages application configuration from YAML and environment variables.Nconfig_pathc                 n    t                |d}t        |      | _        i | _        | j	                          y)z
        Initialize configuration manager.
        
        Args:
            config_path: Path to config YAML file (default: config/config.yaml)
        Nzconfig/config.yaml)r   r   r	   config_load_config)selfr	   s     6/home/batmin/projects/sonar_scan/src/config_manager.py__init__zConfigManager.__init__   s8     	 .K, 	    returnc                    | j                   j                         ra	 t        | j                   d      5 }t        j                  |      xs i | _        ddd       t        j                  d| j                           nt        j                  d       i | _        | j                          | j                          y# 1 sw Y   ixY w# t        $ r*}t        j                  d| d       i | _        Y d}~[d}~ww xY w)z4Load configuration from YAML file or create default.rNzLoaded configuration from zFailed to load config file: z, using defaultsz?Config file not found, using environment variables and defaults)r	   existsopenyaml	safe_loadr   loggerinfo	Exceptionwarning_load_from_env_prompt_missing_values)r   fes      r   r   zConfigManager._load_config&   s    ""$!$**C0 :A"&.."3"9rDK:89I9I8JKL
 KKYZDK 	 	##%: :  !!=aS@PQR !s.   C B9*C 9C>C 	C8 C33C8c           	         | j                   j                  di       j                  d      s3t        j                  dd      | j                   j	                  di       d<   | j                   j                  di       j                  d      s3t        j                  dd      | j                   j	                  di       d<   | j                   j                  di       j                  d      s3t        j                  dd      | j                   j	                  di       d<   | j                   j                  di       j                  d	      s3t        j                  d
d      | j                   j	                  di       d	<   | j                   j                  di       j                  d      s3t        j                  dd      | j                   j	                  di       d<   | j                   j                  di       j                  d      s3t        j                  dd      | j                   j	                  di       d<   | j                   j	                  di       }|j	                  dt        j                  dd             |j	                  dt        j                  dd             |j	                  dt        j                  dd             t        j                  d      rt        j                  d      |d<   n|j	                  dd       t        j                         dk7  rg|j                  d      xs dj                         }d|v s&|j                  d       s|j                  d!      sd"|v rd|d<   t        j                  d#       	 |j	                  d$t        t        j                  d%d&                   y(# t        t        f$ r |j	                  d$d'       Y y(w xY w))z.Load configuration from environment variables.	bitbucket	workspaceBITBUCKET_WORKSPACE app_passwordBITBUCKET_APP_PASSWORD	api_tokenBITBUCKET_API_TOKENusernameBITBUCKET_USERNAME	sonarqubeurlSONARQUBE_URLzhttps://scan.appmonitor.co.za/tokenSONARQUBE_TOKENscanning	repos_dir	REPOS_DIRz./reposreports_dirREPORTS_DIRz	./reportshistory_fileHISTORY_FILEz./scan_history.jsonSONAR_SCANNER_PATHsonar_scanner_pathzsonar-scannerWindows\z.batz.cmdzC:z>Using sonar-scanner (Linux); config had Windows path, ignored.weekly_scan_daysWEEKLY_SCAN_DAYS7   N)r   getosgetenv
setdefaultplatformsystemstripendswithr   r   int	TypeError
ValueError)r   r0   paths      r   r   zConfigManager._load_from_env:   s    {{{B/33K@CE99MbdfCgDKK"";3K@{{{B/33NCFHiiPhjlFmDKK"";3NC{{{B/33K@CE99MbdfCgDKK"";3K@{{{B/33J?BD))L`bdBeDKK"";3J? {{{B/33E:=?YYXx=yDKK"";3E:{{{B/33G<?AyyIZ\^?_DKK"";3G< ;;))*b9K;	)JKM299]K+PQNBIInF[,\]99)*-/YY7K-LH)* 4oF??	)LL!56<"CCEDt|t}}V4f8MQUY]Q]1@-.\]	7 2C		BTVY8Z4[\:& 	7 2A6	7s   /N2 2!OOc                    | j                   j                  di       j                  d      s:t        d      j                         }|r|| j                   j	                  di       d<   | j                   j                  di       j                  d      s:t        d      j                         }|r|| j                   j	                  di       d<   | j                   j	                  di       }|j                  d      s~|j                  d      smt        d      j                         j                         }|d	k7  r!t        d
      j                         }|r&||d<   n t        d      j                         }|r||d<   | j                   j                  di       j                  d      s<t        d      j                         }|r || j                   j	                  di       d<   yyy)z6Prompt user for missing required configuration values.r!   r"   z Enter Bitbucket workspace name: r)   z Enter Bitbucket username/email: r'   r%   z1Do you want to use API token? (y/n, default: y): nzEnter Bitbucket API token: zEnter Bitbucket app password: r+   r.   zEnter SonarQube token: N)r   r?   inputrE   rB   lower)r   r"   r)   bitbucket_config	use_tokenr'   r%   r.   s           r   r   z$ConfigManager._prompt_missing_valuesa   s    {{{B/33K@@AGGIIGP&&{B7D {{{B/33J??@FFHHFN&&{B7
C  ;;11+rB##K09I9M9Mn9]QRXXZ``bIC!"?@FFH	4=$[1$%EFLLN7C$^4 {{{B/33G<34::<ECH&&{B7@  =r   c                 p   	 | j                   j                  j                  dd       | j                  j	                  di       j	                  dd      ddd| j                  j	                  di       j	                  dd      dd	| j                  j	                  d
i       d}t        | j                   d      5 }t        j                  ||d       ddd       t        j                  d| j                           y# 1 sw Y   ,xY w# t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)z(Save current configuration to YAML file.T)parentsexist_okr!   r"   r$   )r"   r)   r%   r+   r,   )r,   r.   r0   )r!   r+   r0   wF)default_flow_styleNzConfiguration saved to zFailed to save configuration: )r	   parentmkdirr   r?   r   r   dumpr   r   r   r   )r   safe_configr   r   s       r   save_configzConfigManager.save_config   s   	A##))$)F
 "&b!A!E!EkSU!V "$&  ;;??;;??rJ !KKOOJ;K d&&, D		+qUCD KK1$2B2B1CDED D  	ANN;A3?@@	As0   B8D
 :C>*D
 >DD
 
	D5D00D5keyc                     |j                  d      }| j                  }|D ]-  }t        |t              r|j	                  |      }|'|c S |c S  ||S |S )a  
        Get configuration value using dot notation.
        
        Args:
            key: Configuration key (e.g., "bitbucket.workspace")
            default: Default value if key not found
            
        Returns:
            Configuration value
        .)splitr   
isinstancedictr?   )r   r[   defaultkeysvalueks         r   r?   zConfigManager.get   sa     yy~ 	A%&		!="N	 )u6w6r   c                 6    | j                   j                         S )zGet all configuration.)r   copy)r   s    r   get_allzConfigManager.get_all   s    {{!!r   )N)r   N)__name__
__module____qualname____doc__r   strr   r   r   r   rZ   r?   r   rg    r   r   r   r      sE    PHSM (&(%7NIBA67s 70" "r   r   )rk   r@   rC   r   loggingpathlibr   typingr   r   dotenvr   	getLoggerrh   r   r   rm   r   r   <module>rs      s?    
     ! 			8	$h" h"r   