import psycopg2
import requests
from requests.auth import HTTPBasicAuth

# === CONFIGURATION ===
DB_HOST = "localhost"
DB_PORT = 5432
DB_NAME = "db_name"
DB_USER = "db_user"
DB_PASSWORD = "password"

# === JIRA CLOUD CONFIGURATION ===
CLOUD_API_BASE_URL = "https://instance.atlassian.net"
CLOUD_EMAIL = "mail@domain.com"
CLOUD_API_TOKEN = "AAA"
auth = HTTPBasicAuth(CLOUD_EMAIL, CLOUD_API_TOKEN)

# === FUNCTIONS ===
def fetch_projects_from_dc():
    print(":inbox_tray: Fetching projects from Data Center DB...")
    query = 'SELECT id, pkey FROM project'
    with psycopg2.connect(
        host=DB_HOST,
        port=DB_PORT,
        dbname=DB_NAME,
        user=DB_USER,
        password=DB_PASSWORD
    ) as conn:
        with conn.cursor() as cursor:
            cursor.execute(query)
            rows = cursor.fetchall()
            return [{"id": row[0], "key": row[1]} for row in rows]
        
def fetch_project_from_cloud_by_key(project_key):
    url = f"{CLOUD_API_BASE_URL}/project/{project_key}"
    response = requests.get(url, auth=auth, headers={"Accept": "application/json"})
    if response.status_code == 200:
        print(response.json())
        return response.json()
    else:
        print(f":warning: Cloud project not found for key '{project_key}' (HTTP {response.status_code})")
        try:
            print(":mag: Error response:", response.json())
        except ValueError:
            print(":warning: No JSON body in error response:", response.text)
        return None
    
def sync_projects():
    dc_projects = fetch_projects_from_dc()
    project_id_map = {}
    print(":arrows_counterclockwise: Syncing projects...")
    for dc_project in dc_projects:
        key = dc_project["key"]
        cloud_project = fetch_project_from_cloud_by_key(key)
        if cloud_project:
            project_id_map[dc_project["id"]] = cloud_project["id"]
            print(f":white_check_mark: Matched: DC({dc_project['id']}) → Cloud({cloud_project['id']}) [Key: {key}]")
        else:
            print(f":x: No match found for project key: {key}")
    return project_id_map

if __name__ == "__main__":
    id_map = sync_projects()
    print("\n:blue_book: Final ID Map (Data Center → Cloud):")
    for dc_id, cloud_id in id_map.items():
        print(f"{dc_id} → {cloud_id}")
