import cz.orcz.orfmodel.CKonstrKusHlavWsImp;
import cz.orcz.orfmodel.CPolozka;
import cz.orcz.orfmodel.CKonstrKusKompImp;
import cz.orcz.orfmodel.Axz;
import cz.orcz.mskws.ws.KonstrKusImport;
import javax.xml.bind.*;
import javax.xml.bind.annotation.*;
import javax.xml.transform.stream.StreamSource;
import java.io.File;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import cz.ortex.util.o0.O0Session;
import javax.swing.JOptionPane;
import org.hibernate.Session;
import org.hibernate.Transaction;
import static cz.ortex.implutil.o0.HibernateUtil.getSessionFactory;
import java.io.FileOutputStream;
import java.io.PrintStream;
import cz.ortex.implutil.o0.O0CfgSrv;
import cz.ortex.implutil.o0.O0CfgSrvPar;
import cz.ortex.impldao.o0.admin.O0logDaoImpl;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import cz.ortex.impllogic.o0.task.O0taskDemonUtil;
import cz.ortex.impllogic.o0.task.OxSpustDavTaskRun;
 
protected static void autoImport(String urlCesta, O0Session o0Session, Axz axz) {
CKonstrKusKompImp lastKusKompImp;
int lastLevel;
 
       try {
 
 
	        //Adresář protokolu obecný
	       String adrProtokol = O0CfgSrv.get(O0CfgSrvPar.ADR_PROTOKOLY);  	
 
            // Zadejte cestu k souboru, kam chcete přesměrovat výstup
            String soubor = adrProtokol + "axz_"+axz.axzId+".log";
            axz.axzHlaseni = soubor;
            // Vytvořte nový výstupní proud pro soubor
            FileOutputStream fileOutputStream = new FileOutputStream(soubor);
 
            // Vytvořte PrintStream pro nový výstupní proud
            PrintStream printStream = new PrintStream(fileOutputStream);
 
            // Uložte stávající System.out do záložního PrintStreamu
            PrintStream systemOutBackup = System.out;
 
            // Nastavte nový PrintStream jako System.out
            System.setOut(printStream);
 
            // Nyní vše, co je vypsáno na System.out, bude přesměrováno do souboru
 
            // Vytvoření JAXB kontextu pro CKonstrKusHlavWsImp a CKonstrKusKompImp třídy
            JAXBContext context = JAXBContext.newInstance(CKonstrKusHlavWsImp.class, CKonstrKusKompImp.class,SearchResults.class,SearchObject.class);
 
            // Vytvoření unmarshalleru
            Unmarshaller unmarshaller = context.createUnmarshaller();
 
            // Nastavení validace XML (volitelné)
            unmarshaller.setSchema(null); // null znamená, že se validace neprovádí
 
            // Načtení XML ze souboru
            File xmlFile = new File(urlCesta);
            JAXBElement<SearchResults> rootElement = unmarshaller.unmarshal(new StreamSource(xmlFile), SearchResults.class);
 
            // Získání načtených dat
            SearchResults searchResults = rootElement.getValue();
            List<SearchObject> objects = searchResults.getObjects();
 
            // Vytvoření seznamu CKonstrKusHlavWsImp objektů
            List<CKonstrKusHlavWsImp> kusHlavImpList = new ArrayList<>();
            //JOptionPane.showMessageDialog(null,  "CKonstrKusHlavWsImp: zacatek");
            // Mapa pro uchování předchozích úrovní
            Map<Integer, CKonstrKusHlavWsImp> previousLevels = new HashMap<>();
            Session s2 = getSessionFactory().getCurrentSession();//udelam novou
 
            String autor = o0Session.getLoginName();
            // Procházení načtených objektů
            for (SearchObject searchObject : objects) {
                List<String> attributes = searchObject.getAttributes();
                int level = Integer.parseInt(attributes.get(0));
 
                if (level == 0) {
                    CKonstrKusHlavWsImp kusHlavImp = new CKonstrKusHlavWsImp();
                    kusHlavImp.setIdentPol(attributes.get(2));
                    kusHlavImp.setIdCSyst(String.valueOf(level));
                    kusHlavImp.setVykres(attributes.get(2));                        
                    kusHlavImp.setNazev(attributes.get(3));                     
                    kusHlavImp.setStatus((short) 200);
                    kusHlavImp.setEdat(new Date());
                    kusHlavImp.setEname(autor);
                    kusHlavImp.setRevize("00");
                    CPolozka cPolozka=s2.get(CPolozka.class,kusHlavImp.getIdentPol());
                    if (cPolozka != null){
                     kusHlavImp.setTypPol(cPolozka.getBs());
                    } else {
                     kusHlavImp.setTypPol((short) 0);                    	                    
                    }
                    kusHlavImpList.add(kusHlavImp);
 
                    // Přidání CKonstrKusHlavWsImp do mapy předchozích úrovní
                    previousLevels.put(level, kusHlavImp);
                } else {
                    CKonstrKusHlavWsImp parentHlavImp = previousLevels.get(level - 1);
                    if (parentHlavImp == null) {
                     CKonstrKusHlavWsImp kusHlavImp = new CKonstrKusHlavWsImp();
                     kusHlavImp.setIdentPol(lastKusKompImp.getIdentPol());                     
                     kusHlavImp.setVykres(lastKusKompImp.getIdentPol());                     
                     kusHlavImp.setNazev(lastKusKompImp.getNazev());                     
                     previousLevels.put(level - 1, kusHlavImp);                      
                     kusHlavImp.setIdCSyst(String.valueOf(level - 1));                     
                     kusHlavImpList.add(kusHlavImp);
                     kusHlavImp.setStatus((short) 200);
                     kusHlavImp.setEdat(new Date());
                     kusHlavImp.setEname(autor);
 
                     kusHlavImp.setRevize("00");
                     CPolozka cPolozka=s2.get(CPolozka.class,kusHlavImp.getIdentPol());
                     if (cPolozka != null){
                      kusHlavImp.setTypPol(cPolozka.getBs());
                     } else {
                      kusHlavImp.setTypPol((short) 0);                    	                    
                     }
 
                     parentHlavImp = previousLevels.get(level - 1);
                    }
                    if (parentHlavImp != null) {
                        CKonstrKusKompImp kusKompImp = new CKonstrKusKompImp();
                        kusKompImp.setIdentPol(attributes.get(2));                                                
                        kusKompImp.setIdCSyst(attributes.get(2));                                                
                        kusKompImp.setVykres(attributes.get(2));                                                
                        kusKompImp.setNazev(attributes.get(3));                                                
                        kusKompImp.setMnoz(new BigDecimal(attributes.get(1)));
                        kusKompImp.setcKonstrKusHlavImp(parentHlavImp);
                        parentHlavImp.getcKonstrKusKompImps().add(kusKompImp);
                        if (lastLevel > level){
                         previousLevels.remove(level);
                        }
                        kusKompImp.setRevize("00");
                        CPolozka cPolozka=s2.get(CPolozka.class,kusKompImp.getIdentPol());
                        if (cPolozka != null){
                         kusKompImp.setTypPol(cPolozka.getBs());
                        } else {
                         kusKompImp.setTypPol((short) 0);                    	                    
                        }
                        kusKompImp.setEdat(new Date());
                        kusKompImp.setEname(autor);
 
                        lastKusKompImp=kusKompImp;
                        lastLevel=level;
                    }
                    else{
                    }
                }
            }
 
            // Výpis naimportovaných dat
            for (CKonstrKusHlavWsImp kusHlavImp : kusHlavImpList) {
                System.out.println("CKonstrKusHlavWsImp: identPol=" + kusHlavImp.getIdentPol() + "level "+kusHlavImp.getIdCSyst());
                for (CKonstrKusKompImp kusKompImp : kusHlavImp.getcKonstrKusKompImps()) {
                    System.out.println("  CKonstrKusKompImp: identPol=" + kusKompImp.getIdentPol() + ", mnozstvi=" + kusKompImp.getMnoz());                    
                }
                     //JOptionPane.showMessageDialog(null,  "CKonstrKusHlavWsImp: identPol=" + kusHlavImp.getIdentPol() + "level "+kusHlavImp.getIdCSyst());
                     Session s = getSessionFactory().openSession();//udelam novou
                     Transaction tx = s.getTransaction();      
                     tx.begin();
                     s.save(kusHlavImp);     
                     s.update(axz);   
 
                     tx.commit();
                     KonstrKusImport i = new KonstrKusImport(o0Session);
                     i.transformuj(kusHlavImp);
 
            }
           // Obnovte původní System.out
            System.setOut(systemOutBackup);
 
            // Zavřete souborový výstup
            printStream.close();
            String obsahLogu = new String(Files.readAllBytes(Paths.get(axz.axzHlaseni)));
            O0logDaoImpl o0logDaoImpl; 
            o0logDaoImpl = new O0logDaoImpl();
            o0logDaoImpl.setOrsoftSession(o0Session);
            Character v='V';
            Character g='G';
            try {
            o0logDaoImpl.zapisLog("WINDCHILL axz:"+axz.axzId, obsahLogu, null, null, null, null, null, null, null, v,g);		            
            } catch (Exception e){
            	//JOptionPane.showMessageDialog(null,  e.getMessage());
            	System.out.println("  vyjimka " + e.getMessage());
            }
           try { 
            if (O0taskDemonUtil.getOrsoftSessionRun() != null) {
              OxSpustDavTaskRun.zapisVysledek(obsahLogu);           
            }  
           } catch (Exception e){
            	//JOptionPane.showMessageDialog(null,  e.getMessage());
            	System.out.println("  vyjimka " + e.getMessage());
            }
 
 
 
        } catch (JAXBException e) {
            e.printStackTrace();
        }
 
 
}   
 
@XmlRootElement(name = "SearchResults")
@XmlAccessorType(XmlAccessType.FIELD)
public class SearchResults {
    @XmlElement(name = "Object")
    private List<SearchObject> objects;
 
    // Gettery a settery pro objects
 
    public List<SearchObject> getObjects() {
        return objects;
    }
 
    public void setObjects(List<SearchObject> objects) {
        this.objects = objects;
    }
}
@XmlAccessorType(XmlAccessType.FIELD)
public class SearchObject {
    @XmlElement(name = "Attribute")
    private List<String> attributes;
 
    // Gettery a settery pro attributes
 
    public List<String> getAttributes() {
        return attributes;
    }
 
    public void setAttributes(List<String> attributes) {
        this.attributes = attributes;
    }
}