// avtaler.js — Avtaleregister med full Supabase-integrasjon
// Erstatter prototype-screens-4.jsx (Agreements + AgreementDetail)
// og prototype-data.jsx (AGREEMENTS mock-data)
//
// Avhenger av: window._sb (Supabase-klient fra index.html)
// Bruker: SK, I, Button, Card, KPI, Avatar, Tabs, Badge fra eksisterende filer


// ── Konstanter ────────────────────────────────────────────────────────────────

const AVTALE_TYPE_LABEL = {
  rammeavtale:   'Rammeavtale',
  tilskudd:      'Tilskudd',
  samarbeid:     'Samarbeid',
  leie:          'Leieavtale',
  leverandør:    'Leverandør',
  kunde:         'Kundeavtale',
  sertifisering: 'Sertifisering',
};

const AVTALE_STATUS_TONE = {
  aktiv:          { bg: '#dbeed8', fg: '#1b6a2e' },
  utløper:        { bg: '#fdeac8', fg: '#8e5a05' },
  reforhandles:   { bg: '#fdeac8', fg: '#8e5a05' },
  resertifiseres: { bg: '#fdeac8', fg: '#8e5a05' },
  utløpt:         { bg: '#f8d3d5', fg: '#8a1620' },
};

const AVTALE_RISIKO_TONE = {
  lav:     { bg: '#dbeed8', fg: '#1b6a2e' },
  middels: { bg: '#fdeac8', fg: '#8e5a05' },
  høy:     { bg: '#fcddde', fg: '#8a1620' },
};

const TOMT_AVTALE_SKJEMA = {
  name: '', type: 'rammeavtale', motpart: '', motpart_type: 'offentlig',
  eier_id: '', enhet_id: '', lokasjon_id: '', lokasjon: '', start_dato: '', slutt_dato: '',
  arsverdi: '', totalverdi: '', status: 'aktiv', fornyelse: '',
  varsel_tekst: '', risiko: 'lav', areal_m2: '', beskrivelse: '', doc_id: '',
};

// ── Hjelpe­funksjoner ─────────────────────────────────────────────────────────

function avtaleDagerTil(datoStr) {
  if (!datoStr) return null;
  const diff = new Date(datoStr) - new Date();
  return Math.ceil(diff / 86400000);
}

function avtaleFmtDato(datoStr) {
  if (!datoStr) return '—';
  const d = new Date(datoStr);
  return d.toLocaleDateString('nb-NO', { day: 'numeric', month: 'short', year: 'numeric' });
}

function avtaleFmtKr(tall) {
  if (!tall && tall !== 0) return '—';
  return Number(tall).toLocaleString('nb-NO');
}

function avtalePctGjennomfort(start, slutt) {
  const total = new Date(slutt) - new Date(start);
  const gatt  = new Date() - new Date(start);
  return Math.max(0, Math.min(100, Math.round((gatt / total) * 100)));
}

// ── Supabase-kall ─────────────────────────────────────────────────────────────

async function hentAvtaler() {
  const sb = window._sb;
  const { data, error } = await sb
    .from('avtaler')
    .select('*, eier:profiles!eier_id(id, navn, epost), enhet:enheter!enhet_id(id, navn), sted:lokasjoner!lokasjon_id(id, navn, adresse)')
    .order('slutt_dato', { ascending: true });
  if (error) throw error;
  return data;
}

async function hentProfilerOgEnheter() {
  const sb = window._sb;
  const [profilerRes, enheterRes, lokasjoner] = await Promise.all([
    sb.from('profiles').select('id, navn, epost, enhet_id, enheter(navn)').order('navn'),
    sb.from('enheter').select('id, navn, type').eq('aktiv', true).order('sortering'),
    sb.from('lokasjoner').select('id, navn, adresse, enhet_id').eq('aktiv', true).order('navn'),
  ]);
  return {
    profiler:   profilerRes.data || [],
    enheter:    enheterRes.data  || [],
    lokasjoner: lokasjoner.data  || [],
  };
}

async function opprettVarselTiltak(avtaleId, dagerIgjen, brukerId) {
  const sb = window._sb;
  await sb.rpc('opprett_varsel_tiltak', {
    p_avtale_id:    avtaleId,
    p_dager_igjen:  dagerIgjen,
    p_opprettet_av: brukerId,
  });
}

async function lagreAvtale(skjema, brukerNavn) {
  const sb = window._sb;
  const { data: { user } } = await sb.auth.getUser();
  const rad = {
    ...skjema,
    arsverdi:   skjema.arsverdi   ? parseInt(skjema.arsverdi)   : 0,
    totalverdi: skjema.totalverdi ? parseInt(skjema.totalverdi) : 0,
    areal_m2:   skjema.areal_m2   ? parseInt(skjema.areal_m2)   : null,
    eier_id:    skjema.eier_id    || null,
    enhet_id:   skjema.enhet_id   || null,
    opprettet_av: user?.id,
    opprettet_av_navn: brukerNavn || user?.email,
  };
  // Fjern eier_navn siden vi nå bruker eier_id
  delete rad.eier_navn;
  if (!rad.doc_id) delete rad.doc_id;

  const { data, error } = await sb.from('avtaler').insert([rad]).select().single();
  if (error) throw error;

  await sb.from('avtale_logg').insert([{
    avtale_id: data.id,
    bruker_navn: brukerNavn || user?.email,
    handling: 'Avtale opprettet',
  }]);
  return data;
}

async function oppdaterAvtale(id, endringer, brukerNavn) {
  const sb = window._sb;
  // Fjern join-objekter som ikke er ekte kolonner
  const { eier, enhet, sted, opprettet_av_navn, lokasjon, avdeling, eier_navn, ...felt } = endringer;
  if (felt.arsverdi !== undefined)   felt.arsverdi   = parseInt(felt.arsverdi)   || 0;
  if (felt.totalverdi !== undefined) felt.totalverdi = parseInt(felt.totalverdi) || 0;
  if (felt.areal_m2 !== undefined)   felt.areal_m2   = felt.areal_m2 ? parseInt(felt.areal_m2) : null;
  if (felt.eier_id !== undefined)    felt.eier_id    = felt.eier_id   || null;
  if (felt.enhet_id !== undefined)   felt.enhet_id   = felt.enhet_id  || null;
  if (felt.lokasjon_id !== undefined) felt.lokasjon_id = felt.lokasjon_id || null;

  const { data, error } = await sb.from('avtaler').update(felt).eq('id', id).select().single();
  if (error) throw error;

  await sb.from('avtale_logg').insert([{
    avtale_id: id,
    bruker_navn: brukerNavn,
    handling: 'Avtale oppdatert',
  }]);
  return data;
}

async function slettAvtale(id) {
  const sb = window._sb;
  const { error } = await sb.from('avtaler').delete().eq('id', id);
  if (error) throw error;
}

async function avtaleHentLogg(avtaleId) {
  const sb = window._sb;
  const { data, error } = await sb
    .from('avtale_logg')
    .select('*')
    .eq('avtale_id', avtaleId)
    .order('created_at', { ascending: false });
  if (error) throw error;
  return data;
}

async function leggTilLoggnotat(avtaleId, notat, brukerNavn) {
  const sb = window._sb;
  const { error } = await sb.from('avtale_logg').insert([{
    avtale_id: avtaleId,
    bruker_navn: brukerNavn,
    handling: 'Notat',
    notat,
  }]);
  if (error) throw error;
}

// ── UI: Registrer/rediger-skjema ──────────────────────────────────────────────

function AvtaleSkjema({ eksisterende, onLagret, onAvbryt, brukerNavn }) {
  const [felt, setFelt] = React.useState(eksisterende
    ? { ...eksisterende, arsverdi: eksisterende.arsverdi || '', totalverdi: eksisterende.totalverdi || '',
        eier_id: eksisterende.eier_id || '', enhet_id: eksisterende.enhet_id || '',
        lokasjon_id: eksisterende.lokasjon_id || '' }
    : { ...TOMT_AVTALE_SKJEMA });
  const [laster,    setLaster]    = React.useState(false);
  const [feil,      setFeil]      = React.useState(null);
  const [profiler,  setProfiler]  = React.useState([]);
  const [enheter,   setEnheter]   = React.useState([]);
  const [lokasjoner,setLokasjoner]= React.useState([]);

  React.useEffect(() => {
    hentProfilerOgEnheter().then(({ profiler, enheter, lokasjoner }) => {
      setProfiler(profiler);
      setEnheter(enheter);
      setLokasjoner(lokasjoner);
    });
  }, []);

  const oppdater = (k, v) => setFelt(f => ({ ...f, [k]: v }));

  const handleSubmit = async () => {
    if (!felt.name || !felt.motpart || !felt.start_dato || !felt.slutt_dato) {
      setFeil('Fyll inn: avtalenavn, motpart, startdato og sluttdato.');
      return;
    }
    setLaster(true); setFeil(null);
    try {
      let resultat;
      if (eksisterende) {
        resultat = await oppdaterAvtale(eksisterende.id, felt, brukerNavn);
      } else {
        resultat = await lagreAvtale(felt, brukerNavn);
      }
      onLagret(resultat);
    } catch (e) {
      setFeil('Feil ved lagring: ' + e.message);
    } finally {
      setLaster(false);
    }
  };

  const lbl = { fontSize: 11, fontWeight: 600, color: SK.soft, letterSpacing: 0.04, textTransform: 'uppercase', display: 'block', marginBottom: 5 };
  const inp = { padding: '10px 12px', fontSize: 13 };

  const Field = ({ label, k, type = 'text', placeholder }) => (
    <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>
      <label style={lbl}>{label}</label>
      <input type={type} className="ok-input" placeholder={placeholder}
        value={felt[k] || ''} onChange={e => oppdater(k, e.target.value)} style={inp} />
    </div>
  );

  const Velg = ({ label, k, valg }) => (
    <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>
      <label style={lbl}>{label}</label>
      <select className="ok-input" value={felt[k] || ''} onChange={e => oppdater(k, e.target.value)} style={inp}>
        {valg.map(([v, l]) => <option key={v} value={v}>{l}</option>)}
      </select>
    </div>
  );

  return (
    <div style={{ padding: '20px 0' }}>
      <h2 style={{ fontSize: 18, fontWeight: 600, marginBottom: 20 }}>
        {eksisterende ? 'Rediger avtale' : 'Registrer ny avtale'}
      </h2>

      {feil && (
        <div style={{ background: '#fcddde', border: '1px solid #f2545c', borderRadius: 8,
          padding: '10px 14px', fontSize: 13, color: '#8a1620', marginBottom: 16 }}>{feil}</div>
      )}

      <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: '16px 20px' }}>
        <div style={{ gridColumn: '1 / -1' }}>
          <Field label="Avtalenavn *" k="name" placeholder="f.eks. Rammeavtale AFT — NAV Oslo" />
        </div>

        <Velg label="Type *" k="type" valg={Object.entries(AVTALE_TYPE_LABEL)} />
        <Velg label="Status" k="status" valg={[['aktiv','Aktiv'],['utløper','Utløper'],
          ['reforhandles','Reforhandles'],['resertifiseres','Resertifiseres'],['utløpt','Utløpt']]} />

        <Field label="Motpart *" k="motpart" placeholder="f.eks. NAV Oslo" />
        <Velg label="Motparttype" k="motpart_type" valg={[['offentlig','Offentlig'],['privat','Privat']]} />

        {/* Avtaleeier – nedtrekk fra profiles */}
        <div style={{ display: 'flex', flexDirection: 'column' }}>
          <label style={lbl}>Avtaleeier</label>
          <select className="ok-input" value={felt.eier_id || ''} onChange={e => oppdater('eier_id', e.target.value)} style={inp}>
            <option value="">— Ikke satt —</option>
            {profiler.map(p => (
              <option key={p.id} value={p.id}>{p.navn || p.epost}{p.enheter?.navn ? ` · ${p.enheter.navn}` : ''}</option>
            ))}
          </select>
        </div>

        {/* Enhet */}
        <div style={{ display: 'flex', flexDirection: 'column' }}>
          <label style={lbl}>Avdeling / enhet</label>
          <select className="ok-input" value={felt.enhet_id || ''} onChange={e => oppdater('enhet_id', e.target.value)} style={inp}>
            <option value="">— Ikke satt —</option>
            {enheter.map(e => <option key={e.id} value={e.id}>{e.navn}</option>)}
          </select>
        </div>

        {/* Lokasjon */}
        <div style={{ gridColumn: '1 / -1', display: 'flex', flexDirection: 'column' }}>
          <label style={lbl}>Lokasjon</label>
          <select className="ok-input" value={felt.lokasjon_id || ''} onChange={e => oppdater('lokasjon_id', e.target.value)} style={inp}>
            <option value="">— Ikke satt —</option>
            {lokasjoner.map(l => (
              <option key={l.id} value={l.id}>{l.navn}{l.adresse ? ` · ${l.adresse}` : ''}</option>
            ))}
          </select>
          <div style={{ fontSize: 11, color: SK.soft, marginTop: 4 }}>
            Lokasjoner administreres under Organisasjon-modulen.
          </div>
        </div>

        <Field label="Startdato *" k="start_dato" type="date" />
        <Field label="Sluttdato *" k="slutt_dato" type="date" />

        <Field label="Årsverdi (kr)" k="arsverdi" type="number" placeholder="f.eks. 1800000" />
        <Field label="Totalverdi (kr)" k="totalverdi" type="number" placeholder="f.eks. 5400000" />

        <Field label="Dok-ID" k="doc_id" placeholder="f.eks. D-2026-NAV-001" />
        <Field label="Fornyelse" k="fornyelse" placeholder="f.eks. opsjon, årlig" />

        {/* Varsel */}
        <div style={{ display: 'flex', flexDirection: 'column' }}>
          <label style={lbl}>Varsel</label>
          <select className="ok-input" value={felt.varsel_tekst || ''} onChange={e => oppdater('varsel_tekst', e.target.value)} style={inp}>
            <option value="">— Ingen —</option>
            <option value="30 dager før utløp">30 dager før utløp</option>
            <option value="3 mnd før utløp">3 mnd før utløp</option>
            <option value="6 mnd før utløp">6 mnd før utløp</option>
            <option value="12 mnd før utløp">12 mnd før utløp</option>
          </select>
          <div style={{ fontSize: 11, color: SK.soft, marginTop: 4 }}>Genererer tiltak i Tiltaksplan.</div>
        </div>

        <Velg label="Risiko" k="risiko" valg={[['lav','Lav'],['middels','Middels'],['høy','Høy']]} />

        <Field label="Areal m² (kun leieavtaler)" k="areal_m2" type="number" placeholder="f.eks. 450" />

        <div style={{ gridColumn: '1 / -1', display: 'flex', flexDirection: 'column' }}>
          <label style={lbl}>Beskrivelse</label>
          <textarea className="ok-input" placeholder="Kort beskrivelse av avtalen…"
            value={felt.beskrivelse || ''} onChange={e => oppdater('beskrivelse', e.target.value)}
            rows={3} style={{ ...inp, resize: 'vertical', fontFamily: 'inherit' }} />
        </div>
      </div>

      <div style={{ display: 'flex', gap: 8, marginTop: 20 }}>
        <Button variant="primary" onClick={handleSubmit} disabled={laster}>
          {laster ? 'Lagrer…' : (eksisterende ? 'Lagre endringer' : 'Registrer avtale')}
        </Button>
        <Button onClick={onAvbryt}>Avbryt</Button>
      </div>
    </div>
  );
}

// ── UI: Detalj-panel ─────────────────────────────────────────────────────────

function AvtaleDetalj({ avtale: a, onLukk, onOppdatert, onSlettet, brukerNavn }) {
  const [fane, setFane] = React.useState('detaljer');
  const [redigerer, setRedigerer] = React.useState(false);
  const [logg, setLogg] = React.useState([]);
  const [notat, setNotat] = React.useState('');
  const [lasterLogg, setLasterLogg] = React.useState(false);
  const [lagrerNotat, setLagrerNotat] = React.useState(false);
  const [bekreftSlett, setBekreftSlett] = React.useState(false);

  const days  = avtaleDagerTil(a.slutt_dato);
  const pct   = avtalePctGjennomfort(a.start_dato, a.slutt_dato);
  const tone  = AVTALE_STATUS_TONE[a.status] || AVTALE_STATUS_TONE.aktiv;
  const rTone = AVTALE_RISIKO_TONE[a.risiko]  || AVTALE_RISIKO_TONE.lav;

  React.useEffect(() => {
    if (fane === 'logg') {
      setLasterLogg(true);
      avtaleHentLogg(a.id).then(data => { setLogg(data); setLasterLogg(false); }).catch(() => setLasterLogg(false));
    }
  }, [fane, a.id]);

  const handleLeggTilNotat = async () => {
    if (!notat.trim()) return;
    setLagrerNotat(true);
    try {
      await leggTilLoggnotat(a.id, notat, brukerNavn);
      const oppdatert = await avtaleHentLogg(a.id);
      setLogg(oppdatert);
      setNotat('');
    } catch(e) { alert('Feil: ' + e.message); }
    setLagrerNotat(false);
  };

  const handleSlett = async () => {
    try {
      await slettAvtale(a.id);
      onSlettet(a.id);
    } catch(e) { alert('Kunne ikke slette: ' + e.message); }
  };

  if (redigerer) {
    return (
      <Card padded style={{ position: 'sticky', top: 0 }}>
        <AvtaleSkjema
          eksisterende={a}
          brukerNavn={brukerNavn}
          onLagret={oppdatert => { onOppdatert(oppdatert); setRedigerer(false); }}
          onAvbryt={() => setRedigerer(false)}
        />
      </Card>
    );
  }

  return (
    <Card padded style={{ position: 'sticky', top: 0, maxHeight: '90vh', overflowY: 'auto' }}>
      {/* Header */}
      <div style={{ display: 'flex', alignItems: 'flex-start', justifyContent: 'space-between', marginBottom: 12, gap: 8 }}>
        <div>
          <div style={{ fontSize: 10.5, color: SK.soft, fontWeight: 600, letterSpacing: 0.05, textTransform: 'uppercase' }}>
            {AVTALE_TYPE_LABEL[a.type]}{a.doc_id ? ` · ${a.doc_id}` : ''}
          </div>
          <h2 style={{ margin: '4px 0 0', fontSize: 16, fontWeight: 600, letterSpacing: -0.01, lineHeight: 1.3 }}>{a.name}</h2>
        </div>
        <button onClick={onLukk} style={{
          background: 'none', border: '1px solid rgba(17,24,61,.15)', borderRadius: 99,
          width: 26, height: 26, cursor: 'pointer', color: SK.soft, flexShrink: 0,
          display: 'inline-flex', alignItems: 'center', justifyContent: 'center',
        }}>
          <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round"><path d="M18 6 6 18M6 6l12 12"/></svg>
        </button>
      </div>

      {/* Faner */}
      <div style={{ display: 'flex', gap: 0, borderBottom: '1px solid rgba(17,24,61,.1)', marginBottom: 14 }}>
        {[['detaljer','Detaljer'],['logg','Logg']].map(([k, l]) => (
          <button key={k} onClick={() => setFane(k)} style={{
            background: 'none', border: 'none', cursor: 'pointer', padding: '8px 14px',
            fontSize: 12.5, fontWeight: fane === k ? 600 : 400,
            color: fane === k ? SK.ink : SK.soft,
            borderBottom: fane === k ? `2px solid ${SK.coral}` : '2px solid transparent',
            fontFamily: 'inherit',
          }}>{l}</button>
        ))}
      </div>

      {fane === 'detaljer' && (
        <>
          {a.beskrivelse && (
            <div style={{ fontSize: 12, color: SK.soft, lineHeight: 1.5, marginBottom: 14 }}>{a.beskrivelse}</div>
          )}

          {/* Status */}
          <div style={{ padding: '10px 12px', borderRadius: 8, background: tone.bg + '60', marginBottom: 14, display: 'flex', alignItems: 'center', gap: 8 }}>
            <span style={{ width: 8, height: 8, borderRadius: '50%', background: tone.fg, flexShrink: 0 }} />
            <span style={{ fontSize: 12, color: tone.fg, fontWeight: 600 }}>
              {a.status[0].toUpperCase() + a.status.slice(1)}{a.varsel_tekst ? ` · ${a.varsel_tekst}` : ''}
            </span>
          </div>

          {/* Avtaletid-fremgang */}
          <div style={{ marginBottom: 14 }}>
            <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 6 }}>
              <span style={{ fontSize: 11, fontWeight: 600, color: SK.soft, letterSpacing: 0.04, textTransform: 'uppercase' }}>Avtaletid</span>
              <span style={{ fontSize: 11, color: SK.soft }}>{pct}% gått</span>
            </div>
            <div style={{ height: 6, borderRadius: 99, background: 'rgba(17,24,61,.1)' }}>
              <div style={{
                height: '100%', borderRadius: 99,
                width: `${pct}%`,
                background: days !== null && days < 30 ? SK.coral : days !== null && days < 180 ? SK.yellow : SK.green,
                transition: 'width 0.4s ease',
              }} />
            </div>
            <div style={{ display: 'flex', justifyContent: 'space-between', marginTop: 6, fontSize: 11.5 }}>
              <span style={{ fontWeight: 600 }}>{avtaleFmtDato(a.start_dato)}</span>
              <span style={{ fontWeight: 600, color: days !== null && days < 180 ? SK.coral : SK.ink }}>{avtaleFmtDato(a.slutt_dato)}</span>
            </div>
          </div>

          {/* Detalj-grid */}
          <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 8, marginBottom: 14 }}>
            {[
              ['Årsverdi', `kr ${avtaleFmtKr(a.arsverdi)}`],
              ['Total', `kr ${avtaleFmtKr(a.totalverdi)}`],
              ['Avtaleeier', a.eier?.navn || a.eier_navn || '—'],
              ['Avdeling', a.enhet?.navn || a.avdeling || '—'],
              ['Lokasjon', a.sted?.navn || a.lokasjon || '—'],
              ['Lokasjon', a.lokasjon || '—'],
              ['Motpart', `${a.motpart}${a.motpart_type === 'offentlig' ? ' · off.' : ''}`],
              ['Fornyelse', a.fornyelse || '—'],
            ].map(([l, v]) => (
              <div key={l} style={{ padding: '8px 10px', borderRadius: 6, background: SK.iceBlueLight }}>
                <div style={{ fontSize: 10, fontWeight: 600, color: SK.soft, letterSpacing: 0.04, textTransform: 'uppercase' }}>{l}</div>
                <div style={{ fontSize: 12.5, fontWeight: 500, marginTop: 3 }}>{v}</div>
              </div>
            ))}
            <div style={{ padding: '8px 10px', borderRadius: 6, background: SK.iceBlueLight }}>
              <div style={{ fontSize: 10, fontWeight: 600, color: SK.soft, letterSpacing: 0.04, textTransform: 'uppercase' }}>Risiko</div>
              <div style={{ marginTop: 4 }}>
                <span style={{ padding: '2px 8px', borderRadius: 4, fontSize: 11, fontWeight: 600, background: rTone.bg, color: rTone.fg }}>{a.risiko}</span>
              </div>
            </div>
            {a.areal_m2 && (
              <div style={{ padding: '8px 10px', borderRadius: 6, background: SK.iceBlueLight }}>
                <div style={{ fontSize: 10, fontWeight: 600, color: SK.soft, letterSpacing: 0.04, textTransform: 'uppercase' }}>Areal</div>
                <div style={{ fontSize: 12.5, fontWeight: 500, marginTop: 3 }}>{a.areal_m2} m²</div>
              </div>
            )}
          </div>

          {/* Handlinger */}
          <div style={{ display: 'flex', gap: 6, flexWrap: 'wrap', marginBottom: 14 }}>
            <Button size="sm" variant="primary" icon={I.doc} onClick={() => setRedigerer(true)}>Rediger</Button>
            <Button size="sm" onClick={() => setFane('logg')}>Logg notat</Button>
            {a.varsel_tekst && days !== null && days >= 0 && days < 365 && (
              <Button size="sm" onClick={async () => {
                try {
                  const { data: { user } } = await window._sb.auth.getUser();
                  await opprettVarselTiltak(a.id, days, user?.id);
                  // Tiltak opprettet - brukeren vil se det i Tiltaksplan
                } catch(e) { console.error('Varsel-tiltak feil:', e.message); }
              }}>⚑ Opprett varsel-tiltak</Button>
            )}
            {!bekreftSlett
              ? <Button size="sm" variant="ghost" onClick={() => setBekreftSlett(true)}>Slett</Button>
              : (
                <span style={{ display: 'flex', alignItems: 'center', gap: 6 }}>
                  <span style={{ fontSize: 12, color: SK.coral }}>Sikker?</span>
                  <Button size="sm" onClick={handleSlett} style={{ background: SK.coral, color: '#fff', borderColor: SK.coral }}>Ja, slett</Button>
                  <Button size="sm" onClick={() => setBekreftSlett(false)}>Avbryt</Button>
                </span>
              )
            }
          </div>

          {/* Dager igjen */}
          {days !== null && (
            <div style={{
              padding: '10px 12px', borderRadius: 8, fontSize: 12, fontWeight: 600,
              background: days < 0 ? '#fcddde' : days < 30 ? '#fcddde' : days < 180 ? '#fdeac8' : '#dbeed8',
              color: days < 0 ? '#8a1620' : days < 30 ? '#8a1620' : days < 180 ? '#8e5a05' : '#1b6a2e',
            }}>
              {days < 0 ? `Utløpt for ${Math.abs(days)} dager siden` :
               days === 0 ? 'Utløper i dag!' :
               `${days} dager til utløp`}
            </div>
          )}
        </>
      )}

      {fane === 'logg' && (
        <div>
          {/* Skriv notat */}
          <div style={{ marginBottom: 16 }}>
            <textarea
              className="ok-input"
              placeholder="Skriv et notat om denne avtalen…"
              value={notat}
              onChange={e => setNotat(e.target.value)}
              rows={3}
              style={{ width: '100%', padding: '8px 10px', fontSize: 13, resize: 'vertical', fontFamily: 'inherit', marginBottom: 8 }}
            />
            <Button size="sm" variant="primary" onClick={handleLeggTilNotat} disabled={lagrerNotat || !notat.trim()}>
              {lagrerNotat ? 'Lagrer…' : 'Legg til notat'}
            </Button>
          </div>

          {/* Logg-liste */}
          {lasterLogg ? (
            <div style={{ fontSize: 13, color: SK.soft, textAlign: 'center', padding: 20 }}>Laster logg…</div>
          ) : logg.length === 0 ? (
            <div style={{ fontSize: 13, color: SK.soft }}>Ingen aktivitet registrert ennå.</div>
          ) : (
            <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>
              {logg.map(l => (
                <div key={l.id} style={{ padding: '10px 12px', borderRadius: 8, background: SK.iceBlueLight }}>
                  <div style={{ display: 'flex', justifyContent: 'space-between', marginBottom: 4 }}>
                    <span style={{ fontSize: 11.5, fontWeight: 600 }}>{l.handling}</span>
                    <span style={{ fontSize: 11, color: SK.soft }}>{avtaleFmtDato(l.created_at)}</span>
                  </div>
                  {l.notat && <div style={{ fontSize: 12, color: SK.soft, lineHeight: 1.5 }}>{l.notat}</div>}
                  <div style={{ fontSize: 11, color: SK.soft, marginTop: 4 }}>{l.bruker_navn}</div>
                </div>
              ))}
            </div>
          )}
        </div>
      )}
    </Card>
  );
}

// ── Hoved­komponent ───────────────────────────────────────────────────────────

function Agreements({ go }) {
  const [avtaler, setAvtaler]     = React.useState([]);
  const [laster, setLaster]       = React.useState(true);
  const [feil, setFeil]           = React.useState(null);
  const [sok, setSok]             = React.useState('');
  const [typeFilter, setType]     = React.useState('all');
  const [statusFilter, setStatus] = React.useState('all');
  const [sortBy, setSortBy]       = React.useState('slutt_dato');
  const [sortDir, setSortDir]     = React.useState('asc');
  const [valgt, setValgt]         = React.useState(null);
  const [visSkjema, setVisSkjema] = React.useState(false);
  const [brukerNavn, setBrukerNavn] = React.useState('');

  // Hent bruker og avtaler ved oppstart
  React.useEffect(() => {
    window._sb.auth.getUser().then(({ data: { user } }) => {
      setBrukerNavn(user?.email || 'Ukjent');
    });
    lastInn();
  }, []);

  async function lastInn() {
    setLaster(true); setFeil(null);
    try {
      const data = await hentAvtaler();
      setAvtaler(data);
    } catch(e) {
      setFeil('Kunne ikke hente avtaler: ' + e.message);
    } finally {
      setLaster(false);
    }
  }
  const filtrert = React.useMemo(() => {
    let a = avtaler.slice();
    if (sok) {
      const s = sok.toLowerCase();
      a = a.filter(x =>
        (x.name || '').toLowerCase().includes(s) ||
        (x.motpart || '').toLowerCase().includes(s) ||
        (x.lokasjon || '').toLowerCase().includes(s)
      );
    }
    if (typeFilter !== 'all')   a = a.filter(x => x.type === typeFilter);
    if (statusFilter !== 'all') a = a.filter(x => x.status === statusFilter);
    a.sort((x, y) => {
      let vx = x[sortBy] ?? '', vy = y[sortBy] ?? '';
      if (['arsverdi','totalverdi'].includes(sortBy)) { vx = +vx; vy = +vy; }
      if (vx < vy) return sortDir === 'asc' ? -1 : 1;
      if (vx > vy) return sortDir === 'asc' ?  1 : -1;
      return 0;
    });
    return a;
  }, [avtaler, sok, typeFilter, statusFilter, sortBy, sortDir]);

  const toggleSort = k => {
    if (sortBy === k) setSortDir(d => d === 'asc' ? 'desc' : 'asc');
    else { setSortBy(k); setSortDir('asc'); }
  };

  const TH = ({ k, label, style }) => (
    <th onClick={() => toggleSort(k)} style={{ cursor: 'pointer', userSelect: 'none', whiteSpace: 'nowrap', ...style }}>
      <span style={{ display: 'inline-flex', alignItems: 'center', gap: 3 }}>
        {label}
        {sortBy === k ? (sortDir === 'asc' ? ' ↑' : ' ↓') : ''}
      </span>
    </th>
  );

  // KPI-tall
  const aktive       = avtaler.filter(a => a.status === 'aktiv').length;
  const utloperSnart = avtaler.filter(a => { const d = avtaleDagerTil(a.slutt_dato); return d !== null && d >= 0 && d < 180; }).length;
  const kritisk      = avtaler.filter(a => { const d = avtaleDagerTil(a.slutt_dato); return d !== null && d >= 0 && d < 30; }).length;
  const totalAarsverdi = avtaler.reduce((s, a) => s + (a.arsverdi || 0), 0);

  if (visSkjema) {
    return (
      <div className="ok-content__inner" style={{ maxWidth: 800 }}>
        <Card padded>
          <AvtaleSkjema
            brukerNavn={brukerNavn}
            onLagret={ny => {
              setAvtaler(prev => [ny, ...prev]);
              setVisSkjema(false);
              setValgt(ny);
            }}
            onAvbryt={() => setVisSkjema(false)}
          />
        </Card>
      </div>
    );
  }

  return (
    <div className="ok-content__inner" style={{ maxWidth: 1320 }}>

      {/* Header */}
      <div style={{ display: 'flex', alignItems: 'flex-end', justifyContent: 'space-between', marginBottom: 22 }}>
        <div>
          <div style={{ fontSize: 11, fontWeight: 600, color: SK.soft, letterSpacing: 0.08, textTransform: 'uppercase' }}>Masterdata · Avtaleregister</div>
          <h1 style={{ margin: '6px 0 0', fontSize: 28, fontWeight: 600, letterSpacing: -0.02 }}>Avtaler</h1>
          <div style={{ marginTop: 4, color: SK.soft, fontSize: 13 }}>
            {avtaler.length} avtaler
            {kritisk > 0 && <span style={{ color: SK.coral, fontWeight: 600 }}> · {kritisk} kritisk frist innen 30 dager</span>}
            {utloperSnart > 0 && <span> · {utloperSnart} utløper innen 6 mnd</span>}
          </div>
        </div>
        <div style={{ display: 'flex', gap: 8 }}>
          <EksportKnapp
            data={filtrert}
            kolonner={[
              {label:'Avtalenavn', felt:'name'},
              {label:'Type', felt:'type'},
              {label:'Motpart', felt:'motpart'},
              {label:'Eier', felt:'eier.navn'},
              {label:'Enhet', felt:'enhet.navn'},
              {label:'Status', felt:'status'},
              {label:'Startdato', felt:'start_dato'},
              {label:'Sluttdato', felt:'slutt_dato'},
              {label:'Årsverdi', felt:'arsverdi'},
              {label:'Risiko', felt:'risiko'},
            ]}
            filnavn="avtaler"
          />
          <Button size="sm" icon={I.download} onClick={lastInn}>Oppdater</Button>
          <Button variant="primary" icon={I.plus} onClick={() => setVisSkjema(true)}>Registrer avtale</Button>
        </div>
      </div>

      {/* Feil */}
      {feil && (
        <div style={{ background: '#fcddde', border: '1px solid #f2545c', borderRadius: 8, padding: '10px 14px', fontSize: 13, color: '#8a1620', marginBottom: 16 }}>
          {feil} <button onClick={lastInn} style={{ background: 'none', border: 'none', cursor: 'pointer', color: '#8a1620', textDecoration: 'underline', fontFamily: 'inherit', fontSize: 13 }}>Prøv igjen</button>
        </div>
      )}

      {/* KPI */}
      <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: 14, marginBottom: 18 }}>
        <Card padded><KPI label="Aktive avtaler" value={aktive} sub={`av ${avtaler.length} totalt`} /></Card>
        <Card padded><KPI label="Årsverdi (totalt)" value={`${(totalAarsverdi / 1_000_000).toFixed(1)} mill`} sub="kr per år" /></Card>
        <Card padded><KPI label="Utløper < 6 mnd" value={utloperSnart} sub="krever oppfølging" accent={utloperSnart > 0} /></Card>
        <Card padded><KPI label="Kritisk (< 30 dgr)" value={kritisk} sub={kritisk ? 'haster' : 'ingen'} accent={kritisk > 0} /></Card>
      </div>

      {/* Innhold */}
      <div style={{ display: 'grid', gridTemplateColumns: valgt ? '1fr 400px' : '1fr', gap: 14, alignItems: 'flex-start' }}>
        <Card padded={false}>
          {/* Filter-rad */}
          <div style={{ padding: '12px 16px', display: 'flex', gap: 10, alignItems: 'center', flexWrap: 'wrap', borderBottom: '1px solid rgba(17,24,61,.08)' }}>
            <input
              className="ok-input ok-input--search"
              placeholder="Søk avtale, motpart, sted…"
              value={sok}
              onChange={e => setSok(e.target.value)}
              style={{ maxWidth: 280 }}
            />
            <select value={typeFilter} onChange={e => setType(e.target.value)} className="ok-input" style={{ maxWidth: 180, padding: '6px 10px' }}>
              <option value="all">Alle typer</option>
              {Object.entries(AVTALE_TYPE_LABEL).map(([k, l]) => <option key={k} value={k}>{l}</option>)}
            </select>
            <div style={{ display: 'flex', gap: 4 }}>
              {[['all','Alle'],['aktiv','Aktive'],['utløper','Utløper'],['reforhandles','Reforhandles']].map(([k, l]) => (
                <button key={k} onClick={() => setStatus(k)} className="ok-btn ok-btn--sm" style={{
                  background: statusFilter === k ? SK.ink : 'transparent',
                  color: statusFilter === k ? '#fff' : SK.ink,
                  borderColor: statusFilter === k ? SK.ink : 'rgba(17,24,61,.15)',
                }}>{l}</button>
              ))}
            </div>
            <span style={{ marginLeft: 'auto', fontSize: 11.5, color: SK.soft }}>
              {filtrert.length} av {avtaler.length}
            </span>
          </div>

          {/* Tabell */}
          {laster ? (
            <div style={{ padding: 40, textAlign: 'center', color: SK.soft, fontSize: 13 }}>Laster avtaler…</div>
          ) : filtrert.length === 0 ? (
            <div style={{ padding: 40, textAlign: 'center', color: SK.soft, fontSize: 13 }}>
              {avtaler.length === 0 ? 'Ingen avtaler registrert ennå. Klikk «Registrer avtale» for å starte.' : 'Ingen avtaler matcher filteret.'}
            </div>
          ) : (
            <div style={{ overflow: 'auto' }}>
              <table className="ok-table">
                <thead>
                  <tr>
                    <TH k="name" label="Avtale" style={{ paddingLeft: 18 }} />
                    <TH k="type" label="Type" />
                    <TH k="lokasjon" label="Lokasjon" />
                    <TH k="slutt_dato" label="Avtaletid" />
                    <TH k="arsverdi" label="Årsverdi" />
                    <th>Eier</th>
                    <TH k="status" label="Status" />
                  </tr>
                </thead>
                <tbody>
                  {filtrert.map(a => {
                    const days = avtaleDagerTil(a.slutt_dato);
                    const tone = AVTALE_STATUS_TONE[a.status] || AVTALE_STATUS_TONE.aktiv;
                    const erValgt = valgt?.id === a.id;
                    return (
                      <tr key={a.id} onClick={() => setValgt(erValgt ? null : a)} style={{
                        background: erValgt ? SK.iceBlueLight : 'transparent',
                        borderLeft: erValgt ? `3px solid ${SK.coral}` : '3px solid transparent',
                        cursor: 'pointer',
                      }}>
                        <td style={{ paddingLeft: 18 }}>
                          <div style={{ fontWeight: 600, fontSize: 12.5 }}>{a.name}</div>
                          <div style={{ fontSize: 11, color: SK.soft, marginTop: 2 }}>{a.motpart}</div>
                        </td>
                        <td style={{ fontSize: 12 }}>{AVTALE_TYPE_LABEL[a.type] || a.type}</td>
                        <td style={{ fontSize: 12 }}>{a.lokasjon || '—'}</td>
                        <td>
                          <div style={{ fontSize: 12, fontWeight: 500 }}>
                            {avtaleFmtDato(a.start_dato)} – {avtaleFmtDato(a.slutt_dato)}
                          </div>
                          {days !== null && (
                            <div style={{ fontSize: 11, marginTop: 2, fontWeight: days < 180 ? 600 : 400,
                              color: days < 0 ? SK.coral : days < 30 ? SK.coral : days < 180 ? '#b87800' : SK.soft }}>
                              {days < 0 ? `${Math.abs(days)} dgr utløpt` :
                               days === 0 ? 'utløper i dag' :
                               `${days} dgr igjen`}
                            </div>
                          )}
                        </td>
                        <td style={{ fontSize: 12.5, fontWeight: 600, whiteSpace: 'nowrap' }}>
                          {a.arsverdi ? `kr ${avtaleFmtKr(a.arsverdi)}` : '—'}
                          {a.arsverdi > 0 && <div style={{ fontSize: 10.5, color: SK.soft, fontWeight: 400, marginTop: 1 }}>kr/år</div>}
                        </td>
                        <td style={{ fontSize: 12 }}>{a.eier?.navn || a.eier_navn || '—'}</td>
                        <td>
                          <span style={{ display: 'inline-flex', alignItems: 'center', gap: 5,
                            padding: '3px 9px', borderRadius: 99, fontSize: 10.5, fontWeight: 600,
                            background: tone.bg, color: tone.fg }}>
                            <span style={{ width: 6, height: 6, borderRadius: '50%', background: tone.fg }} />
                            {a.status[0].toUpperCase() + a.status.slice(1)}
                          </span>
                        </td>
                      </tr>
                    );
                  })}
                </tbody>
              </table>
            </div>
          )}
        </Card>

        {valgt && (
          <AvtaleDetalj
            avtale={valgt}
            brukerNavn={brukerNavn}
            onLukk={() => setValgt(null)}
            onOppdatert={oppdatert => {
              setAvtaler(prev => prev.map(a => a.id === oppdatert.id ? oppdatert : a));
              setValgt(oppdatert);
            }}
            onSlettet={id => {
              setAvtaler(prev => prev.filter(a => a.id !== id));
              setValgt(null);
            }}
          />
        )}
      </div>
    </div>
  );
}

Object.assign(window, { Agreements });
