%% https://gitlab.rc.uab.edu/cbsmith2/transcription-save-script
%% Main code
% Prepare work space
clc

checkVersion()

% Check for miscelaneous transcriptions in the work space
miscLS = who('-regexp', '^ls(([0-9]*$)|($))');
newLS = CheckmiscLS(miscLS);
if ~isempty(newLS); ls = eval(newLS); end

% Search the workspace for ls and lss and check for the tracker
if ~ValidateWorkspace(ls, lss); return; end

% Update progress
if ~exist('remainingFiles', 'var'); remainingFiles = []; end
remainingFiles = FindRemainingFiles(ls, lss, remainingFiles);

% Transfer labels
lss = TransferLabels(ls, lss);

% Prompt user for Inits
reviewerInit = input('Please enter your initials: ', 's');

% Save latest transcription and progress
uisave({'lss', 'remainingFiles', 'reviewerInit'}, '*.mat')


%% Functions
function ls = CheckmiscLS(miscLS)

if isempty(miscLS); error('No valid ls transcription file was found in the workspace. Please check that the file has been exported from the application.'); end
if length(miscLS) == 1
    ls = string(miscLS); 
    fprintf('Variable %s will be used as the user transcription variable.\n', ls)
    return
end

fprintf(2, 'Warning: multiple potential ''ls'' files were found in the work space. \n\n')

nLS = length(miscLS);
lsNames = string(miscLS);
formatPat = '\t%i. %s\n';
formattedstring = compose(formatPat, (1:nLS)', lsNames);
listSet = join(formattedstring' , '');

validResp = 0:nLS;
while true
    fprintf('Select the most up to date ls file by inputing a number from 0 to %i\n', nLS)
    fprintf(listSet{1});
    userResp = input('Resp:');

    if any(ismember(validResp, userResp))
        fprintf('%s has been selected.\n', lsNames(userResp))
        break
    else
        fprintf('%i is an invalid response.\n', userResp)
    end
end

ls = lsNames(userResp);

end

function extStatus = ValidateWorkspace(ls, lss)

if ~exist("ls", "var")
    fprintf(2, 'No exported transcript found. Please export your transciription to the work space as ''ls''\n')
    extStatus = false;
    return
end

if ~exist("lss", 'var')
    fprintf(2, 'The original transcription file is missing, please ensure the work you have done is saved to ''ls'' and load in the original transcription\n');
    extStatus = false;
    return
end

extStatus = true;

end

function remainingFiles = FindRemainingFiles(ls, lss, remainingFiles)

% Find identical labels
nFiles = lss.NumMembers;
isUntouched = false(nFiles, 1);
for i = 1:nFiles
    isUntouched(i) = isequal(ls.Labels.Words{i}.ROILimits, lss.Labels.Words{i}.ROILimits);
end

% Account for previosuly edited files
if ~isempty(remainingFiles)
    wasPreviouslyUntouched = ~ismember(1:nFiles, remainingFiles.File_Pos);
    isUntouched(wasPreviouslyUntouched) = false;
end

% Prepare output
File_Pos = find(isUntouched);
memberNames = ls.getMemberNames;
File_Name = memberNames(isUntouched);
remainingFiles = table(File_Pos, File_Name);

end

function lss = TransferLabels(ls, lss)

% Clear lss labels
resetLabelValues(lss)

removeLabelDefinition(lss, "Words")

addLabelDefinitions(lss, getLabelDefinitions(ls))

% Get list of sublabels
lsSubLabelList = split(strtrim(extract(labelDefinitionsHierarchy(ls), regexpPattern('(?<=Sublabels:).*'))));

% Move ls labels to lss
nTrials = height(ls.Labels);
for iTrial = 1:nTrials
    curROI = ls.Labels.Words{iTrial}.ROILimits;
    curVal = ls.Labels.Words{iTrial}.Value;
    if isempty(curROI)
        continue
    end

    % Set Main label
    setLabelValue(lss, iTrial, 'Words', curROI, curVal)
    
    % Set sublabel Values
    curSpans = ls.Labels.Words{iTrial};
    nSpans = height(curSpans);
    for iSpan = 1:nSpans
        for curLabel = lsSubLabelList'
            labelValues = ls.Labels.Words{iTrial}.Sublabels.(curLabel{1});

            if isa(labelValues, 'cell')
                labelValue = labelValues{iSpan};
            else
                labelValue = labelValues(iSpan);
            end

            setLabelValue(lss, iTrial, ["Words", string(curLabel)], labelValue, "LabelRowIndex", iSpan)
        end
    end

end

end

%% Git managment
function checkVersion()
    % Check if the current directory is a Git repository
    if ~isGitRepository()
        warning('This is not a Git repository. The version you are using cannot be checked against the shared repository. Enable Git and make sure this is a git repository to validate versions.\n The most up to date code can be found at: https://gitlab.rc.uab.edu/cbsmith2/transcription-save-script');
    end
    
    % Fetch the latest changes from the remote repository
    system('git fetch origin');
    
    % Get the current branch name
    [~, currentBranch] = system('git rev-parse --abbrev-ref HEAD');
    currentBranch = strtrim(currentBranch);
    
    % Get the local and remote commit hashes
    localCommit = getGitCommitHash();
    remoteCommit = getRemoteCommit_hash(currentBranch);
    
    % Compare the local and remote commits
    if strcmp(localCommit, remoteCommit)
        disp('Your local branch is up-to-date with the remote branch.');
    else
        fprintf(2, 'WARNING: Your local branch is out of date with the remote.\n');
        fprintf(['\tLocal commit: ' localCommit '\n']);
        fprintf(['\tRemote commit: ' remoteCommit '\n']);
        fprintf('\tPlease run "git pull" to update your local code.\n');
        error('Invalid version.')
    end
end

function isGit = isGitRepository()
    % Check if the current directory is a Git repository by checking for the existence of a .git directory
    isGit = exist('.git', 'dir') == 7;
end

function commitHash = getGitCommitHash()
    % Get the commit hash of the current branch locally
    [~, commitHash] = system('git rev-parse HEAD');
    commitHash = strtrim(commitHash);  % Remove any trailing newline or space
end

function remoteCommit = getRemoteCommit_hash(branch)
    % Get the commit hash of the remote branch
    [~, remoteCommit] = system(['git rev-parse origin/' branch]);
    remoteCommit = strtrim(remoteCommit);  % Remove any trailing newline or space
end