
    3fit                    n   d Z ddlmZ ddlZddlmZmZmZ ddlm	Z	m
Z
 erddlmZ ddlmZ 	 	 	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZdd	Zdd
Z ej$                  d      Z ej$                  d      Z ej$                  d      Z ej$                  d      Z ej$                  d      ZddZddZddZy)zGoogle Sheets tool utils.    )annotationsN)TYPE_CHECKINGListOptionalget_google_credentials'import_googleapiclient_resource_builder)Credentials)Resourcec                f    ddg}|xs |}| xs t        ||||      } t               } ||||       S )a  Build a Google Sheets service with OAuth2 credentials (full access).

    Args:
        credentials: OAuth2 credentials. If None, will attempt to load from
            default locations.
        service_name: The Google API service name.
        service_version: The Google API service version.
        use_domain_wide: Whether to use domain-wide delegation.
        delegated_user: User to impersonate for domain-wide delegation.
        service_account_file: Path to service account file for domain-wide
            delegation.
        scopes: List of OAuth2 scopes. Defaults to full access scopes.

    Returns:
        Resource: Google Sheets API service with full access capabilities.
    z,https://www.googleapis.com/auth/spreadsheetsz.https://www.googleapis.com/auth/drive.readonly)scopesuse_domain_widedelegated_userservice_account_file)credentialsr   )	r   service_nameservice_versionr   r   r   r   default_scopesbuilders	            e/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_google_community/sheets/utils.pybuild_sheets_servicer      sT    8 	78N
 %~F !7'%1	"K 67G<kJJ    c                ,    t               } |dd|       S )a  Build a Google Sheets service with API key (read-only access).

    Args:
        api_key: Google API key for authentication.

    Returns:
        Resource: Google Sheets API service with read-only access to public
            spreadsheets.

    !!! note

        API key authentication only works with public spreadsheets.

        For private spreadsheets, use OAuth2 credentials instead.
    sheetsv4)developerKey)r	   )api_keyr   s     r   !build_sheets_service_with_api_keyr   >   s      67G8T88r   c                    | st        d      d| v r;| j                  d      dz   }| j                  d|      }|dk(  rt        |       }| || } t        |       dk  rt        d|        | S )	zValidate and normalize a Google Spreadsheet ID.

    Args:
        spreadsheet_id: The spreadsheet ID to validate.

    Returns:
        The validated spreadsheet ID.

    Raises:
        ValueError: If the spreadsheet ID is invalid.
    zSpreadsheet ID cannot be emptyzdocs.google.com/spreadsheets/d/z/d/   /   zInvalid spreadsheet ID format: )
ValueErrorfindlen)spreadsheet_idstartends      r   validate_spreadsheet_idr*   R   s     9:: )N:##E*Q.!!#u-"9n%C'c2 >R:>:JKLLr   z^[A-Za-z]+[1-9]\d*$z%^[A-Za-z]+[1-9]\d*:[A-Za-z]+[1-9]\d*$z^[A-Za-z]+:[A-Za-z]+$z^[1-9]\d*:[1-9]\d*$z^[A-Za-z_][A-Za-z0-9_]*$c                   t         j                  |       ryt        j                  |       ryt        j                  |       ryt        j                  |       ryt
        j                  |       r| d   dk(  rt        d | D              ryyy)zValidate a range target (after sheet qualifier removed).

    Args:
        target: Range string without sheet qualifier.

    Returns:
        True if valid, False otherwise.
    Tr"   0c              3  <   K   | ]  }|j                           y w)N)isalpha).0cs     r   	<genexpr>z#_validate_target.<locals>.<genexpr>   s     $AQQYY[$As   F)_AREA	fullmatch_CELL_COLS_ROWS_NAMEDany)targets    r   _validate_targetr:      sr     vvvv ":$A&$A!Ar   c                    | r| j                         sy| j                  d      ry| j                  d      \  }}}|r|sy|}t        |      S | }t        |      S )a  Validate A1 notation range format.

    Supports:
    - Single cells: `'A1'`, `'Z99'`
    - Areas: `'A1:B2'`
    - Whole columns: `'A:A'`, `'B:D'`
    - Whole rows: `'1:1'`, `'5:10'`
    - Sheet-qualified: `'Sheet1!A1'`, `"'My Sheet'!A1:B2"`
    - Named ranges: `'MyData'`, `'Sales_2024'`

    Args:
        range_name: Range string to validate.

    Returns:
        `True` if valid format, `False` otherwise.

    Examples:
        >>> validate_a1_range("A1")
        True
        >>> validate_a1_range("A1:B2")
        True
        >>> validate_a1_range("Sheet1!A1")
        True
        >>> validate_a1_range("A:A")
        True
        >>> validate_a1_range("")
        False
    F!)strip
startswith	partitionr:   )
range_namesheethad_bangafterr9   s        r   validate_a1_rangerD      sj    : Z--/S!'11#6E8U F## F##r   c                :    t        |       st        d|  d      | S )aW  Validate and normalize a range name.

    Permissive A1 validator. Supports:
    - Single cells: `'A1'`, `'Z99'`
    - Areas: `'A1:B2'`
    - Whole columns: `'A:A'`, `'B:D'`
    - Whole rows: `'1:1'`, `'5:10'`
    - Sheet-qualified: `'Sheet1!A1'`, `"'My Sheet'!A1:B2"`
    - Named ranges: `'MyData'`, `'Sales_2024'`

    Args:
        range_name: The range name to validate (e.g., `'A1:Z100'`, `'Sheet1!A1:B2'`).

    Returns:
        The validated range name.

    Raises:
        ValueError: If the range name is invalid.

    Examples:
        >>> validate_range_name("A1")
        'A1'
        >>> validate_range_name("Sheet1!A1:B2")
        'Sheet1!A1:B2'
        >>> validate_range_name("A:A")
        'A:A'
        >>> validate_range_name("")
        Traceback (most recent call last):
        ...
        ValueError: Invalid range format: ...
    zInvalid range format: zb. Expected A1 notation like 'A1', 'A1:B2', 'Sheet1!A1', 'A:A', or '1:1'. Named ranges are allowed.)rD   r$   )r@   s    r   validate_range_namerF      s3    @ Z($ZL 1( (
 	
 r   )Nr   r   FNNN)r   zOptional[Credentials]r   strr   rG   r   boolr   Optional[str]r   rI   r   zOptional[List[str]]returnr   )r   rG   rJ   r   )r'   rG   rJ   rG   )r9   rG   rJ   rH   )r@   rG   rJ   rH   )r@   rG   rJ   rG   )__doc__
__future__r   retypingr   r   r   !langchain_google_community._utilsr   r	   google.oauth2.credentialsr
   googleapiclient.discoveryr   r   r   r*   compiler4   r2   r5   r6   r7   r:   rD   rF    r   r   <module>rT      s    " 	 0 0
 52 *. !$(*."&)K&)K)K )K 	)K
 ")K ()K  )K )KX9(H 	

)*

;<

+,

)*	/	08*$Z'r   