from datetime import datetime, timedelta
import logging

logger = logging.getLogger(__name__)


class GSCConnector:
    """Connect to Google Search Console API."""

    def __init__(self, credentials_path, site_url):
        from google.oauth2 import service_account
        from googleapiclient.discovery import build

        self.site_url = site_url
        credentials = service_account.Credentials.from_service_account_file(
            credentials_path,
            scopes=["https://www.googleapis.com/auth/webmasters.readonly"],
        )
        self.service = build("searchconsole", "v1", credentials=credentials)

    # ------------------------------------------------------------------
    def get_search_analytics(self, start_date, end_date, dimensions=None, row_limit=100):
        """Fetch search analytics data."""
        if dimensions is None:
            dimensions = ["query"]
        try:
            body = {
                "startDate": start_date,
                "endDate": end_date,
                "dimensions": dimensions,
                "rowLimit": row_limit,
            }
            response = (
                self.service.searchanalytics()
                .query(siteUrl=self.site_url, body=body)
                .execute()
            )
            rows = response.get("rows", [])
            results = []
            for row in rows:
                item = {
                    "clicks": row.get("clicks", 0),
                    "impressions": row.get("impressions", 0),
                    "ctr": round(row.get("ctr", 0) * 100, 2),
                    "position": round(row.get("position", 0), 1),
                }
                for i, dim in enumerate(dimensions):
                    item[dim] = row["keys"][i]
                results.append(item)
            return results
        except Exception as e:
            logger.error(f"GSC search analytics failed: {e}")
            return []

    # ------------------------------------------------------------------
    def get_top_queries(self, days=30):
        """Get top search queries by clicks."""
        end_date = datetime.now().strftime("%Y-%m-%d")
        start_date = (datetime.now() - timedelta(days=days)).strftime("%Y-%m-%d")
        return self.get_search_analytics(start_date, end_date, ["query"], 50)

    # ------------------------------------------------------------------
    def get_top_pages(self, days=30):
        """Get top pages by clicks."""
        end_date = datetime.now().strftime("%Y-%m-%d")
        start_date = (datetime.now() - timedelta(days=days)).strftime("%Y-%m-%d")
        return self.get_search_analytics(start_date, end_date, ["page"], 50)

    # ------------------------------------------------------------------
    def get_low_hanging_fruit(self, days=30):
        """Find keywords with high impressions but low CTR (position 5-20).
        These are quick wins — you are already ranking but not getting clicks."""
        end_date = datetime.now().strftime("%Y-%m-%d")
        start_date = (datetime.now() - timedelta(days=days)).strftime("%Y-%m-%d")
        all_queries = self.get_search_analytics(start_date, end_date, ["query"], 500)

        low_hanging = [
            q for q in all_queries
            if q["impressions"] > 50 and q["position"] >= 5 and q["position"] <= 20 and q["ctr"] < 5
        ]
        low_hanging.sort(key=lambda x: x["impressions"], reverse=True)
        return low_hanging[:25]
