#!/usr/bin/env python3
"""
Zoho Self-Client Refresh Token Generator
Exchange a grant token for a refresh token.
"""

import requests
import sys

# Your Zoho OAuth credentials
CLIENT_ID = "1000.2UZYK7Z8H7AIWAWU20ZT1JUC99JPLU"
CLIENT_SECRET = "d4d0b19a4ddce9d350fa7c8943689363dae60537ad"
DATA_CENTER = "com"  # Change to eu, in, com.au, jp if needed

# Zoho OAuth token endpoint
TOKEN_URL = f"https://accounts.zoho.{DATA_CENTER}/oauth/v2/token"

def exchange_grant_token(grant_token):
    """Exchange grant token for access token and refresh token"""
    data = {
        "grant_type": "authorization_code",
        "client_id": CLIENT_ID,
        "client_secret": CLIENT_SECRET,
        "code": grant_token
    }

    print("Exchanging grant token for refresh token...")
    print()

    response = requests.post(TOKEN_URL, data=data)

    if response.status_code == 200:
        tokens = response.json()
        return tokens
    else:
        print(f"Error: {response.status_code}")
        print(response.text)
        return None

def main():
    print("=" * 70)
    print("ZOHO SELF-CLIENT REFRESH TOKEN GENERATOR")
    print("=" * 70)
    print()

    if len(sys.argv) > 1:
        grant_token = sys.argv[1]
    else:
        print("Please provide the grant token from Zoho API Console")
        print()
        print("Usage: python3 get_refresh_token_selfclient.py <grant_token>")
        print()
        print("Or run without arguments to enter it interactively:")
        print()
        grant_token = input("Enter your grant token: ").strip()

    if not grant_token:
        print("Error: No grant token provided")
        return

    tokens = exchange_grant_token(grant_token)

    if tokens:
        print("=" * 70)
        print("SUCCESS! Here are your tokens:")
        print("=" * 70)
        print()

        refresh_token = tokens.get('refresh_token', 'N/A')
        access_token = tokens.get('access_token', 'N/A')
        expires_in = tokens.get('expires_in', 'N/A')

        print(f"Refresh Token: {refresh_token}")
        print()
        print(f"Access Token: {access_token}")
        print()
        print(f"Expires In: {expires_in} seconds")
        print()
        print("=" * 70)
        print()
        print("IMPORTANT: Save your refresh token securely!")
        print("You'll use it to access the Zoho Projects API.")
        print()

        # Save to file
        with open("zoho_tokens.txt", "w") as f:
            f.write(f"Refresh Token: {refresh_token}\n")
            f.write(f"Access Token: {access_token}\n")
            f.write(f"Expires In: {expires_in} seconds\n")

        print("✓ Tokens saved to: zoho_tokens.txt")
        print()

        return refresh_token
    else:
        print("Failed to obtain tokens. Please try again.")
        print()
        print("Common issues:")
        print("- Grant token expired (they only last a few minutes)")
        print("- Grant token already used (generate a new one)")
        print("- Incorrect client credentials")
        return None

if __name__ == "__main__":
    main()
