import json
import os

from google.cloud import secretmanager
import concurrent.futures
from google.oauth2 import service_account
from firebase_admin import credentials


def access_secret_version(secrets_manager_client, project_id, secret_id, version_id="latest"):
    name = f"projects/{project_id}/secrets/{secret_id}/versions/{version_id}"
    response = secrets_manager_client.access_secret_version(name=name)
    return response.payload.data.decode("UTF-8")


def retrieve_secrets_concurrently(secrets_manager_client, project_id, secret_ids):
    secrets = {}
    with concurrent.futures.ThreadPoolExecutor() as executor:
        future_to_secret_id = {executor.submit(access_secret_version, secrets_manager_client, project_id, secret_id): secret_id for secret_id in secret_ids}
        for future in concurrent.futures.as_completed(future_to_secret_id):
            secret_id = future_to_secret_id[future]
            try:
                secrets[secret_id] = future.result()
            except Exception as exc:
                print(f"Error retrieving secret {secret_id}: {exc}")
    return secrets


class Environment:

    USE_TEST_MODE = os.getenv('USE_TEST_MODE', 'true').lower() == 'true'
    LIVE_SERVER =  os.getenv("GAE_ENV") == "standard" # check if instance is running in server, or if using local development server
    
    GCLOUD_PROJECT_ID = 'storyitapp-dev' if USE_TEST_MODE else 'storyitapp'

    if not LIVE_SERVER:
        gcloud_creds_filename = 'storyitapp-dev-37436c53ccb9.json' if USE_TEST_MODE else 'storyitapp-deaec6dfc398.json'
        firebase_creds_filename = 'storyitapp-dev-firebase-adminsdk-9lzs4-46cff9a5d7.json' if USE_TEST_MODE else 'firebase_service_account.json'
        GCP_CRED_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), gcloud_creds_filename))
        GCP_CREDENTIALS = service_account.Credentials.from_service_account_file(GCP_CRED_PATH)
        FIREBASE_CRED_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), firebase_creds_filename))
        FIREBASE_CREDENTIALS = credentials.Certificate(FIREBASE_CRED_PATH)
    else:
        GCP_CREDENTIALS = None
        FIREBASE_CREDENTIALS = None
    
    secrets_manager_client = secretmanager.SecretManagerServiceClient(credentials=GCP_CREDENTIALS)
    
    common_secret_ids = [
        "FLASK_API_KEY",
        "LAMADAVA_ACCESS_KEY",
        "SMARTPROXY_PASS",
        "TWILIO_ACCOUNT_SID",
        "TWILIO_AUTH_TOKEN",
        "MAILERSEND_API_KEY",
        "GMAIL_ALERTS_ACCOUNT_APP_PASSWORD",
        "FIREBASE_CONFIG",
    ]

    common_secrets = retrieve_secrets_concurrently(secrets_manager_client, GCLOUD_PROJECT_ID, common_secret_ids)

    FLASK_API_KEY = common_secrets["FLASK_API_KEY"]
    LAMADAVA_ACCESS_KEY = common_secrets["LAMADAVA_ACCESS_KEY"]
    SMARTPROXY_PASS = common_secrets["SMARTPROXY_PASS"]
    TWILIO_ACCOUNT_SID = common_secrets["TWILIO_ACCOUNT_SID"]
    TWILIO_AUTH_TOKEN = common_secrets["TWILIO_AUTH_TOKEN"]
    MAILERSEND_API_KEY = common_secrets["MAILERSEND_API_KEY"]
    GMAIL_ALERTS_ACCOUNT_APP_PASSWORD = common_secrets["GMAIL_ALERTS_ACCOUNT_APP_PASSWORD"]
    FIREBASE_CONFIG = json.loads(common_secrets["FIREBASE_CONFIG"])

    if USE_TEST_MODE:
        # use test environment
        firebase_creds_filename = 'storyitapp-dev-firebase-adminsdk-9lzs4-46cff9a5d7.json'
        FLASK_SERVER_URL = "https://storyitapp-dev.uc.r.appspot.com"
        DOTS_URL = "https://pls.senddotssandbox.com"
        WEB_APP_URL = "storyitapp-dev.web.app"
        print("Using test mode")
        
        test_secret_ids = [
            "DOTS_SANDBOX_API_KEY",
            "DOTS_SANDBOX_CLIENT_ID",
            "STRIPE_TEST_SECRET_KEY",
            "FACEBOOK_WEBHOOK_SECRET",
        ]
        test_secrets = retrieve_secrets_concurrently(secrets_manager_client, GCLOUD_PROJECT_ID, test_secret_ids)
        DOTS_API_KEY = test_secrets["DOTS_SANDBOX_API_KEY"]
        DOTS_CLIENT_ID = test_secrets["DOTS_SANDBOX_CLIENT_ID"]
        STRIPE_SECRET_KEY = test_secrets["STRIPE_TEST_SECRET_KEY"]
        FACEBOOK_WEBHOOK_SECRET = test_secrets["FACEBOOK_WEBHOOK_SECRET"]
    else:
        firebase_creds_filename = 'firebase_service_account.json'
        gcloud_creds_filename = 'storyitapp-deaec6dfc398.json'
        FLASK_SERVER_URL = "https://storyitapp.uc.r.appspot.com"
        DOTS_URL = "https://pls.dots.dev"
        WEB_APP_URL = "offers.storyit.app"
        
        prod_secret_ids = [
            "DOTS_PRODUCTION_API_KEY",
            "DOTS_PRODUCTION_CLIENT_ID",
            "STRIPE_PROD_SECRET_KEY",
            "FACEBOOK_WEBHOOK_SECRET",
        ]
        prod_secrets = retrieve_secrets_concurrently(secrets_manager_client, GCLOUD_PROJECT_ID, prod_secret_ids)
       
        FACEBOOK_WEBHOOK_SECRET = prod_secrets["FACEBOOK_WEBHOOK_SECRET"]
        DOTS_API_KEY = prod_secrets["DOTS_PRODUCTION_API_KEY"]
        DOTS_CLIENT_ID = prod_secrets["DOTS_PRODUCTION_CLIENT_ID"]
        STRIPE_SECRET_KEY = prod_secrets["STRIPE_PROD_SECRET_KEY"]