#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
SAGA WEB - VALIDARE MASIVA FACTURI
Validate invoices in SAGA - PASUL 2 + PASUL 3 STEP 1
- PASUL 2: Validate all invoices in the current period
- PASUL 3 STEP 1: Load matching assets from Excel and process imobilizari registration
"""

import time
import sys
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
import configparser

# PASUL 3 - Import Step 1 + Step 2 (Excel matching + Delete default asset)
try:
    from pasul3_step1_excel_matching import pasul3_step1
    from pasul3_step2_delete_asset import pasul3_step2
    PASUL3_AVAILABLE = True
except ImportError:
    PASUL3_AVAILABLE = False
    print("⚠ PASUL 3 modul nu gasit - validare masiva va functiona fara imobilizari")

# Colors
class Colors:
    GREEN = '\033[92m'
    RED = '\033[91m'
    YELLOW = '\033[93m'
    BLUE = '\033[94m'
    CYAN = '\033[96m'
    RESET = '\033[0m'
    BOLD = '\033[1m'

def print_colored(text, color):
    print(f"{color}{text}{Colors.RESET}")

# ============================================================================
# MAIN
# ============================================================================

print("\n" + "="*70)
print_colored("SAGA WEB - VALIDARE MASIVA - PASUL 2 + PASUL 3 STEP 1", Colors.BOLD)
print("="*70 + "\n")

try:
    # 1. Conectare la Chrome existent (lansat de RUN_LOGIN.bat)
    print_colored("1. Conectare la Chrome existent (port 9222)...", Colors.BLUE)
    options = Options()
    options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
    try:
        driver = webdriver.Chrome(options=options)
    except Exception as e:
        print_colored("\n❌ EROARE: Nu pot conecta la Chrome pe port 9222.", Colors.RED)
        print_colored("   Ruleaza mai intai RUN_LOGIN.bat si lasa browser-ul deschis.", Colors.YELLOW)
        print_colored(f"   Detalii: {str(e)}", Colors.RED)
        sys.exit(1)
    wait = WebDriverWait(driver, 60)
    print_colored("   ✓ Conectat la Chrome (sesiunea de la login)", Colors.GREEN)

    # 10. Click on "Operatii" menu
    print_colored("\n10. Clickez pe Operatii...", Colors.BLUE)
    operatii_button = wait.until(EC.element_to_be_clickable((By.ID, "navbar_Operatii")))
    operatii_button.click()
    time.sleep(1)
    print_colored("   ✓ Meniu Operatii deschis", Colors.GREEN)

    # 11. Click on "Intrari" submenu
    print_colored("\n11. Clickez pe Intrari...", Colors.BLUE)
    intrari_link = wait.until(EC.element_to_be_clickable((By.ID, "navbar_Intrari")))
    intrari_link.click()
    print_colored("   ✓ Link Intrari apăsat", Colors.GREEN)

    # 12. Wait for Intrari page to load
    print_colored("\n12. Aștept pagina Intrari...", Colors.BLUE)
    time.sleep(3)
    wait.until(EC.presence_of_element_located((By.TAG_NAME, "body")))
    print_colored("   ✓ Pagina Intrari încărcată", Colors.GREEN)

    # ===== PASUL 1: MODIFICARE PERIOADA (01.03.2026 - 31.03.2026) =====
    print_colored("\n" + "="*70, Colors.BLUE)
    print_colored("PASUL 1: MODIFICARE PERIOADA - Martie 2026 (01.03.2026 - 31.03.2026)", Colors.BLUE)
    print_colored("="*70, Colors.BLUE)

    # 13. Click pe Interval
    print_colored("\n13. Click pe Interval...", Colors.BLUE)
    interval_button = wait.until(EC.element_to_be_clickable((By.ID, "navbar_Interval")))
    interval_button.click()
    time.sleep(1)
    print_colored("   ✓ Meniu Interval deschis", Colors.GREEN)

    # 14. Data inceput (01.03.2026)
    print_colored("\n14. Completez data de început...", Colors.BLUE)
    interval_start = wait.until(EC.presence_of_element_located((By.ID, "navbar_IntervalStart")))
    interval_start.click()
    time.sleep(0.5)
    interval_start.send_keys(Keys.CONTROL + "a")
    time.sleep(0.2)
    interval_start.send_keys("01.03.2026")
    time.sleep(0.5)
    print_colored("   ✓ Data început: 01.03.2026", Colors.GREEN)

    # 15. Data final (31.03.2026)
    print_colored("\n15. Completez data de final...", Colors.BLUE)
    time.sleep(1)
    interval_end = wait.until(EC.presence_of_element_located((By.ID, "navbar_IntervalEnd")))
    interval_end.click()
    time.sleep(0.5)
    interval_end.send_keys(Keys.CONTROL + "a")
    time.sleep(0.2)
    interval_end.send_keys("31.03.2026")
    time.sleep(0.5)
    interval_end.send_keys(Keys.TAB)
    time.sleep(1)
    print_colored("   ✓ Data final: 31.03.2026", Colors.GREEN)

    # 16. Inchid dropdown cu Escape
    print_colored("\n16. Închid dropdown-ul Interval...", Colors.BLUE)
    time.sleep(0.5)
    driver.find_element(By.TAG_NAME, "body").send_keys(Keys.ESCAPE)
    time.sleep(1)
    print_colored("   ✓ Dropdown închis", Colors.GREEN)

    # 17. Astept aplicarea perioadei
    print_colored("\n17. Aștept aplicarea perioadei...", Colors.BLUE)
    time.sleep(2)
    print_colored("   ✓ Perioada aplicată", Colors.GREEN)

    # ===== PASUL 2: VALIDARE MASIVA =====
    print_colored("\n" + "="*70, Colors.CYAN)
    print_colored("PASUL 2: VALIDARE MASIVA A FACTURILOR", Colors.CYAN)
    print_colored("="*70, Colors.CYAN)

    print_colored("\n18. Procesare facturi...", Colors.BLUE)
    time.sleep(2)

    validated_count = 0
    skipped_count = 0
    current_position = 1

    # PASUL 3 - Error tracking for imobilizari
    pasul3_errors = []
    pasul3_success = 0

    print_colored("\n   Numărare rânduri totale...", Colors.BLUE)
    time.sleep(1)

    # Get all invoice rows upfront
    all_rows = driver.find_elements(By.XPATH, "//tr[contains(@class, 'rowSelectable_Intrari')]")
    total_rows = len(all_rows)

    print_colored(f"   ✓ Găsite {total_rows} rânduri în tabel", Colors.GREEN)

    # Process each row by index - this way we avoid stale element references
    for row_idx in range(total_rows):
        try:
            time.sleep(0.3)

            # Re-fetch all rows each time to avoid stale elements
            all_rows = driver.find_elements(By.XPATH, "//tr[contains(@class, 'rowSelectable_Intrari')]")

            if row_idx >= len(all_rows):
                print_colored(f"\n   ⚠ Rând {row_idx} nu mai există", Colors.YELLOW)
                break

            current_row = all_rows[row_idx]

            # Get invoice number
            try:
                invoice_num = current_row.find_element(By.XPATH, ".//span[@class='rowFieldText rowFieldText_NrDoc']").text
            except:
                invoice_num = ""

            # Skip rows with empty invoice numbers
            if not invoice_num or invoice_num.strip() == "":
                continue

            # Check if this row is unvalidated (has fa-unlock-alt)
            try:
                icon_element = current_row.find_element(By.XPATH, ".//i[contains(@class, 'fa-unlock-alt')]")
                is_unvalidated = True
            except:
                is_unvalidated = False

            if not is_unvalidated:
                # Already validated, skip
                skipped_count += 1
                continue

            # This is an unvalidated invoice with a number - validate it
            print_colored(f"\n   [{current_position}] Factura NEVALIDATA ({invoice_num}) - Se validează...", Colors.YELLOW)
            current_position += 1

            # Scroll and click
            driver.execute_script("arguments[0].scrollIntoView(true);", current_row)
            time.sleep(0.3)

            try:
                clickable_cell = current_row.find_element(By.XPATH, ".//span[@class='rowFieldText rowFieldText_NrDoc']")
                driver.execute_script("arguments[0].click();", clickable_cell)
            except:
                driver.execute_script("arguments[0].click();", current_row)

            time.sleep(1)

            # Click Validez button
            try:
                validez_button = wait.until(EC.element_to_be_clickable((By.ID, "extratoolbarValidez")))
                driver.execute_script("arguments[0].click();", validez_button)
                print_colored(f"      ✓ Validare apăsată", Colors.GREEN)
                time.sleep(1.5)

                # Check if popup "Inregistram imobilizarea" appears
                popup_found = False
                for attempt in range(5):  # Try up to 5 times (5 seconds total with 1 second waits)
                    try:
                        popup_button = driver.find_element(By.ID, "buttonChooseYes")
                        if popup_button.is_displayed():
                            print_colored(f"      ⚠ Popup imobilizări detectat - apas DA", Colors.YELLOW)
                            driver.execute_script("arguments[0].click();", popup_button)
                            print_colored(f"      ✓ Imobilizare confirmată", Colors.GREEN)
                            time.sleep(2)

                            # ===== PASUL 3 STEP 0: Delete default row =====
                            print_colored(f"      → PASUL 3 STEP 0: Ștergere rând default...", Colors.BLUE)
                            try:
                                # Apasa butonul Renunt cu ALT+R shortcut
                                body = driver.find_element(By.TAG_NAME, "body")
                                body.send_keys(Keys.ALT + 'r')
                                time.sleep(1)
                                print_colored(f"      ✓ Rând default șters", Colors.GREEN)
                            except Exception as e:
                                print_colored(f"      ⚠ Eroare ștergere rând: {str(e)}", Colors.YELLOW)

                            time.sleep(1)

                            # ===== PASUL 3 STEP 1: Click Adauga button =====
                            print_colored(f"      → PASUL 3 STEP 1: Adaugare linie nouă...", Colors.BLUE)
                            try:
                                # Apasa butonul Adauga cu ALT+A shortcut
                                body = driver.find_element(By.TAG_NAME, "body")
                                body.send_keys(Keys.ALT + 'a')
                                time.sleep(1)
                                print_colored(f"      ✓ Linie nouă adăugată", Colors.GREEN)
                            except Exception as e:
                                print_colored(f"      ⚠ Eroare adaugare linie: {str(e)}", Colors.YELLOW)

                            time.sleep(1)
                            popup_found = True

                            # ===== PASUL 3: REGISTRARE IMOBILIZARI =====
                            if PASUL3_AVAILABLE:
                                try:
                                    print_colored(f"      → PASUL 3: Citire imobilizari din Excel (invoice: {invoice_num})...", Colors.BLUE)

                                    # STEP 1: Load Excel and match assets
                                    doc_number, asset_count, assets, errors = pasul3_step1(driver, invoice_num)

                                    if errors:
                                        print_colored(f"      ⚠ Erori la procesare ({invoice_num}):", Colors.YELLOW)
                                        for error in errors:
                                            print_colored(f"         - {error}", Colors.YELLOW)
                                            pasul3_errors.append(f"{invoice_num}: {error}")

                                    if asset_count > 0:
                                        print_colored(f"      ✓ Gasite {asset_count} imobilizari pentru doc {doc_number}", Colors.GREEN)
                                        pasul3_success += 1

                                        # ===== PASUL 3 STEP 2: Delete default asset row =====
                                        print_colored(f"      → PASUL 3 STEP 2: Ștergere rând default...", Colors.BLUE)
                                        try:
                                            success, message = pasul3_step2(driver, debug=False)
                                            if success:
                                                print_colored(f"      ✓ {message}", Colors.GREEN)
                                            else:
                                                print_colored(f"      ❌ {message}", Colors.RED)
                                                pasul3_errors.append(f"{invoice_num}: STEP 2 - {message}")
                                        except Exception as e:
                                            print_colored(f"      ❌ Eroare STEP 2: {str(e)}", Colors.RED)
                                            pasul3_errors.append(f"{invoice_num}: STEP 2 - {str(e)}")

                                        # ===== PASUL 3 STEP 3: Complete form fields with Excel data =====
                                        print_colored(f"      → PASUL 3 STEP 3: Completare câmpuri cu date Excel...", Colors.BLUE)
                                        try:
                                            if assets and len(assets) > 0:
                                                asset = assets[0]
                                                nr_inv = asset.get('Nr. inv.', '')

                                                if nr_inv:
                                                    # Fill Nr. inv. field
                                                    nr_inv_field = driver.find_element(By.ID, "inputBox_NrInv_Imobilizari")
                                                    nr_inv_field.clear()
                                                    nr_inv_field.send_keys(nr_inv)
                                                    time.sleep(0.5)
                                                    print_colored(f"      ✓ Nr. inv. completat: {nr_inv}", Colors.GREEN)
                                                else:
                                                    print_colored(f"      ⚠ Nr. inv. lipsa din Excel", Colors.YELLOW)
                                            else:
                                                print_colored(f"      ⚠ Nu exista date de completat", Colors.YELLOW)
                                        except Exception as e:
                                            print_colored(f"      ⚠ Eroare completare câmpuri: {str(e)}", Colors.YELLOW)
                                    else:
                                        print_colored(f"      ⚠ Nu gasit imobilizari pentru doc {doc_number}", Colors.YELLOW)
                                        pasul3_errors.append(f"{invoice_num}: Nu gasit imobilizari pentru {doc_number}")

                                except Exception as e:
                                    print_colored(f"      ❌ Eroare PASUL 3: {str(e)}", Colors.RED)
                                    pasul3_errors.append(f"{invoice_num}: Eroare sistem - {str(e)}")

                            break
                    except:
                        pass
                    if attempt < 4:
                        time.sleep(0.5)

                validated_count += 1
                time.sleep(0.5)

            except Exception as e:
                # Fallback click
                try:
                    validez_button = driver.find_element(By.ID, "extratoolbarValidez")
                    validez_button.click()
                    print_colored(f"      ✓ Validare cu fallback click", Colors.GREEN)
                    time.sleep(1.5)

                    # Check for popup after fallback click
                    popup_found = False
                    for attempt in range(5):
                        try:
                            popup_button = driver.find_element(By.ID, "buttonChooseYes")
                            if popup_button.is_displayed():
                                print_colored(f"      ⚠ Popup imobilizări - apas DA", Colors.YELLOW)
                                driver.execute_script("arguments[0].click();", popup_button)
                                print_colored(f"      ✓ Imobilizare confirmată", Colors.GREEN)
                                time.sleep(2)

                                # ===== PASUL 3 STEP 0: Delete default row =====
                                print_colored(f"      → PASUL 3 STEP 0: Ștergere rând default...", Colors.BLUE)
                                try:
                                    # Apasa butonul Renunt cu ALT+R shortcut
                                    body = driver.find_element(By.TAG_NAME, "body")
                                    body.send_keys(Keys.ALT + 'r')
                                    time.sleep(1)
                                    print_colored(f"      ✓ Rând default șters", Colors.GREEN)
                                except Exception as e:
                                    print_colored(f"      ⚠ Eroare ștergere rând: {str(e)}", Colors.YELLOW)

                                time.sleep(1)

                                # ===== PASUL 3 STEP 1: Click Adauga button =====
                                print_colored(f"      → PASUL 3 STEP 1: Adaugare linie nouă...", Colors.BLUE)
                                try:
                                    # Apasa butonul Adauga cu ALT+A shortcut
                                    body = driver.find_element(By.TAG_NAME, "body")
                                    body.send_keys(Keys.ALT + 'a')
                                    time.sleep(1)
                                    print_colored(f"      ✓ Linie nouă adăugată", Colors.GREEN)
                                except Exception as e:
                                    print_colored(f"      ⚠ Eroare adaugare linie: {str(e)}", Colors.YELLOW)

                                time.sleep(1)
                                popup_found = True

                                # ===== PASUL 3: REGISTRARE IMOBILIZARI =====
                                if PASUL3_AVAILABLE:
                                    try:
                                        print_colored(f"      → PASUL 3: Citire imobilizari din Excel (invoice: {invoice_num})...", Colors.BLUE)

                                        # STEP 1: Load Excel and match assets
                                        doc_number, asset_count, assets, errors = pasul3_step1(driver, invoice_num)

                                        if errors:
                                            print_colored(f"      ⚠ Erori la procesare ({invoice_num}):", Colors.YELLOW)
                                            for error in errors:
                                                print_colored(f"         - {error}", Colors.YELLOW)
                                                pasul3_errors.append(f"{invoice_num}: {error}")

                                        if asset_count > 0:
                                            print_colored(f"      ✓ Gasite {asset_count} imobilizari pentru doc {doc_number}", Colors.GREEN)
                                            pasul3_success += 1

                                            # ===== PASUL 3 STEP 2: Delete default asset row =====
                                            print_colored(f"      → PASUL 3 STEP 2: Ștergere rând default...", Colors.BLUE)
                                            try:
                                                success, message = pasul3_step2(driver, debug=False)
                                                if success:
                                                    print_colored(f"      ✓ {message}", Colors.GREEN)
                                                else:
                                                    print_colored(f"      ❌ {message}", Colors.RED)
                                                    pasul3_errors.append(f"{invoice_num}: STEP 2 - {message}")
                                            except Exception as e:
                                                print_colored(f"      ❌ Eroare STEP 2: {str(e)}", Colors.RED)
                                                pasul3_errors.append(f"{invoice_num}: STEP 2 - {str(e)}")

                                            # ===== PASUL 3 STEP 3: Complete form fields with Excel data =====
                                            print_colored(f"      → PASUL 3 STEP 3: Completare câmpuri cu date Excel...", Colors.BLUE)
                                            try:
                                                if assets and len(assets) > 0:
                                                    asset = assets[0]
                                                    nr_inv = asset.get('Nr. inv.', '')

                                                    if nr_inv:
                                                        # Fill Nr. inv. field
                                                        nr_inv_field = driver.find_element(By.ID, "inputBox_NrInv_Imobilizari")
                                                        nr_inv_field.clear()
                                                        nr_inv_field.send_keys(nr_inv)
                                                        time.sleep(0.5)
                                                        print_colored(f"      ✓ Nr. inv. completat: {nr_inv}", Colors.GREEN)
                                                    else:
                                                        print_colored(f"      ⚠ Nr. inv. lipsa din Excel", Colors.YELLOW)
                                                else:
                                                    print_colored(f"      ⚠ Nu exista date de completat", Colors.YELLOW)
                                            except Exception as e:
                                                print_colored(f"      ⚠ Eroare completare câmpuri: {str(e)}", Colors.YELLOW)
                                        else:
                                            print_colored(f"      ⚠ Nu gasit imobilizari pentru doc {doc_number}", Colors.YELLOW)
                                            pasul3_errors.append(f"{invoice_num}: Nu gasit imobilizari pentru {doc_number}")

                                    except Exception as e:
                                        print_colored(f"      ❌ Eroare PASUL 3: {str(e)}", Colors.RED)
                                        pasul3_errors.append(f"{invoice_num}: Eroare sistem - {str(e)}")

                                break
                        except:
                            pass
                        if attempt < 4:
                            time.sleep(0.5)

                    validated_count += 1
                    time.sleep(0.5)
                except:
                    print_colored(f"      ❌ Nu s-a putut apasa Validez", Colors.RED)
                    time.sleep(1)

        except Exception as e:
            print_colored(f"\n   ❌ Eroare rând {row_idx}: {str(e)}", Colors.RED)
            continue

    print_colored(f"\n   ✓ Parcurgere completă - {current_position - 1} procesate", Colors.GREEN)

    # Count remaining validated invoices for summary
    all_rows = driver.find_elements(By.XPATH, "//tr[contains(@class, 'rowSelectable_Intrari')]")

    # Count only rows with actual invoice numbers (non-empty)
    total_invoices = 0
    already_validated = 0

    for row in all_rows:
        try:
            invoice_num = row.find_element(By.XPATH, ".//span[@class='rowFieldText rowFieldText_NrDoc']").text
            if invoice_num and invoice_num.strip() != "":
                total_invoices += 1
                # Check if this row is validated (has fa-lock)
                try:
                    row.find_element(By.XPATH, ".//i[contains(@class, 'fa-lock')]")
                    already_validated += 1
                except:
                    pass
        except:
            pass

    # Summary
    print_colored("\n" + "="*70, Colors.CYAN)
    print_colored("REZUMAT VALIDARE", Colors.CYAN)
    print_colored("="*70, Colors.CYAN)
    print_colored(f"Total facturi: {total_invoices}", Colors.BLUE)
    print_colored(f"Validate in aceasta rulare: {validated_count}", Colors.GREEN)
    print_colored(f"Total validate (včetane anterioare): {already_validated}", Colors.YELLOW)
    print_colored(f"Nevalidate ramase: {total_invoices - already_validated}", Colors.RED)

    # PASUL 3 Summary
    if PASUL3_AVAILABLE:
        print_colored("\n" + "="*70, Colors.CYAN)
        print_colored("REZUMAT PASUL 3 - IMOBILIZARI", Colors.CYAN)
        print_colored("="*70, Colors.CYAN)
        print_colored(f"Facturi cu imobilizari procesate: {pasul3_success}", Colors.GREEN)

        if pasul3_errors:
            print_colored(f"Erori encontered: {len(pasul3_errors)}", Colors.RED)
            print_colored("\nDetanii erori:", Colors.YELLOW)
            for error in pasul3_errors:
                print_colored(f"  ❌ {error}", Colors.RED)
        else:
            print_colored("Niciun error in PASUL 3", Colors.GREEN)

    print_colored("\n" + "="*70, Colors.CYAN)
    print_colored("✅ VALIDARE MASIVA COMPLETĂ", Colors.GREEN)
    print_colored("="*70, Colors.CYAN)

    print_colored("\nBrowser rămâne deschis pentru rulari ulterioare", Colors.YELLOW)
    input("\nApasă Enter pentru a inchide aceasta consola (Chrome ramane deschis)...")
    # Nu apelam driver.quit() - Chrome ramane deschis pentru alte scripturi

except Exception as e:
    print_colored(f"\n❌ ERROR: {str(e)}", Colors.RED)
    import traceback
    traceback.print_exc()
    sys.exit(1)
