%% byggja_gogn.m — byggir gogn/gogn.csv úr frystu frumgögnunum í gogn/hra/
% Les frystu niðurhölin (Eurostat SDMX-CSV og JSON-stat; Hagstofa px-JSON
% og JSON-stat 2.0)
% og skrifar allt í eina langa töflu, gogn/gogn.csv, með fimm dálkum:
%   svaedi;tidni;timabil;breyta;gildi
% Engin nettenging; vefslóðir og sóknardagsetningar hráskránna eru í
% gogn/hra/HEIMILDIR.txt. Ársfjórðungsmeðaltal SVN er reiknað hér úr
% mánaðartölunum; annað er fært óbreytt.
% Keyrsla: matlab -batch "byggja_gogn"  (MATLAB R2022a eða nýrra)

klukka = tic;
rot = fileparts(mfilename('fullpath'));
hra = fullfile(rot, 'gogn', 'hra');
LOND = ["IS", "EU27_2020", "DK", "SE", "FI"];
U = cell(0, 5);   % svaedi, tidni, timabil, breyta, gildi

%% ---- Eurostat, árlegar raðir: laun, verðvísitölur, launþegar ----
G = lesa_sdmx(fullfile(hra, 'estat_nama_10_gdp_laun.csv'));
U = baeta(U, G(G.na_item == "D11" & G.unit == "CP_MNAC", :), "A", "laun_d11");
U = baeta(U, G(G.na_item == "D1"  & G.unit == "CP_MNAC", :), "A", "launakostnadur_d1");
U = baeta(U, G(G.na_item == "P31_S14_S15" & G.unit == "PD15_NAC", :), "A", "einkaneysluverd");

E = lesa_sdmx(fullfile(hra, 'estat_nama_10_a10_e_launthegar.csv'));
U = baeta(U, E(E.unit == "THS_PER", :), "A", "launthegar");
U = baeta(U, E(E.unit == "THS_HW", :),  "A", "vinnustundir_launthega");

H = lesa_sdmx(fullfile(hra, 'estat_prc_hicp_aind_cp00.csv'));
U = baeta(U, H, "A", "svn_arleg");

%% ---- Eurostat, ársfjórðungsraðir: LCI og SVN (meðaltal mánaða) ----
for g = LOND
    L = lesa_sdmx(fullfile(hra, sprintf('estat_lc_lci_r2_q_%s.csv', g)));
    L = L(L.lcstruct == "D11" & L.s_adj == "SCA" & L.unit == "I20", :);
    U = baeta(U, L, "Q", "lci_d11");
    M = lesa_sdmx(fullfile(hra, sprintf('estat_prc_hicp_midx_%s.csv', g)));
    fj = extractBefore(M.TIME_PERIOD, 5) + "-Q" + ...
         string(ceil(double(extractAfter(M.TIME_PERIOD, 5)) / 3));
    [fjord, ~, k] = unique(fj);
    m = accumarray(k, double(M.OBS_VALUE), [], @mean);
    for i = 1:numel(fjord)
        U(end+1, :) = {g, "Q", fjord(i), "svn_fjordungur", m(i)};
    end
end

%% ---- Eurostat, JSON-stat: hagvöxtur og hagvöxtur á mann ----
V = afkoda_jsonstat(fileread(fullfile(hra, 'eurostat_nama_10_gdp_voxtur.json'), 'Encoding', 'UTF-8'));
for i = 1:height(V); U(end+1, :) = {V.geo(i), "A", V.time(i), "hagvoxtur", V.gildi(i)}; end

W = afkoda_jsonstat(fileread(fullfile(hra, 'eurostat_nama_10_pc_voxtur.json'), 'Encoding', 'UTF-8'));
for i = 1:height(W); U(end+1, :) = {W.geo(i), "A", W.time(i), "hagvoxtur_a_mann", W.gildi(i)}; end

%% ---- Hagstofa: einkaneysla eftir útgjaldaflokkum (THJ02103) ----
% reiknuð húsaleiga (04.2, skipting 12) og einkaneysla alls (skipting 0),
% verðlag hvers árs (mælikvarði 0)
N = afkoda_jsonstat(fileread(fullfile(hra, 'hagstofa_THJ02103_einkaneysla.json'), 'Encoding', 'UTF-8'));
N = N(N.("Mælikvarði") == "0", :);
h = N(N.("Skipting") == "12", :);
a = N(N.("Skipting") == "0", :);
for i = 1:height(h); U(end+1, :) = {"IS", "A", h.("Ár")(i), "reiknud_husaleiga", h.gildi(i)}; end
for i = 1:height(a); U(end+1, :) = {"IS", "A", a.("Ár")(i), "einkaneysla_alls", a.gildi(i)}; end

%% ---- Hagstofa: VNV, mánaðarleg (fyrir neðanmálsgreinar myndanna) ----
% ársmeðaltal heilla ára — sama viðmiðun og í kaupmáttarpakkanum á
% gautieggertsson.github.io/kaupmattur
j = jsondecode(fileread(fullfile(hra, 'hagstofa_VIS01000_cpi.json'), 'Encoding', 'UTF-8'));
man = strings(numel(j.data), 1); gildi = NaN(numel(j.data), 1);
for i = 1:numel(j.data)
    man(i) = string(j.data(i).key{1});
    gildi(i) = str2double(j.data(i).values{1});
end
ar = extractBefore(man, 5);
[arin, ~, k] = unique(ar);
fjoldi = accumarray(k, 1);
medal = accumarray(k, gildi, [], @mean);
for i = 1:numel(arin)
    if fjoldi(i) == 12
        U(end+1, :) = {"IS", "A", arin(i), "vnv_medaltal_manada", medal(i)};
    end
end

%% ---- Skrifa gogn/gogn.csv ----
T = cell2table(U, 'VariableNames', {'svaedi','tidni','timabil','breyta','gildi'});
T.svaedi = string(T.svaedi); T.tidni = string(T.tidni);
T.timabil = string(T.timabil); T.breyta = string(T.breyta);
T = sortrows(T, {'breyta','svaedi','timabil'});
writetable(T, fullfile(rot, 'gogn', 'gogn.csv'), 'FileType', 'text', ...
    'Delimiter', ';', 'Encoding', 'UTF-8', 'QuoteStrings', 'minimal');
fprintf('gogn/gogn.csv: %d línur, %d breytur. Keyrslutími: %.0f sek.\n', ...
    height(T), numel(unique(T.breyta)), toc(klukka));

%% ================= Hjálparföll =================
function T = lesa_sdmx(skra)
% Eurostat SDMX-CSV (haus á fyrstu línu), allir dálkar lesnir sem strengir
fid = fopen(skra, 'r', 'n', 'UTF-8');
haus = strsplit(fgetl(fid), ','); fclose(fid);
o = delimitedTextImportOptions('NumVariables', numel(haus), 'Delimiter', ',', ...
    'VariableNames', matlab.lang.makeValidName(haus), ...
    'VariableTypes', repmat({'string'}, 1, numel(haus)), ...
    'DataLines', 2, 'Encoding', 'UTF-8');
T = readtable(skra, o);
end

function U = baeta(U, T, tidni, breyta)
% bætir Eurostat-línum (geo, TIME_PERIOD, OBS_VALUE) á langa listann
for i = 1:height(T)
    U(end+1, :) = {T.geo(i), tidni, T.TIME_PERIOD(i), breyta, double(T.OBS_VALUE(i))}; %#ok<AGROW>
end
end
