/* global React, Ic, Logo, PROPS, ZONAS, TIPOS, TIPOLOGIAS, PRECOS, eur, WA, useState, useEffect, useMemo, useCallback */
const { useState, useEffect, useMemo, useCallback } = React;

/* Carrega os imóveis a partir da API de gestão (com os imóveis-exemplo como reserva). */
function useProperties(){
  const [props, setProps] = useState(PROPS);
  useEffect(()=>{
    let live = true;
    fetch("/api/properties")
      .then(r=>r.ok?r.json():Promise.reject())
      .then(d=>{ if(live && Array.isArray(d) && d.length) setProps(d); })
      .catch(()=>{});
    return ()=>{ live=false; };
  },[]);
  return props;
}

/* Carrega as definições do site (imagens configuráveis no painel de gestão). */
function useSettings(){
  const [s,setS] = useState({});
  useEffect(()=>{
    let live = true;
    fetch("/api/settings")
      .then(r=>r.ok?r.json():Promise.reject())
      .then(d=>{ if(live && d && typeof d==="object") setS(d); })
      .catch(()=>{});
    return ()=>{ live=false; };
  },[]);
  return s;
}

/* Scroll-reveal: observes [data-reveal] elements and adds .is-in when visible. */
function useScrollReveal(deps){
  useEffect(()=>{
    const els = Array.from(document.querySelectorAll("[data-reveal]:not(.is-in)"));
    if(!("IntersectionObserver" in window)){ els.forEach(el=>el.classList.add("is-in")); return; }
    const io = new IntersectionObserver((entries)=>{
      entries.forEach(e=>{ if(e.isIntersecting){ e.target.classList.add("is-in"); io.unobserve(e.target); } });
    }, { threshold:.12, rootMargin:"0px 0px -8% 0px" });
    els.forEach(el=>io.observe(el));
    return ()=>io.disconnect();
  }, deps);
}

/* ---------- Property Card ---------- */
function Card({ p, onOpen, i=0 }){
  const reservada = p.estado !== "À venda";
  return (
    <article className="card" data-reveal style={{transitionDelay:`${Math.min(i,8)*60}ms`}}>
      <div className="card-media" onClick={()=>onOpen(p)}>
        <img src={p.fotos[0]} alt={p.title} loading="lazy" />
        <span className={"tag"+(reservada?" sold":"")}>{p.estado}</span>
        <span className="photo-count"><Ic.cam/>{p.fotos.length} fotos</span>
      </div>
      <div className="card-body">
        <div className="card-price">{p.preco ? eur(p.preco) : "Sob consulta"}</div>
        <h3 className="card-title">{p.title || p.tipo}</h3>
        <div className="card-loc"><Ic.pin/>{p.zona ? `${p.zona}, Braga` : "Braga"}</div>
        <div className="specs">
          {!!p.quartos && <span className="sp"><Ic.bed/>{p.quartos} quartos</span>}
          {!!p.wc && <span className="sp"><Ic.bath/>{p.wc} WC</span>}
          {!!p.area && <span className="sp"><Ic.area/>{p.area} m²</span>}
        </div>
        <div className="card-cta">
          <button className="btn btn-outline" onClick={()=>onOpen(p)}>Ver detalhes</button>
          <a className="btn btn-wa" href={WA(`Olá Claudia, tenho interesse no imóvel "${p.title || p.tipo}"${p.zona ? ` em ${p.zona}` : ""}${p.preco ? ` (${eur(p.preco)})` : ""}. Pode dar-me mais informações?`)} target="_blank" rel="noopener" aria-label="WhatsApp"><Ic.wa/></a>
        </div>
      </div>
    </article>
  );
}

/* ---------- Modal gallery ---------- */
function Modal({ p, onClose }){
  const [i,setI] = useState(0);
  const n = p.fotos.length;
  const go = useCallback((d)=> setI(v => (v + d + n) % n), [n]);
  useEffect(()=>{
    const k = e => { if(e.key==="Escape") onClose(); if(e.key==="ArrowRight") go(1); if(e.key==="ArrowLeft") go(-1); };
    window.addEventListener("keydown",k);
    document.body.style.overflow="hidden";
    return ()=>{ window.removeEventListener("keydown",k); document.body.style.overflow=""; };
  },[go,onClose]);
  // touch swipe
  const tx = React.useRef(0);
  return (
    <div className="modal-back" onClick={onClose}>
      <div className="modal" onClick={e=>e.stopPropagation()}>
        <div className="modal-gallery"
          onTouchStart={e=>tx.current=e.touches[0].clientX}
          onTouchEnd={e=>{const d=e.changedTouches[0].clientX-tx.current; if(d<-40)go(1); if(d>40)go(-1);}}>
          <img src={p.fotos[i].replace("w=900","w=1200")} alt={p.title}/>
          <button className="modal-close" onClick={onClose} aria-label="Fechar"><Ic.x/></button>
          {n>1 && <>
            <button className="mg-nav prev" onClick={()=>go(-1)} aria-label="Anterior"><Ic.chevL/></button>
            <button className="mg-nav next" onClick={()=>go(1)} aria-label="Seguinte"><Ic.chevR/></button>
            <div className="mg-dots">{p.fotos.map((_,k)=><i key={k} className={k===i?"on":""} onClick={()=>setI(k)}/>)}</div>
          </>}
        </div>
        <div className="modal-body">
          <div className="price">{p.preco ? eur(p.preco) : "Sob consulta"}</div>
          <h3>{p.title || p.tipo}</h3>
          <div className="card-loc" style={{fontSize:16}}><Ic.pin/>{p.zona ? `${p.zona}, Braga` : "Braga"}</div>
          <div className="modal-specs">
            {!!p.quartos && <span className="sp"><Ic.bed/>{p.quartos} quartos</span>}
            {!!p.wc && <span className="sp"><Ic.bath/>{p.wc} casas de banho</span>}
            {!!p.area && <span className="sp"><Ic.area/>{p.area} m²</span>}
            <span className="sp"><Ic.pin/>{p.tipo}</span>
          </div>
          {p.desc && <p className="modal-desc">{p.desc}</p>}
          <div className="modal-feats">{p.feats.map(f=><span key={f}>{f}</span>)}</div>
          <div className="modal-cta">
            <a className="btn btn-wa" href={WA(`Olá Claudia, gostava de marcar uma visita ao imóvel "${p.title || p.tipo}"${p.zona ? ` em ${p.zona}` : ""}${p.preco ? ` (${eur(p.preco)})` : ""}.`)} target="_blank" rel="noopener"><Ic.wa/> Marcar visita</a>
            <a className="btn btn-navy" href="tel:+351913354281"><Ic.phone/> Ligar agora</a>
          </div>
        </div>
      </div>
    </div>
  );
}

/* ---------- Filters ---------- */
function Filters({ f, set, reset, zonas }){
  return (
    <div className="filters">
      <div className="field">
        <label>Zona</label>
        <select value={f.zona} onChange={e=>set("zona",e.target.value)}>
          {zonas.map(z=><option key={z}>{z}</option>)}
        </select>
      </div>
      <div className="field">
        <label>Tipo</label>
        <select value={f.tipo} onChange={e=>set("tipo",e.target.value)}>
          {TIPOS.map(z=><option key={z}>{z}</option>)}
        </select>
      </div>
      <div className="field">
        <label>Tipologia</label>
        <select value={f.tip} onChange={e=>set("tip",e.target.value)}>
          {TIPOLOGIAS.map(z=><option key={z}>{z}</option>)}
        </select>
      </div>
      <div className="field">
        <label>Preço</label>
        <select value={f.preco} onChange={e=>set("preco",Number(e.target.value))}>
          {PRECOS.map((z,k)=><option key={k} value={k}>{z.label}</option>)}
        </select>
      </div>
      <button className="clearbtn" onClick={reset}>Limpar</button>
    </div>
  );
}

/* ---------- Contact form ---------- */
function ContactForm(){
  const [f,setF] = useState({nome:"",telefone:"",mensagem:""});
  const [sent,setSent] = useState(false);
  const [busy,setBusy] = useState(false);
  const [err,setErr] = useState("");
  const set = k => e => setF(s=>({...s,[k]:e.target.value}));

  const submit = async e => {
    e.preventDefault();
    setBusy(true); setErr("");
    try{
      const r = await fetch("/api/messages",{
        method:"POST",
        headers:{"Content-Type":"application/json"},
        body:JSON.stringify(f),
      });
      if(!r.ok) throw new Error((await r.json().catch(()=>({}))).error || "Erro ao enviar.");
      setSent(true);
    }catch(e){ setErr(e.message); }
    finally{ setBusy(false); }
  };

  if(sent) return <div className="form"><div className="ok">Obrigada! A sua mensagem foi registada. A Claudia entrará em contacto brevemente.</div></div>;
  return (
    <form className="form" onSubmit={submit}>
      <div className="field"><label>Nome</label><input required placeholder="O seu nome" value={f.nome} onChange={set("nome")}/></div>
      <div className="field"><label>Telefone</label><input required placeholder="O seu contacto" value={f.telefone} onChange={set("telefone")}/></div>
      <div className="field"><label>Mensagem</label><textarea required placeholder="Em que podemos ajudar? (compra, venda, avaliação...)" value={f.mensagem} onChange={set("mensagem")}/></div>
      {err && <div className="err">{err}</div>}
      <button className="btn btn-gold" type="submit" disabled={busy}>{busy?<><span className="spin"/> A enviar…</>:"Enviar mensagem"}</button>
    </form>
  );
}

/* ---------- App ---------- */
function App(){
  const allProps = useProperties();
  const settings = useSettings();
  const [f,setF] = useState({ zona:"Todas", tipo:"Todos", tip:"Todas", preco:0 });
  const [open,setOpen] = useState(null);
  const set = (k,v)=> setF(s=>({...s,[k]:v}));
  const reset = ()=> setF({ zona:"Todas", tipo:"Todos", tip:"Todas", preco:0 });

  const zonas = useMemo(()=> ["Todas",...Array.from(new Set(allProps.map(p=>p.zona).filter(Boolean)))], [allProps]);

  const list = useMemo(()=> allProps.filter(p=>{
    if(f.zona!=="Todas" && p.zona!==f.zona) return false;
    if(f.tipo!=="Todos" && p.tipo!==f.tipo) return false;
    if(f.tip!=="Todas"){ const t=f.tip==="T4+"?(p.t>=4):(p.t===Number(f.tip[1])); if(!t) return false; }
    const pr=PRECOS[f.preco]; if(p.preco<pr.min||p.preco>pr.max) return false;
    return true;
  }),[f,allProps]);

  useScrollReveal([list, settings]);

  return (
    <>
      {/* HEADER */}
      <header className="site-header">
        <div className="wrap hd-inner">
          <a className="brand" href="#topo">
            <Logo/>
            <div className="name"><b>CLAUDIA LIMA</b><span>MEDIAÇÃO IMOBILIÁRIA</span></div>
          </a>
          <nav className="hd-nav">
            <a href="#imoveis">Imóveis</a>
            <a href="#sobre">Sobre</a>
            <a href="#contacto">Contacto</a>
          </nav>
          <div className="hd-cta">
            <a className="hd-phone" href="tel:+351913354281"><Ic.phone/><span>913 354 281</span></a>
            <a className="btn btn-gold" href={WA("Olá Claudia, gostava de mais informações.")} target="_blank" rel="noopener" style={{padding:"11px 20px",minHeight:46,fontSize:15}}><Ic.wa/> WhatsApp</a>
          </div>
        </div>
      </header>

      {/* HERO */}
      <section className="hero" id="topo">
        <div className="wrap hero-inner">
          <div>
            <span className="eyebrow">Comprar &middot; Vender em Braga</span>
            <h1 style={{marginTop:16}}>A casa certa, <em>com confiança</em></h1>
            <p className="lead">Acompanhamento próximo e personalizado em cada passo. Encontre o seu próximo lar com quem conhece Braga como ninguém.</p>
            <div className="hero-actions">
              <a className="btn btn-gold" href="#imoveis">Ver imóveis</a>
              <a className="btn btn-ghost" href={WA("Olá Claudia, gostava de falar consigo.")} target="_blank" rel="noopener"><Ic.wa/> Falar com a Claudia</a>
            </div>
          </div>
          <div className="hero-photo">
            <img src={settings.heroImage || U("1600596542815-ffad4c1539a9",1000)} alt="Moradia em Braga"/>
          </div>
        </div>
      </section>

      {/* LISTINGS */}
      <section className="listings" id="imoveis">
        <div className="wrap">
          <div className="sec-head" data-reveal>
            <span className="eyebrow">Imóveis disponíveis</span>
            <h2 style={{marginTop:10}}>Encontre o seu imóvel</h2>
            <p>Use os filtros para encontrar a casa ideal. Toque numa fotografia para ver a galeria completa.</p>
          </div>
          <Filters f={f} set={set} reset={reset} zonas={zonas}/>
          <div className="result-count">
            <div className="n"><b>{list.length}</b> {list.length===1?"imóvel encontrado":"imóveis encontrados"}</div>
          </div>
          {list.length ? (
            <div className="grid">{list.map((p,i)=><Card key={p.id} p={p} onOpen={setOpen} i={i}/>)}</div>
          ) : (
            <p style={{textAlign:"center",padding:"40px 0",color:"var(--ink-soft)",fontWeight:600}}>
              Sem resultados para estes filtros. <button className="clearbtn" style={{display:"inline-block",marginLeft:8}} onClick={reset}>Limpar filtros</button>
            </p>
          )}
        </div>
      </section>

      {/* ABOUT */}
      <section className="about" id="sobre">
        <div className="wrap about-inner">
          <div className="about-photo" data-reveal><img src={settings.aboutImage || "/claudialima.png"} alt="Claudia Lima"/></div>
          <div data-reveal style={{transitionDelay:"120ms"}}>
            <span className="eyebrow">Quem o vai acompanhar</span>
            <h2 style={{marginTop:10}}>Claudia Lima</h2>
            <div className="role">Sócia-Gerente &middot; Mediação Imobiliária</div>
            <p>Dedico-me a tornar a compra ou venda do seu imóvel num processo simples, transparente e tranquilo. Conheço Braga e o seu mercado em detalhe e estou ao seu lado em cada etapa — da primeira visita à entrega das chaves.</p>
            <p>Acredito numa relação de confiança e proximidade. Seja para comprar, vender ou avaliar, terá sempre alguém disponível para responder e aconselhar.</p>
            <div className="ami">Licença AMI 12434</div>
          </div>
        </div>
      </section>

      {/* CONTACT */}
      <section className="contact" id="contacto">
        <div className="wrap contact-grid">
          <div data-reveal>
            <span className="eyebrow">Fale connosco</span>
            <h2 style={{marginTop:10}}>Vamos conversar</h2>
            <p className="sub">A forma mais rápida é por WhatsApp ou telefone. Respondo pessoalmente a todas as mensagens.</p>
            <div className="contact-list">
              <a className="cl-item" href={WA("Olá Claudia, gostava de mais informações.")} target="_blank" rel="noopener">
                <span className="ic" style={{background:"#e6f8ec",color:"#25D366"}}><Ic.wa/></span>
                <span className="tx"><b>WhatsApp</b><span>913 354 281</span></span>
              </a>
              <a className="cl-item" href="tel:+351913354281">
                <span className="ic"><Ic.phone/></span>
                <span className="tx"><b>Telefone</b><span>+351 913 354 281</span></span>
              </a>
              <a className="cl-item" href="mailto:claudialima301971@gmail.com">
                <span className="ic"><Ic.mail/></span>
                <span className="tx"><b>Email</b><span style={{fontSize:16,wordBreak:"break-all"}}>claudialima301971@gmail.com</span></span>
              </a>
              <div className="cl-item">
                <span className="ic"><Ic.pin/></span>
                <span className="tx"><b>Escritório</b><span style={{fontSize:16}}>R. Maia Passarinheiro nº 21, Dume &middot; 4700-069 Braga</span></span>
              </div>
            </div>
          </div>
          <div data-reveal style={{transitionDelay:"120ms"}}><ContactForm/></div>
        </div>
      </section>

      {/* FOOTER */}
      <footer className="site-footer">
        <div className="wrap">
          <a className="brand" href="#topo"><Logo size={40}/><div className="name"><b>CLAUDIA LIMA</b><span>MEDIAÇÃO IMOBILIÁRIA</span></div></a>
          <p>R. Maia Passarinheiro nº 21, Dume · 4700-069 Braga &nbsp;|&nbsp; AMI 12434<br/>
          <a href="tel:+351913354281">913 354 281</a> · <a href="mailto:claudialima301971@gmail.com">claudialima301971@gmail.com</a></p>
          <p style={{marginTop:14,fontSize:13,opacity:.6}}>© {new Date().getFullYear()} Claudia Lima — Mediação Imobiliária. Todos os direitos reservados.</p>
        </div>
      </footer>

      {/* MOBILE STICKY BAR */}
      <div className="mobile-bar">
        <a className="btn btn-navy" href="tel:+351913354281"><Ic.phone/> Ligar</a>
        <a className="btn btn-wa" href={WA("Olá Claudia, gostava de mais informações.")} target="_blank" rel="noopener"><Ic.wa/> WhatsApp</a>
      </div>

      {open && <Modal p={open} onClose={()=>setOpen(null)}/>}
    </>
  );
}

ReactDOM.createRoot(document.getElementById("root")).render(<App/>);
