%% reikna_nidurstodur.m — allir útreikningar greinarinnar (engin teikning)
% Les EINGÖNGU gogn/gogn.csv og reiknar gagnafylki myndanna þriggja og
% hverja tölu í texta greinarinnar (sjá gagnaskra.csv):
%   nidurstodur/kaupmattur_fjordungar.csv   Mynd 1: LCI/SVN, 1. ársfj. 2013 = 100
%   nidurstodur/kaupmattur_2007.csv         Mynd 2: árlegar raðir, 2007 = 100
%   nidurstodur/kaupmattur_2000.csv         Mynd 3: sömu raðir, 2000 = 100
%   nidurstodur/hagvoxtur.csv               10 ára hagvöxtur, heild og á mann, röðun
%   nidurstodur/reiknud_husaleiga.csv       hlutfall reiknaðrar húsaleigu af einkaneyslu
%   nidurstodur/utreikningar.txt            hver tala gagnaskrárinnar: reiknað gildi
%                                           á móti grein, vikmörk og OK/FRÁVIK
% Norðurlönd í ESB eru alls staðar Danmörk, Svíþjóð og Finnland, vegin með
% fjölda launþega hvers árs — ESB-línan er í reynd vegið meðaltal og því á
% það sama við hér.
% Keyrsla: matlab -batch "reikna_nidurstodur"  (R2022a eða nýrra)

klukka = tic;
rot = fileparts(mfilename('fullpath'));
ut = fullfile(rot, 'nidurstodur');
if ~exist(ut, 'dir'); mkdir(ut); end

o = delimitedTextImportOptions('NumVariables', 5, 'Delimiter', ';', ...
    'VariableNames', {'svaedi','tidni','timabil','breyta','gildi'}, ...
    'VariableTypes', {'string','string','string','string','double'}, ...
    'DataLines', 2, 'Encoding', 'UTF-8');
T = readtable(fullfile(rot, 'gogn', 'gogn.csv'), o);

NORD = ["DK", "SE", "FI"];
R = cell(0, 6);   % safnlisti utreikningar.txt: {nr, lýsing, reiknað, grein, vikmörk, staða}

%% ---- Mynd 1: kaupmáttur launa samkvæmt mælikvarða Áfram Íslands ----
K = struct();
for g = ["IS", "EU27_2020", NORD]
    [tl, lci] = rodq(T, "lci_d11", g);
    [ts, svn] = rodq(T, "svn_fjordungur", g);
    [sam, il, iv] = intersect(tl, ts);
    v = lci(il) ./ svn(iv);
    v = v / v(sam == "2013-Q1") * 100;
    inni = sam >= "2013-Q1" & sam <= "2025-Q4";
    K.(char(g)).t = sam(inni); K.(char(g)).v = v(inni);
end
tN = K.DK.t;
assert(isequal(tN, K.SE.t, K.FI.t), 'ársfjórðungar Norðurlandanna ósamstíga');
arQ = double(extractBefore(tN, 5));
vog = @(g) arrayfun(@(y) stak(T, "launthegar", g, string(y)), arQ);
wDK = vog("DK"); wSE = vog("SE"); wFI = vog("FI");
vN = (K.DK.v .* wDK + K.SE.v .* wSE + K.FI.v .* wFI) ./ (wDK + wSE + wFI);

M = table(K.IS.t, round(K.IS.v, 2), round(K.EU27_2020.v, 2), round(vN, 2), ...
    'VariableNames', {'timabil','island','esb','nordurlond'});
skrifa(M, fullfile(ut, 'kaupmattur_fjordungar.csv'));

R = bera(R, "K04a", "Mynd 1 og meginmál: kaupmáttur ÍS 2013-2025, % (birt 68; endurgerð +67)", K.IS.v(end)-100, 68, 1.0);
R = bera(R, "K04b", "Mynd 1 og meginmál: ESB, %", K.EU27_2020.v(end)-100, 8, 0.5);
R = bera(R, "K04c", "Mynd 1 og meginmál: Norðurlönd í ESB, %", vN(end)-100, 6, 0.5);

%% ---- Myndir 2 og 3: kaupmáttur árslauna á hvern launþega ----
% Laun (D11) á launþega deilt með einkaneysluverðvísitölu þjóðhagsreikninga
% (þ.m.t. reiknuð húsnæðisþjónusta eigenda), sama regla á öll lönd;
% grunnár 2007 (síðasta árið fyrir hrun) og 2000 (fyrsta árið sem
% sambærileg gögn liggja fyrir). Brotalínan
% er mælikvarði Áfram Íslands fyrir Ísland (launakostnaður D1 á vinnustund
% / SVN); vísitölu neysluverðs-afbrigðið fer í neðanmálsgrein.
S = struct();
for g = ["IS", "EU27_2020", NORD]
    S.(char(g)) = hlutfall3(T, "laun_d11", "launthegar", "einkaneysluverd", g);
end
afram = hlutfall3(T, "launakostnadur_d1", "vinnustundir_launthega", "svn_arleg", "IS");
kvnv = hlutfall3(T, "laun_d11", "launthegar", "vnv_medaltal_manada", "IS");
tNord = intersect(intersect(S.DK.t, S.SE.t), S.FI.t);
wN = @(g) arrayfun(@(y) stak(T, "launthegar", g, string(y)), tNord);

for grunnar = [2007, 2000]
    ar = (grunnar:2025)';
    vt = @(s) arrayfun(@(y) nadu(s.t, s.v / s.v(s.t == grunnar) * 100, y), ar);
    nefn = @(g) nadu2(tNord, S.(char(g)).v(ismember(S.(char(g)).t, tNord)), grunnar);
    vNa = (S.DK.v(ismember(S.DK.t, tNord)) / nefn("DK") .* wN("DK") + ...
           S.SE.v(ismember(S.SE.t, tNord)) / nefn("SE") .* wN("SE") + ...
           S.FI.v(ismember(S.FI.t, tNord)) / nefn("FI") .* wN("FI")) * 100 ...
          ./ (wN("DK") + wN("SE") + wN("FI"));
    nordur = arrayfun(@(y) nadu(tNord, vNa, y), ar);
    M = table(ar, round(vt(afram), 2), round(vt(S.IS), 2), round(vt(S.EU27_2020), 2), ...
        round(nordur, 2), round(vt(kvnv), 2), ...
        'VariableNames', {'ar','afram_island','island','esb','nordurlond','island_vnv'});
    skrifa(M, fullfile(ut, sprintf('kaupmattur_%d.csv', grunnar)));

    lok = @(d) d(end) - 100;
    if grunnar == 2007
        R = bera(R, "K05a", "Mynd 2: Ísland 2007-2025, %", lok(M.island), 3, 0.5);
        R = bera(R, "K05b", "Mynd 2: ESB 2007-2025, %", lok(M.esb), 15, 0.5);
        R = bera(R, "K05c", "Mynd 2: Norðurlönd í ESB 2007-2025, %", lok(M.nordurlond), 12, 0.5);
        R = bera(R, "K05d", "Mynd 2 nmgr.: árleg nálgun á +68% (2013-2025), %", ...
            M.afram_island(end) / M.afram_island(ar == 2013) * 100 - 100, 63, 0.5);
        R = bera(R, "K05e", "Mynd 2 nmgr.: Ísland m.v. vísitölu neysluverðs, %", lok(M.island_vnv), 6, 0.5);
    else
        R = bera(R, "K06a", "Mynd 3: Ísland 2000-2025, %", lok(M.island), 24, 0.5);
        R = bera(R, "K06b", "Mynd 3: ESB 2000-2025, %", lok(M.esb), 19, 0.5);
        R = bera(R, "K06c", "Mynd 3: Norðurlönd í ESB 2000-2025, %", lok(M.nordurlond), 27, 0.5);
        R = bera(R, "K06d", "Mynd 3 nmgr.: Ísland m.v. vísitölu neysluverðs, %", lok(M.island_vnv), 26, 0.6);
        R = bera(R, "K06e", "Mynd 3: mælikvarði ÁÍ framlengdur til aldamóta, %", lok(M.afram_island), 98, 0.5);
        % meginmál: "heldur hægar en á Norðurlöndunum ... aðeins hraðar en í ESB í heild"
        R = bera(R, "K07a", "meginmál: Ísland undir Norðurlöndum frá 2000 (1 = satt)", ...
            double(lok(M.island) < lok(M.nordurlond)), 1, 0);
        R = bera(R, "K07b", "meginmál: Ísland yfir ESB frá 2000 (1 = satt)", ...
            double(lok(M.island) > lok(M.esb)), 1, 0);
    end
end

%% ---- Hagvöxtur: 10 ára meðaltal 2016-2025, heild og á mann, röðun ----
KOD = ["BE","BG","CZ","DK","DE","EE","IE","EL","ES","FR","HR","IT","CY","LV", ...
       "LT","LU","HU","MT","NL","AT","PL","PT","RO","SI","SK","FI","SE"];
NOFN = ["Belgía","Búlgaría","Tékkland","Danmörk","Þýskaland","Eistland","Írland", ...
        "Grikkland","Spánn","Frakkland","Króatía","Ítalía","Kýpur","Lettland", ...
        "Litáen","Lúxemborg","Ungverjaland","Malta","Holland","Austurríki", ...
        "Pólland","Portúgal","Rúmenía","Slóvenía","Slóvakía","Finnland","Svíþjóð"];
ALLK = [KOD, "IS"]; ALLN = [NOFN, "Ísland"];
medal10 = @(rodh, sv) mean(arsruna(T, rodh, sv, 2016, 2025));
p10 = arrayfun(@(k) medal10("hagvoxtur_a_mann", k), ALLK);
v10 = arrayfun(@(k) medal10("hagvoxtur", k), ALLK);
q10 = medal10("hagvoxtur_a_mann", "EU27_2020");
e10 = medal10("hagvoxtur", "EU27_2020");
P = table(ALLK', ALLN', p10', v10', 'VariableNames', {'kodi','land','a_mann_10ara','heild_10ara'});
P = sortrows(P, {'a_mann_10ara','kodi'}, {'descend','ascend'});
P.saeti = (1:height(P))';
M = [table(P.saeti, P.land, round(P.a_mann_10ara,2), round(P.heild_10ara,2), ...
     'VariableNames', {'saeti','land','a_mann_10ara','heild_10ara'});
     {0, "ESB-27", round(q10,2), round(e10,2)}];
skrifa(M, fullfile(ut, 'hagvoxtur.csv'));

R = bera(R, "K01a", "heildarhagvöxtur ÍS 2016-2025, %/ári (grein vitnar í 2,9)", medal10("hagvoxtur","IS"), 2.9, 0.15);
R = bera(R, "K01b", "heildarhagvöxtur ESB 2016-2025, %/ári (grein vitnar í 1,6)", e10, 1.6, 0.05);
R = bera(R, "K02a", "hagvöxtur á mann ÍS 2016-2025, %/ári", medal10("hagvoxtur_a_mann","IS"), 0.86, 0.005);
R = bera(R, "K02b", "hagvöxtur á mann ESB 2016-2025, %/ári", q10, 1.39, 0.005);
R = bera(R, "K03",  "sæti ÍS í hagvexti á mann (af 28)", find(P.kodi == "IS"), 23, 0);

%% ---- Reiknuð húsaleiga: hlutfall af allri einkaneyslu (THJ02103) ----
% liðurinn sem SVN sleppir: 04.2 Reiknuð húsaleiga sem hlutfall af
% einkaneyslu alls (S14+S15), verðlag hvers árs; 2023-2025 bráðabirgðatölur
[th, rh] = arleg(T, "reiknud_husaleiga", "IS");
[ta, ea] = arleg(T, "einkaneysla_alls", "IS");
sam_h = intersect(th, ta);
hlutf = 100 * rh(ismember(th, sam_h)) ./ ea(ismember(ta, sam_h));
syna = ismember(sam_h, [2013, 2023, 2024, 2025]);
M = table(sam_h(syna), round(hlutf(syna), 2), ...
    'VariableNames', {'ar','hlutfall_af_einkaneyslu'});
skrifa(M, fullfile(ut, 'reiknud_husaleiga.csv'));
R = bera(R, "K10", "reiknuð húsaleiga (04.2) sem hlutfall af einkaneyslu 2025, %", ...
    hlutf(sam_h == 2025), 15.6, 0.05);
R = skra(R, "K09", "Gvæjana í 2. sæti (tilvitnun í samfélagsmiðlafærslu Konráðs)", ...
    "tilvitnun, ekki endurreiknað hér", "tilvitnun, ekki endurreiknað hér");

%% ---- utreikningar.txt og samantekt ----
Rt = sortrows(cell2table(R, 'VariableNames', {'nr','lysing','reiknad','grein','vik','stada'}), 'nr');
R = table2cell(Rt);
fid = fopen(fullfile(ut, 'utreikningar.txt'), 'w', 'n', 'UTF-8');
fprintf(fid, "UTREIKNINGAR — hver tala greinarinnar gegn gagnaskránni (gagnaskra.csv)\n");
fprintf(fid, "Inntak: gogn/gogn.csv. Vikmörk talna sem birtast námundaðar í heilum\n");
fprintf(fid, "prósentum eru 0,5; sæti og talningar 0; tölur með aukastaf 0,005.\n");
fprintf(fid, "Tölur sem greinin vitnar í (K01) eru bornar saman við eigin endurgerð\n");
fprintf(fid, "með rýmri vikmörkum.\n");
fprintf(fid, "%s\n", repmat('-', 1, 116));
fprintf(fid, "%-6s %-76s %12s %12s %8s %s\n", "nr", "lýsing", "reiknað", "í grein", "vikmörk", "staða");
fprintf(fid, "%s\n", repmat('-', 1, 116));
n_ok = 0; n_fr = 0; fravik = strings(0, 1);
for j = 1:size(R, 1)
    fprintf(fid, "%-6s %-76s %12s %12s %8s %s\n", R{j,1}, R{j,2}, R{j,3}, R{j,4}, R{j,5}, R{j,6});
    if R{j,6} == "OK"; n_ok = n_ok + 1;
    else
        n_fr = n_fr + 1;
        fravik(end+1) = sprintf("%s: reiknað %s, í grein %s (%s)", R{j,1}, R{j,3}, R{j,4}, R{j,2}); %#ok<SAGROW>
    end
end
fprintf(fid, "%s\n", repmat('-', 1, 116));
fprintf(fid, "SAMTALS: %d línur, %d OK, %d FRÁVIK.\n", size(R,1), n_ok, n_fr);
if n_fr > 0
    fprintf(fid, "FRÁVIKIN:\n");
    for j = 1:numel(fravik); fprintf(fid, "  %s\n", fravik(j)); end
end
fclose(fid);
fprintf("utreikningar.txt: %d línur, %d OK, %d FRÁVIK\n", size(R,1), n_ok, n_fr);
for j = 1:numel(fravik); fprintf("  FRÁVIK %s\n", fravik(j)); end
fprintf("niðurstöðuskrár skrifaðar í %s\nKeyrslutími: %.0f sek.\n", ut, toc(klukka));

%% ================= Hjálparföll =================
function [t, v] = rodq(T, breyta, sv)             % ársfjórðungsröð í tímaröð
    k = T.breyta == breyta & T.svaedi == sv & T.tidni == "Q";
    [t, i] = sort(T.timabil(k)); g = T.gildi(k); v = g(i);
end

function [t, v] = arleg(T, breyta, sv)            % árleg röð, ártöl sem tölur
    k = T.breyta == breyta & T.svaedi == sv & T.tidni == "A";
    ar = double(T.timabil(k)); g = T.gildi(k);
    [t, i] = sort(ar); v = g(i);
end

function s = hlutfall3(T, teljari, nefnari1, nefnari2, sv)
% (a/b)/c á sameiginlegum árum raðanna þriggja
    [ta, a] = arleg(T, teljari, sv);
    [tb, b] = arleg(T, nefnari1, sv);
    [tc, c] = arleg(T, nefnari2, sv);
    t = intersect(intersect(ta, tb), tc);
    s.t = t;
    s.v = (a(ismember(ta, t)) ./ b(ismember(tb, t))) ./ c(ismember(tc, t));
end

function v = stak(T, breyta, sv, timabil)         % nákvæmlega eitt gildi, annars villa
    k = T.breyta == breyta & T.svaedi == sv & T.timabil == timabil;
    assert(nnz(k) == 1, 'stak: %s %s %s -> %d línur', breyta, sv, timabil, nnz(k));
    v = T.gildi(k);
end

function g = nadu(t, v, y)                        % gildi árs y, NaN ef vantar
    k = t == y;
    if nnz(k) == 1; g = v(k); else; g = NaN; end
end

function g = nadu2(t, v, y)                       % gildi árs y, villa ef vantar
    k = t == y;
    assert(nnz(k) == 1, 'nadu2: árið %d vantar', y);
    g = v(k);
end

function v = arsruna(T, breyta, sv, fra, til)     % árleg runa, fullyrt að ekkert ár vanti
    [t, g] = arleg(T, breyta, sv);
    m = t >= fra & t <= til;
    assert(nnz(m) == til - fra + 1, 'arsruna: %s %s vantar ár á %d-%d', breyta, sv, fra, til);
    v = g(m);
end

function skrifa(M, skra)
    writetable(M, skra, 'FileType', 'text', 'Delimiter', ';', 'Encoding', 'UTF-8', ...
        'QuoteStrings', 'minimal');
end

function R = bera(R, nr, lysing, reiknad, grein, vik)   % talnasamanburður
    if abs(reiknad - grein) <= vik + 1e-9; st = "OK"; else; st = "FRÁVIK"; end
    R(end+1, :) = {string(nr), string(lysing), isl(reiknad), isl(grein), isl(vik), st};
end

function R = skra(R, nr, lysing, reiknad, grein)        % textasamanburður (bergmál)
    if string(reiknad) == string(grein); st = "OK"; else; st = "FRÁVIK"; end
    R(end+1, :) = {string(nr), string(lysing), string(reiknad), string(grein), "-", st};
end

function s = isl(v)                               % tala með tugstafskommu, hófleg nákvæmni
    if abs(v - round(v)) < 1e-9; s = sprintf('%d', round(v));
    else; s = strrep(sprintf('%.4g', v), '.', ',');
    end
end
