"""Google Sheets API 클라이언트"""
from typing import Any
from google.oauth2 import service_account
from googleapiclient.discovery import build

from .config import SERVICE_ACCOUNT_KEY, SPREADSHEET_ID


class SheetsClient:
    """Google Sheets API 클라이언트 클래스"""

    SCOPES = ["https://www.googleapis.com/auth/spreadsheets.readonly"]

    def __init__(self):
        self._service = None

    @property
    def service(self):
        """Sheets API 서비스 객체 (지연 로딩)"""
        if self._service is None:
            credentials = service_account.Credentials.from_service_account_file(
                str(SERVICE_ACCOUNT_KEY),
                scopes=self.SCOPES
            )
            self._service = build("sheets", "v4", credentials=credentials)
        return self._service

    def get_sheet_data(
        self,
        range_name: str,
        spreadsheet_id: str = None
    ) -> list[list[Any]]:
        """시트 데이터 조회

        Args:
            range_name: 범위 (예: '予実出力!A1:AZ100')
            spreadsheet_id: 스프레드시트 ID

        Returns:
            2차원 배열 형태의 데이터
        """
        if spreadsheet_id is None:
            spreadsheet_id = SPREADSHEET_ID

        result = self.service.spreadsheets().values().get(
            spreadsheetId=spreadsheet_id,
            range=range_name
        ).execute()

        return result.get("values", [])

    def get_sheet_metadata(
        self,
        spreadsheet_id: str = None
    ) -> dict:
        """스프레드시트 메타데이터 조회"""
        if spreadsheet_id is None:
            spreadsheet_id = SPREADSHEET_ID

        return self.service.spreadsheets().get(
            spreadsheetId=spreadsheet_id
        ).execute()

    def get_all_sheets(
        self,
        spreadsheet_id: str = None
    ) -> list[dict]:
        """모든 시트 목록 조회"""
        metadata = self.get_sheet_metadata(spreadsheet_id)
        return [
            {
                "title": sheet["properties"]["title"],
                "sheet_id": sheet["properties"]["sheetId"],
                "index": sheet["properties"]["index"],
            }
            for sheet in metadata.get("sheets", [])
        ]


# 싱글톤 인스턴스
sheets_client = SheetsClient()
