package portais

import (
	"strings"

	"gitlab.com/sistema-pro/xmlcolibex/internal/regras"
)

type MetaPortal struct {
	NomeModelo   string
	FormatoFotos regras.FormatoFotos
	NomeExibicao string
}

var (
	metaVivaReal = MetaPortal{NomeModelo: "vivareal", FormatoFotos: regras.FormatoVivareal, NomeExibicao: "VivaReal"}
	metaZap      = MetaPortal{NomeModelo: "zap", FormatoFotos: regras.FormatoZap, NomeExibicao: "Zap"}
	metaImovelWeb = MetaPortal{NomeModelo: "imovelweb", FormatoFotos: regras.FormatoImovelWeb, NomeExibicao: "ImovelWeb"}
	metaGuiaABC  = MetaPortal{NomeModelo: "guiadeimoveisabc", FormatoFotos: regras.FormatoImovelWeb, NomeExibicao: "GuiaImoveisABC"}
	metaSaoRoque = MetaPortal{NomeModelo: "portalsaoroque", FormatoFotos: regras.FormatoVivareal, NomeExibicao: "PortalSaoRoque"}
	metaML       = MetaPortal{NomeModelo: "mercadolivre", FormatoFotos: regras.FormatoMercadoLivre, NomeExibicao: "MercadoLivre"}
	metaCRECI    = MetaPortal{NomeModelo: "creci_new", FormatoFotos: regras.FormatoZap, NomeExibicao: "CRECI"}
	meta123i     = MetaPortal{NomeModelo: "portal123i", FormatoFotos: regras.FormatoImovelWeb, NomeExibicao: "Portal123i"}
	metaABC      = MetaPortal{NomeModelo: "abcimovel", FormatoFotos: regras.FormatoAbc, NomeExibicao: "AbcImovel"}
	metaOLX      = MetaPortal{NomeModelo: "olx", FormatoFotos: regras.FormatoOLX, NomeExibicao: "OLX"}
	metaZL       = MetaPortal{NomeModelo: "zlimoveis", FormatoFotos: regras.FormatoAbc, NomeExibicao: "ZLImoveis"}
	metaDream    = MetaPortal{NomeModelo: "dreancasa", FormatoFotos: regras.FormatoVivareal, NomeExibicao: "DreanCasa"}
	metaChave    = MetaPortal{NomeModelo: "chavenamao", FormatoFotos: regras.FormatoVivareal, NomeExibicao: "ChaveNaMao"}
	metaCasaMin  = MetaPortal{NomeModelo: "casamineira", FormatoFotos: regras.FormatoImovelWeb, NomeExibicao: "CasaMineira"}
	metaFacebook = MetaPortal{NomeModelo: "facebook", FormatoFotos: regras.FormatoVivareal, NomeExibicao: "Facebook"}
	metaGuide    = MetaPortal{NomeModelo: "guide", FormatoFotos: regras.FormatoVivareal, NomeExibicao: "Guide"}
	metaIW47     = MetaPortal{NomeModelo: "imovelweb_novo", FormatoFotos: regras.FormatoVivareal, NomeExibicao: "ImovelWebNovo"}
	metaBuskaza  = MetaPortal{NomeModelo: "buskaza", FormatoFotos: regras.FormatoZap, NomeExibicao: "Buskaza"}
)

// Registro mapeia id_portal conhecidos (xml_portais) para modelo/template.
var Registro = map[int]MetaPortal{
	1:  metaVivaReal,
	2:  metaZap,
	3:  metaImovelWeb,
	5:  metaGuiaABC,
	6:  metaGuiaABC,
	7:  metaGuiaABC,
	8:  metaGuiaABC,
	9:  metaGuiaABC,
	10: metaGuiaABC,
	11: metaGuiaABC,
	12: metaGuiaABC,
	13: metaSaoRoque,
	14: metaML,
	15: metaCRECI,
	17: metaVivaReal, // Moving — sem template próprio
	18: meta123i,
	19: metaABC,
	25: metaOLX,
	27: metaZL,
	28: metaVivaReal, // Imóvel & Cia
	29: metaDream,
	31: metaVivaReal, // Casafy
	32: metaChave,
	33: metaCasaMin,
	34: metaZL, // ZN imóvel — mesmo layout ZL
	35: metaVivaReal, // Atrria
	36: metaVivaReal, // 321 Achei
	37: metaVivaReal, // Homer
	38: metaVivaReal, // Arbo
	39: metaVivaReal, // não catalogado — fallback VRSync
	40: metaVivaReal, // Lugar certo
	41: metaVivaReal, // Ivera
	45: metaFacebook,
	46: metaGuide,
	47: metaIW47,
	48: metaBuskaza,
	49: metaVivaReal,
	50: metaVivaReal,
	51: metaVivaReal,
	52: metaVivaReal,
	53: metaVivaReal,
	54: metaVivaReal,
}

var registroPorSEO = map[string]MetaPortal{
	"vivareal":            metaVivaReal,
	"zap":                 metaZap,
	"imovelweb":           metaImovelWeb,
	"guiadeimoveisabc":    metaGuiaABC,
	"guiadeimoveisat":     metaGuiaABC,
	"guiadeimoveisosasco": metaGuiaABC,
	"guiadeimoveiscampinas": metaGuiaABC,
	"guiadeimoveissp":     metaGuiaABC,
	"guiadeimoveislitoral": metaGuiaABC,
	"guiadeimoveisguarulhos": metaGuiaABC,
	"guiadeimoveissorocaba": metaGuiaABC,
	"portalsaoroque":      metaSaoRoque,
	"mercadolivre":        metaML,
	"creci":               metaCRECI,
	"moving":              metaVivaReal,
	"portal_123i":         meta123i,
	"abcimovel":           metaABC,
	"olx":                 metaOLX,
	"portaldeimoveiszl":   metaZL,
	"portaldeimoveiszn":   metaZL,
	"imovelecia":          metaVivaReal,
	"dreancasa":           metaDream,
	"casafy":              metaVivaReal,
	"chavesnamao":         metaChave,
	"casamineira":         metaCasaMin,
	"attria":              metaVivaReal,
	"achei":               metaVivaReal,
	"homer":               metaVivaReal,
	"arbo":                metaVivaReal,
	"lugarcerto":          metaVivaReal,
	"ivera":               metaVivaReal,
	"facebook":            metaFacebook,
	"guide":               metaGuide,
	"imovelwebnovo":        metaIW47,
	"buskaza":             metaBuskaza,
}

// ResolverMetaPortal escolhe template e formato de fotos para o feed.
// Ordem: id_portal → seo (xml_portais) → prefixo guia/zl → VivaReal.
func ResolverMetaPortal(idPortal int, portalSEO, portalNome string) MetaPortal {
	var meta MetaPortal
	var ok bool

	if meta, ok = Registro[idPortal]; ok {
		return metaComNome(meta, portalNome)
	}

	seo := normalizarSEO(portalSEO)
	if seo != "" {
		if meta, ok = registroPorSEO[seo]; ok {
			return metaComNome(meta, portalNome)
		}
		if strings.HasPrefix(seo, "guiadeimoveis") {
			return metaComNome(metaGuiaABC, portalNome)
		}
		if strings.HasPrefix(seo, "portaldeimoveisz") {
			return metaComNome(metaZL, portalNome)
		}
	}

	return metaComNome(metaVivaReal, portalNome)
}

func metaComNome(meta MetaPortal, portalNome string) MetaPortal {
	if n := strings.TrimSpace(portalNome); n != "" {
		meta.NomeExibicao = n
	}
	return meta
}

func normalizarSEO(seo string) string {
	s := strings.ToLower(strings.TrimSpace(seo))
	s = strings.ReplaceAll(s, "_", "")
	s = strings.ReplaceAll(s, "-", "")
	return s
}

func NomePortal(id int) string {
	if m, ok := Registro[id]; ok {
		return m.NomeExibicao
	}
	return fmtPortal(id)
}

func fmtPortal(id int) string {
	return "Portal#" + itoa(id)
}

func itoa(n int) string {
	if n == 0 {
		return "0"
	}
	var b [12]byte
	i := len(b)
	for n > 0 {
		i--
		b[i] = byte('0' + n%10)
		n /= 10
	}
	return string(b[i:])
}
