from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import Select
import time
import json
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.edge.service import Service as EdgeService
from webdriver_manager.microsoft import EdgeChromiumDriverManager

def naviga_e_scarica_fatture(parametri):
    driver = None
    try:
        # Usa Microsoft Edge
        driver = webdriver.Edge(service=EdgeService(EdgeChromiumDriverManager().install()))

        driver.delete_all_cookies() # Pulisce i cookie prima di iniziare

        driver.get(parametri["url_login"])
        print(f"Navigazione alla pagina di login: {parametri['url_login']}")

        # Autenticazione
        fisconline_entratel_tab = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@href='#tab-4']")))
        fisconline_entratel_tab.click()
        print("Cliccato tab Fisconline/Entratel.")
        with open("credenziali_ade.json", "r") as f:
            credenziali = json.load(f)

        username_input = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "username-fo-ent")))
        username_input.send_keys(credenziali["username"])
        username_input.send_keys(Keys.TAB)
        print(f"Username inserito: {credenziali['username']}")

        password_input = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "password-fo-ent")))
        password_input.send_keys(credenziali["password"])
        password_input.send_keys(Keys.TAB)
        password_input.send_keys(Keys.TAB)
        print("Password inserita.")

        pin_input = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "pin-fo-ent")))
        pin_input.send_keys(credenziali["pin"])
        print("PIN inserito.")

        time.sleep(2)
        # Clicca il pulsante "Accedi" tramite form
        form = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//form[@action='/sam/UI/Login?realm=/agenziaentrate&service=pin']")))
        form.submit()
        print("Pulsante 'Accedi' cliccato.")

        print("Login effettuato con successo. Attesa input manuale...")
        input("Premi Invio per continuare dopo aver selezionato l'utenza manualmente...")

        # Naviga alla pagina "Cambia Utenza"
        driver.get("https://portale.agenziaentrate.gov.it/PortaleWeb/cambiautenza")
        print("Navigazione alla pagina 'Cambia Utenza'.")

        # Selezione utenza
        codice_fiscale_presente = False
        for _ in range(5): # Prova 5 volte con attesa
            if parametri["codice_fiscale_referente"] in driver.page_source:
                codice_fiscale_presente = True
                break
            time.sleep(2) # Attendi 2 secondi prima di riprovare

        if not codice_fiscale_presente:
            print(f"Errore: codice fiscale '{parametri['codice_fiscale_referente']}' non trovato nella pagina.")
            return False

        print(f"Codice fiscale '{parametri['codice_fiscale_referente']}' trovato nella pagina.")

        # Verifica pagina pronta
        if not verifica_pagina_pronta(driver, parametri["codice_fiscale_referente"], parametri["codice_fiscale_condominio"]):
            return False

        # Verifica se l'elemento select utenza è presente
        try:
            utente_select = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "utenza")))
            print("Elemento select utenza trovato.")
        except Exception as e:
            print(f"Errore: l'elemento select utenza non è presente: {e}")
            return False

        # Verifica che il codice fiscale sia presente nel testo dell'elemento user-info-data-container
        try:
            user_info_data_container = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "user-info-data-container")))
            if parametri["codice_fiscale_referente"] not in user_info_data_container.text:
                print(f"Errore: codice fiscale '{parametri['codice_fiscale_referente']}' non trovato nel container user-info-data.")
                return False
            print(f"Codice fiscale '{parametri['codice_fiscale_referente']}' trovato nel container user-info-data.")

            # Verifica la presenza del codice fiscale del condominio
            if parametri["codice_fiscale_condominio"] not in user_info_data_container.text:
                print(f"Errore: codice fiscale condominio '{parametri['codice_fiscale_condominio']}' non trovato nel container user-info-data.")
                return False
            print(f"Codice fiscale condominio '{parametri['codice_fiscale_condominio']}' trovato nel container user-info-data.")
        except Exception as e:
            print(f"Errore durante la verifica del codice fiscale nel container user-info-data: {e}")
            return False

        # Selezione utenza con attesa maggiore e verifica della selezionabilità
        try:
            # Prova con Select class
            utente_select = Select(WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.ID, "utenza"))))
            utente_select.select_by_value(parametri["codice_fiscale_referente"])
            print(f"Utenza '{parametri['codice_fiscale_referente']}' selezionata con Select class.")
        except Exception as e:
            print(f"Errore durante la selezione con Select class: {e}")
            try:
                # Prova con JavaScript
                driver.execute_script(f"document.getElementById('utenza').value = '{parametri['codice_fiscale_referente']}';")
                print(f"Utenza '{parametri['codice_fiscale_referente']}' selezionata con JavaScript.")
                time.sleep(2)  # Aggiungi un'attesa di 2 secondi
            except Exception as js_e:
                print(f"Errore durante la selezione con JavaScript: {js_e}")
                return False

        # Attesa intervento manuale
        input("Conferma manualmente il cambio di utenza e premi Invio...")

        # Naviga alla sezione fatture
        driver.get("https://portale.agenziaentrate.gov.it/PortaleWeb/servizi/accessoFatturazione")
        print("Navigazione alla sezione fatture.")

        # Verifica della sessione dopo l'intervento manuale
        try:
            WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.XPATH, "//a[@href='/FattureWeb/fatture/elenco']")))
            print("Sessione verificata dopo l'intervento manuale.")
        except Exception as e:
            print(f"Errore: Sessione non valida dopo l'intervento manuale: {e}")
            return False

        # Navigazione alla pagina delle fatture
        fatturazione_link = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@href='/PortaleWeb/servizi/accessoFatturazione']")))
        print("link fatturazione elettronica trovato.")
        fatturazione_link.click()
        print("Accesso a 'Fatturazione elettronica'.")
        time.sleep(2)

        fatture_elettroniche_link = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@href='/FattureWeb/fatture/elenco']")))
        print("link fatture elettroniche trovato.")
        fatture_elettroniche_link.click()
        print("Accesso a 'Fatture Elettroniche'.")
        time.sleep(2)

        # A questo punto, dovremmo essere nella pagina delle fatture
        print("Sei nella pagina delle fatture. Procedi manualmente con il download o dammi i riferimenti per automatizzare.")

        input("Premi invio per terminare")

        return True

    except Exception as e:
        print(f"Errore: {e}")
        return False

    finally:
        if driver:
            driver.quit()

def verifica_pagina_pronta(driver, codice_fiscale, codice_fiscale_condominio):
    try:
        # Verifica la presenza e la visibilità dell'elemento user-collapse
        user_collapse_element = WebDriverWait(driver, 10).until(
            EC.visibility_of_element_located((By.ID, "user-collapse"))
        )
        print("Elemento user-collapse visibile.")

        # Verifica la presenza del codice fiscale
        codice_fiscale_element = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.XPATH, f"//p[contains(text(), '{codice_fiscale}')]"))
        )
        print(f"Codice fiscale '{codice_fiscale}' trovato.")

        # verifica la presenza del link cambia utenza.
        cambia_utenza_link = WebDriverWait(driver, 10).until(
            EC.element_to_be_clickable((By.XPATH, "//a[@href='/PortaleWeb/cambiautenza']"))
        )
        print("link cambia utenza trovato.")

        return True

    except Exception as e:
        print(f"Errore: {e}")
        return False

# Leggi i parametri dal file JSON
with open("parametri_fatture.json", "r") as f:
    parametri = json.load(f)

if naviga_e_scarica_fatture(parametri):
    print("Procedura completata.")
else:
    print("Procedura fallita.")