package main

import (
	"encoding/xml"
	"fmt"
	"io"
	"os"
	"strings"
	"sync"
	"time"
)

func From_Backup() XmlBkp {
	//open the bkp.xml file
	xmlFile, err := os.Open("bkp.xml")
	if err != nil {
		fmt.Println(err)
	}
	defer xmlFile.Close()

	byteValue, err := io.ReadAll(xmlFile)
	if err != nil {
		fmt.Println(err)
	}
	var miogest XmlBkp
	xml.Unmarshal(byteValue, &miogest)
	return miogest

}

func ParseUpdateBkp() AnnunciParsed {

	miogest := From_Backup()

	var AnnunciArray AnnunciParsed
	extractedData := make(chan AnnuncioParsed)
	defaultCaratteristiche := Miogest.GetCaratteristiche()
	defaultCategorie := Miogest.GetCategorie()

	var wg sync.WaitGroup
	wg.Add(len(miogest.Annunci.Record))

	for i := 0; i < len(miogest.Annunci.Record); i++ {
		go func(i int) {
			defer wg.Done()
			extractData_bkp(miogest.Annunci.Record[i], extractedData, defaultCaratteristiche, defaultCategorie)
		}(i)
	}

	go func() {
		wg.Wait()
		close(extractedData)
	}()

	for result := range extractedData {
		AnnunciArray.Annuncio = append(AnnunciArray.Annuncio, result)
	}

	return AnnunciArray
}

func extractData_bkp(annuncio AnnuncioBKP, extractedData chan AnnuncioParsed, defaultCaratteristiche ListaCaratteristiche, defaultCategorie []Categoria) {

	var tmp AnnuncioParsed = AnnuncioParsed{}

	codice := RemoveWhitespace(GetStringValue(annuncio.Codice))
	tmp.Codice = codice
	tmp.Email = nil
	if annuncio.Proprietario != nil && annuncio.Proprietario.Cliente != nil && annuncio.Proprietario.Cliente.Nome != nil {
		tmp.Locatore = annuncio.Proprietario.Cliente.Nome
	}
	tmp.Numero = nil
	if annuncio.Proprietario != nil && annuncio.Proprietario.Cliente != nil && annuncio.Proprietario.Cliente.Nome != nil {
		tmp.Idlocatore = annuncio.Proprietario.Cliente.ID
	}

	upperIndirizzo := MakeUppercase(GetStringValue(annuncio.Indirizzo))
	tmp.Indirizzo = &upperIndirizzo
	tmp.Civico = annuncio.Civico
	upperComune := MakeUppercase(GetStringValue(annuncio.Comune))
	tmp.Comune = &upperComune
	tmp.Cap = annuncio.Cap
	tmp.Provincia = annuncio.Provincia
	tmp.Regione = annuncio.Regione
	tmp.Lat = CommaToDot(annuncio.Lat)
	tmp.Lon = CommaToDot(annuncio.Lon)
	tmp.Indirizzo_secondario = nil
	tmp.Civico_secondario = nil
	tmp.Lat_secondario = nil
	tmp.Lon_secondario = nil

	var tipo = tipologiaParser(*annuncio.Tipo)
	tmp.Tipo = &tipo

	tmpanno := GetStringValue(annuncio.Anno)
	if tmpanno != "0" && tmpanno != "" {
		tmp.Anno = &tmpanno
	}
	tmp.Prezzo = prezzoParse(annuncio.Prezzo)
	tmp.Consegna = parseConsegna(annuncio.Consegna)
	tmp.Classe = annuncio.Classe

	if annuncio.Categorie != nil && annuncio.Categorie.Categoria != nil {
		resultArray := make([]string, 0)
		cats := *annuncio.Categorie.Categoria
		for _, cat := range cats {
			for _, catdef := range defaultCategorie {
				if cat.ID == catdef.Id {
					resultArray = append(resultArray, catdef.Nome)
				}
			}
		}
		if tmp.Categorie == nil {
			tmp.Categorie = &[]string{}
		}
		*tmp.Categorie = resultArray
	}

	tmp.Mq = CommaToDot(annuncio.Mq)
	tmp.Piano = annuncio.Piano
	tmp.Piano_palazzo = annuncio.PianoPalazzo
	tmp.Unita_condominio = annuncio.UnitaImmobiliari
	tmp.Numero_vani = annuncio.NumeroVani
	tmp.Numero_camere = annuncio.NumeroCamere
	tmp.Numero_bagni = annuncio.NumeroBagni
	tmp.Numero_balconi = annuncio.NumeroBalconi
	tmp.Numero_terrazzi = annuncio.NumeroTerrazzi
	tmp.Numero_box = annuncio.NumeroBox
	tmp.Numero_postiauto = annuncio.NumeroPostiauto
	tmpstato := GetStringValue(annuncio.Stato)
	var tmpstatoString string
	if tmpstato == "1" {
		tmpstatoString = "Attivo"
	}
	if tmpstato == "2" {
		tmpstatoString = "Trattativa"
	} else {
		tmpstatoString = "Sospeso"
	}
	tmp.Stato = &tmpstatoString
	home := false
	tmp.Homepage = &home

	layout := "20060102150405"
	if annuncio.Inserito != nil {
		t, err := time.Parse(layout, *annuncio.Inserito)
		if err != nil {
			tmp.Creato_il = nil
		} else {
			tmp.Creato_il = &t
		}
	}

	tmp.Modificato_il = nil

	var itlingua string = "it"
	var enlingua string = "en"
	var tmpTitoloIt *string = nil
	var tmpTitoloEn *string = nil
	var tmpDescIt *string = nil
	var tmpDescEn *string = nil

	if annuncio.Descrizioni != nil {
		for _, desc := range *annuncio.Descrizioni.Descrizione {

			if desc.Lingua != nil {
				if *desc.Lingua == itlingua {
					tmpTitoloIt = desc.Titolo
					tmpDescIt = desc.Testo
				}
				if *desc.Lingua == enlingua {
					tmpTitoloEn = desc.Titolo
					tmpDescEn = desc.Testo
				}
			}

		}
	}

	tmp.Titolo_it = tmpTitoloIt
	tmp.Titolo_en = tmpTitoloEn
	tmp.Desc_it = tmpDescIt
	tmp.Desc_en = tmpDescEn
	w := false
	tmp.Web = &w

	tmp.Url_video = nil

	if annuncio.Accessori != nil && annuncio.Accessori.Accessorio != nil {
		tmpAcc := make([]string, 0)
		for _, acc := range *annuncio.Accessori.Accessorio {
			if acc.Nome != nil {
				tmpAcc = append(tmpAcc, *acc.Nome)
			}
		}
		if tmp.Accessori == nil {
			tmp.Accessori = &[]string{}
		}
		*tmp.Accessori = tmpAcc
	}

	tmpCaratteristiche := make(map[string]interface{})

	if annuncio.Schede != nil && annuncio.Schede.Scheda != nil {
		for _, scheda := range *annuncio.Schede.Scheda {
			if scheda.Valore != nil {
				var cossriponding_name *string = nil
				for _, def := range defaultCaratteristiche.Caratteristiche {
					if scheda.ID == def.Id {
						cossriponding_name = &def.Tagxml
					}
				}
				if cossriponding_name != nil {
					tmpCaratteristiche[*cossriponding_name] = *scheda.Valore
				}
			}
		}
	}

	for _, def := range defaultCaratteristiche.Caratteristiche {

		if _, ok := tmpCaratteristiche[def.Tagxml]; !ok {
			tmpCaratteristiche[def.Tagxml] = nil
		}

	}
	tmp.Caratteristiche = &tmpCaratteristiche

	tmp.Url_foto = nil
	tmp.Url_video = nil

	extractedData <- tmp

}

func TestTipologieBkp() {

	bkp := From_Backup()
	var tipologie []string
	for _, r := range bkp.Annunci.Record {
		if r.Tipo != nil {
			if !contains(tipologie, *r.Tipo) {
				tipologie = append(tipologie, *r.Tipo)
			}
		}
	}
	fmt.Println(strings.Join(tipologie, ","))

}

func tipologiaParser(tipo string) string {
	var result string
	switch tipo {
	case "Affitto Residenziale", "Affitto Turistico":
		result = "Transitorio"
	case "Vendita Residenziale", "Vendita Commerciale":
		result = "Vendita"
	case "Affitto Commerciale", "Affitto":
		result = "Stabile"
	case "Cessione Commerciale", "Cessione":
		result = "Cessione"
	default:
		result = "Errore"
	}
	return result
}
