import argparse
import csv
import json
import sys

parser = argparse.ArgumentParser(description="Generate HTTP Request to Repair Data Store")
parser.add_argument('--data_store_file', required=True)
parser.add_argument('--data_store_name_to_repair', required=True)
parser.add_argument('--sas_base_url', required=True)
parser.add_argument('--oauth_token', required=True)
args = parser.parse_args()

def clean_connection_type(val):
    if val is None:
        return None

    if val.lower().startswith("external_"):
        return val.lower()[len("external_"):]
    
    return val.lower()

def to_int(val):
    return int(val)

def to_bool(val):
    if val == '' or val is None:
        return None
    if val == '0':
        return False
    return True

def from_json(val):
    if not val or val.strip() == '':
        return {}

    return json.loads(val)

found = False
with open(args.data_store_file, newline='') as f:
    reader = csv.DictReader(f)
    for row in reader:
        if row.get('data_store_nm') == args.data_store_name_to_repair:
            found = True
            obj = {
                "id": row["data_store_id"],
                "name": row["data_store_nm"],
                "type": row["data_store_type_cd"],
                "connectionType": clean_connection_type(row["connection_type_cd"] or ""),
                "version": row["optlock_version_no"],
                "host": row["host_nm"],
                "port": row["port_txt"],
                "databaseNameOrServiceName": row["database_or_service_nm"],
                "urlAppendedParameters": row["url_appended_parameters_txt"],
                "advancedProperties": from_json(row["advanced_properties_json_txt"]),
                "assignedTimeZone": row["assigned_time_zone_cd"],
                "initialSize": to_int(row["pool_initial_size_no"]),
                "schema": row["schema_nm"],
                "testOnBorrow": to_bool(row["pool_test_on_borrow_flg"]),
                "minIdle": to_int(row["pool_min_idle_no"]),
                "maxIdle": to_int(row["pool_max_idle_no"]),
                "maxActive": to_int(row["pool_max_active_no"]),
                "username": "<usernameGoesHere>",
                "password": "<passwordGoesHere>"
            }
            merged_json = json.dumps(obj, indent=2)
            curl_cmd = (
                f"curl --request PUT \\\n"
                f"  --url '{args.sas_base_url}/svi-datahub/admin/dataStores/repair/{args.data_store_name_to_repair}' \\\n"
                f"  --verbose \\\n"
                f"  --header 'Accept: application/json, text/plain, */*' \\\n"
                f"  --header 'Content-Type: application/json' \\\n"
                f"  --header 'Authorization: Bearer {args.oauth_token}' \\\n"
                f"  --data @- <<EOF\n"
                f"{merged_json}\n"
                f"EOF"
            )
            print("Copy this command, replace <usernameGoesHere> and <passwordGoesHere> with the data store credentials, and run the command in a terminal:")
            print()
            print(curl_cmd)
            break

if not found:
    print(f"Data store {args.data_store_name_to_repair} not found in {args.data_store_file}", file=sys.stderr)
    sys.exit(1)