#!/usr/bin/env python3
"""Fix assets hierarchy: delete orphaned assets, recreate with proper parents"""
import requests, json, time

API = "https://moon-erp.elbaset.com/api"

# Login
r = requests.post(f"{API}/auth/login", json={"email": "admin@moonerp.com", "password": "password"})
token = r.json()["token"]
headers = {"X-Authorization": f"Bearer {token}", "Content-Type": "application/json"}

# Step 1: Get all accounts
r = requests.get(f"{API}/accounting/accounts?per_page=200", headers=headers)
accounts = r.json()["data"]
print(f"Total accounts: {len(accounts)}")

# Step 2: Delete ALL asset accounts (classification=assets) - children first (highest level first)
asset_accounts = [a for a in accounts if a["classification"] == "assets"]
# Also delete "01" (ID 159) and "011" (ID 160) if they exist
asset_ids_to_delete = sorted([a["id"] for a in asset_accounts], reverse=True)

print(f"\nDeleting {len(asset_ids_to_delete)} asset accounts...")
for aid in asset_ids_to_delete:
    r = requests.delete(f"{API}/accounting/accounts/{aid}", headers=headers)
    status = "OK" if r.status_code == 200 else f"FAIL({r.status_code})"
    print(f"  Delete ID {aid}: {status}")

# Step 3: Recreate assets with proper hierarchy using code "10" for root
# Since code "1" has soft-delete conflict, we'll use the Egyptian standard
# but prefix root with "10" -> 10=Assets, 100=Current, 101=Non-Current
# Actually better: just try without root - make level-2 accounts the roots

print("\n=== Recreating Assets ===")
ids = {}

def create(code, name_en, name_ar, classification, nature, account_type, parent_code=None):
    data = {
        "code": code, "name": name_en, "name_ar": name_ar,
        "classification": classification, "nature": nature, "account_type": account_type,
    }
    if parent_code and parent_code in ids:
        data["parent_id"] = ids[parent_code]
    r = requests.post(f"{API}/accounting/accounts", headers=headers, json=data)
    resp = r.json()
    aid = resp.get("data", resp).get("id")
    if aid:
        ids[code] = aid
        print(f"  OK: {code} (ID:{aid}) - {name_ar}")
        return aid
    else:
        print(f"  FAIL: {code} - {name_ar} => {json.dumps(resp, ensure_ascii=False)[:120]}")
        return None

# Root: try "1" first, fall back to "10"
result = create("1", "Assets", "الأصول", "assets", "debit", "header")
if not result:
    print("  -> Code '1' blocked (soft-delete conflict), using '10' instead")
    create("10", "Assets", "الأصول", "assets", "debit", "header")
    ROOT = "10"
else:
    ROOT = "1"

# 11 - Current Assets
result = create("11", "Current Assets", "الأصول المتداولة", "assets", "debit", "header", ROOT)
if not result:
    print("  -> Code '11' blocked, trying without parent")
    create("11", "Current Assets", "الأصول المتداولة", "assets", "debit", "header")

# 111 - Cash
create("111", "Cash on Hand", "النقدية بالصندوق", "assets", "debit", "header", "11")
create("1111", "Main Cash", "الصندوق الرئيسي", "assets", "debit", "detail", "111")
create("1112", "Petty Cash", "صندوق المصروفات النثرية", "assets", "debit", "detail", "111")

# 112 - Banks
create("112", "Cash at Banks", "النقدية بالبنوك", "assets", "debit", "header", "11")
create("1121", "Bank Current Accounts", "حسابات جارية بالبنوك", "assets", "debit", "detail", "112")
create("1122", "Bank Deposit Accounts", "حسابات ودائع بالبنوك", "assets", "debit", "detail", "112")

# 113 - Receivables
create("113", "Accounts Receivable", "العملاء - ذمم مدينة", "assets", "debit", "header", "11")
create("1131", "Trade Receivables", "ذمم تجارية مدينة", "assets", "debit", "detail", "113")
create("1132", "Notes Receivable", "أوراق قبض", "assets", "debit", "detail", "113")
create("1133", "Employee Receivables", "سلف وعهد الموظفين", "assets", "debit", "detail", "113")
create("1134", "Other Receivables", "مدينون متنوعون", "assets", "debit", "detail", "113")

# 114 - Inventory
create("114", "Inventory", "المخزون", "assets", "debit", "header", "11")
create("1141", "Raw Materials", "مواد خام", "assets", "debit", "detail", "114")
create("1142", "Finished Goods", "بضاعة تامة الصنع", "assets", "debit", "detail", "114")
create("1143", "Work in Progress", "إنتاج تحت التشغيل", "assets", "debit", "detail", "114")
create("1144", "Spare Parts", "قطع غيار", "assets", "debit", "detail", "114")
create("1145", "Goods in Transit", "بضاعة بالطريق", "assets", "debit", "detail", "114")

# Direct children of 11
create("115", "Prepaid Expenses", "مصروفات مدفوعة مقدماً", "assets", "debit", "detail", "11")
create("116", "Accrued Revenue", "إيرادات مستحقة", "assets", "debit", "detail", "11")
create("117", "Other Current Assets", "أصول متداولة أخرى", "assets", "debit", "detail", "11")
create("118", "Allowance for Doubtful Debts", "مخصص الديون المشكوك فيها", "assets", "credit", "detail", "11")

# 12 - Non-Current Assets
create("12", "Non-Current Assets", "الأصول غير المتداولة", "assets", "debit", "header", ROOT)

# 121 - Fixed Assets
create("121", "Fixed Assets", "الأصول الثابتة", "assets", "debit", "header", "12")
create("1211", "Land", "أراضي", "assets", "debit", "detail", "121")
create("1212", "Buildings", "مباني", "assets", "debit", "detail", "121")
create("1213", "Vehicles", "سيارات ووسائل نقل", "assets", "debit", "detail", "121")
create("1214", "Machinery & Equipment", "آلات ومعدات", "assets", "debit", "detail", "121")
create("1215", "Furniture & Fixtures", "أثاث وتجهيزات", "assets", "debit", "detail", "121")
create("1216", "Computers & IT Equipment", "أجهزة كمبيوتر ومعدات تقنية", "assets", "debit", "detail", "121")
create("1217", "Tools & Instruments", "عدد وأدوات", "assets", "debit", "detail", "121")
create("1218", "Leasehold Improvements", "تحسينات المباني المستأجرة", "assets", "debit", "detail", "121")

# 122 - Accumulated Depreciation
create("122", "Accumulated Depreciation", "مجمع الإهلاك", "assets", "credit", "header", "12")
create("1221", "Accum. Depr. - Buildings", "مجمع إهلاك المباني", "assets", "credit", "detail", "122")
create("1222", "Accum. Depr. - Vehicles", "مجمع إهلاك السيارات", "assets", "credit", "detail", "122")
create("1223", "Accum. Depr. - Machinery", "مجمع إهلاك الآلات والمعدات", "assets", "credit", "detail", "122")
create("1224", "Accum. Depr. - Furniture", "مجمع إهلاك الأثاث", "assets", "credit", "detail", "122")
create("1225", "Accum. Depr. - Computers", "مجمع إهلاك أجهزة الكمبيوتر", "assets", "credit", "detail", "122")
create("1226", "Accum. Depr. - Tools", "مجمع إهلاك العدد والأدوات", "assets", "credit", "detail", "122")
create("1227", "Accum. Depr. - Leasehold", "مجمع إهلاك تحسينات المباني", "assets", "credit", "detail", "122")

# 123 - Intangible Assets
create("123", "Intangible Assets", "أصول غير ملموسة", "assets", "debit", "header", "12")
create("1231", "Goodwill", "شهرة المحل", "assets", "debit", "detail", "123")
create("1232", "Software & Licenses", "برامج وتراخيص", "assets", "debit", "detail", "123")
create("1233", "Patents & Trademarks", "براءات اختراع وعلامات تجارية", "assets", "debit", "detail", "123")

# 124 - Long-term Investments
create("124", "Long-term Investments", "استثمارات طويلة الأجل", "assets", "debit", "header", "12")
create("1241", "Investment in Subsidiaries", "استثمارات في شركات تابعة", "assets", "debit", "detail", "124")
create("1242", "Investment in Securities", "استثمارات في أوراق مالية", "assets", "debit", "detail", "124")

# 125
create("125", "Projects Under Construction", "مشروعات تحت التنفيذ", "assets", "debit", "detail", "12")

# Final count
r = requests.get(f"{API}/accounting/accounts?per_page=1", headers=headers)
total = r.json()["meta"]["total"]
print(f"\n=== Total accounts now: {total} ===")
