% Inspired by:
%
%  https://support.astron.nl/confluence/display/~kruger/Confluence+to+latex+to+pdf
%  https://lsst-texmf.lsst.io
\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{astron}[ASTRON document class]

% Handle various document types, adding appropriate warning messages.
% Document type is specified as a class option; if none is specified, we use "undefined".
\newif\if@hastype
\@hastypefalse
\newcommand{\docType}{Undefined}

\DeclareOption{note}{
  \newcommand{\docTypeDescription}{
    \fbox{%
      \begin{minipage}{\dimexpr\linewidth-2\fboxrule-2\fboxsep}
        \begin{center}
          \begin{small}
          This technical note expresses the opinions of the authors on the date of writing.\\
          It is not binding on the SDC Program, and may not accurately reflect future developments.
          \end{small}
        \end{center}
      \end{minipage}%
    }
  }

  \renewcommand{\docType}{Tech. Note}
  \@hastypetrue
}

\DeclareOption{proposed}{
  \newcommand{\docTypeDescription}{
    \fbox{%
      \begin{minipage}{\dimexpr\linewidth-2\fboxrule-2\fboxsep}
        \begin{center}
          \begin{small}
          This document proposes a change to the technical baseline of the SDC Program.\\
          It is not binding on the Program until approved by a change control process.
          \end{small}
        \end{center}
      \end{minipage}%
    }
  }

  \renewcommand{\docType}{Proposed}
  \@hastypetrue
}

\DeclareOption{baseline}{
  \newcommand{\docTypeDescription}{
    \fbox{%
      \begin{minipage}{\dimexpr\linewidth-2\fboxrule-2\fboxsep}
        \begin{center}
          \begin{small}
          This document is part of the technical baseline of the SDC Program.\\
          It is binding on the activities of the Program.\\
          It may only be modified through a formal change control process.
          \end{small}
        \end{center}
      \end{minipage}%
    }
  }

  \renewcommand{\docType}{Baseline}
  \@hastypetrue
}
\ProcessOptions\relax

\LoadClass[a4paper,12pt,twoside]{article}

\newlength{\topMargin}
\newlength{\bottomMargin}
\newlength{\sideMargin}
\setlength{\topMargin}{3.5cm}
\setlength{\bottomMargin}{3.5cm}
\setlength{\sideMargin}{2cm}

\RequirePackage[absolute]{textpos}
\RequirePackage{biblatex}
\RequirePackage{fancyhdr}
\RequirePackage{geometry}
\RequirePackage[pdfborder={0 0 0}]{hyperref}
\RequirePackage[nonumberlist,nogroupskip]{glossaries}
\RequirePackage{graphicx}
\RequirePackage{lastpage}
\RequirePackage{libertinus}
\RequirePackage{microtype}
\RequirePackage{parskip}
\RequirePackage{tabularx}

% Link to document repositories for appropriate e-prints in the bibliography
\DeclareFieldFormat{eprint:sdc-handle}{%
  Doc handle\addcolon\space
    \href{https://git.astron.nl/swinbank/doc-#1}{#1}%
}

% Standard bibliography files included in this package
\addbibresource{astron.bib}
\addbibresource{general.bib}
\addbibresource{ivoa.bib}
\addbibresource{lofar.bib}
\addbibresource{sdc.bib}
\addbibresource{sdco.bib}

% No need for a fancy font for the URL
\urlstyle{same}

\geometry{tmargin=\topMargin,
          bmargin=\bottomMargin,
          lmargin=\sideMargin,
          rmargin=\sideMargin,
          headheight=52.05211pt}

\newcommand{\docTitle}{Set the document title with \texttt{\textbackslash{}setDocTitle}}
\newcommand{\setDocTitle}[1]{
   \renewcommand{\docTitle}{#1}
}

\newcommand{\docNumber}{Set the document number with \texttt{\textbackslash{}setDocNumber}}
\newcommand{\setDocNumber}[1]{
   \renewcommand{\docNumber}{#1}
}

\newcommand{\docRevision}{Set the document revision with \texttt{\textbackslash{}setDocRevision}}
\newcommand{\setDocRevision}[1]{
   \renewcommand{\docRevision}{#1}
}

\newcommand{\docDate}{Set the document date with \texttt{\textbackslash{}setDocDate}}
\newcommand{\setDocDate}[1]{
   \renewcommand{\docDate}{#1}
}

\newcommand{\docProgram}{Set the document program with \texttt{\textbackslash{}setDocProgram}}
\newcommand{\setDocProgram}[1]{
   \renewcommand{\docProgram}{#1}
}

%
% Document history
%
\providecommand{\addChangeRecord}[3]{ #1 & #2 & #3 \tabularnewline \hline}
\newcommand{\docChangeRecord}{
... & ... & ... \tabularnewline \hline
}
\newcommand{\setDocChangeRecord}[1]{\renewcommand{\docChangeRecord}
{
#1
}}

\newcommand{\changeRecord}{%
  \clearpage
  \section*{Document History}
  \begin{tabularx}{\textwidth}{|X|p{0.13\textwidth}|p{0.68\textwidth}|X|}
    \hline
    \textbf{Revision} & \textbf{Date} & \textbf{Description} \tabularnewline
    \hline\hline
    \docChangeRecord
  \end{tabularx}
  \clearpage
}

%
% Define authors, approvers, etc for the front page
%
\providecommand{\addPerson}[3]{ #1 & #2 & #3 \tabularnewline}

\newcommand{\docAuthors}{
... & ... & ... \tabularnewline
}
\newcommand{\setDocAuthors}[1]{\renewcommand{\docAuthors}
{
#1
}}

\newcommand{\docCheckers}{
... & ... & ... \tabularnewline
}
\newcommand{\setDocCheckers}[1]{\renewcommand{\docCheckers}
{
#1
}}

\newcommand{\docApprovers}{
... & ... & ... \tabularnewline
}
\newcommand{\setDocApprovers}[1]{\renewcommand{\docApprovers}
{
#1
}}

\newcommand{\docAuthorizers}{
... & ... & ... \tabularnewline
}
\newcommand{\setDocAuthorizers}[1]{\renewcommand{\docAuthorizers}
{
#1
}}

\newcommand{\authorTable}{%
  \begin{tabularx}{\textwidth}{|p{0.35\textwidth}|p{0.35\textwidth}|X|}
    \cline{2-3} \cline{3-3}
    \multicolumn{1}{c|}{} &
    \textbf{\footnotesize{}Organisatie / Organization} &
    \textbf{\footnotesize{}Datum / Date} \tabularnewline
    \hline
    \textbf{\footnotesize{}Auteur(s) / Author(s):\vspace{0.2cm}} & & \tabularnewline
    \docAuthors
    \hline
    \textbf{\footnotesize{}Controle / Checked:\vspace{0.2cm}} & & \tabularnewline
    \docCheckers
    \hline
    \textbf{\footnotesize{}Goedkeuring / Approval:\vspace{0.2cm}} & & \tabularnewline
    \docApprovers
    \hline
    \textbf{\footnotesize{}Autorisatie / Authorization:} & & \tabularnewline
    \docAuthorizers
    \textbf{\footnotesize{}Handtekening / Signature:\vspace{1cm}} & & \tabularnewline
    \hline
  \end{tabularx}
}

%
% Define headers and footers
%
\pagestyle{fancy}
\fancyhf{}
\lfoot{\thepage \hspace{1pt} / \pageref{LastPage}}
\rfoot{
\begin{tabular}{>{\raggedright}ll}
 Doc. Nr.: & \docNumber{}\tabularnewline
 Rev.: & \docRevision{}\tabularnewline
 Date: & \docDate{}\tabularnewline
 Doc. Type: & \docType{}\tabularnewline
\end{tabular}
}

\rhead{\includegraphics[width=8cm]{astron-logo}}
\cfoot{\textbf{\large{}\docProgram{}}}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{1pt}
\footskip2cm

%
% Construct the title page, history, etc.
%
\renewcommand{\maketitle}{
\vspace*{4cm}
\begin{center}
\begin{minipage}{0.7\textwidth}
\centering\LARGE\textbf{\docTitle{}}
\end{minipage}
\end{center}

% This position was determined by trial and error; a bit unsatisfying.
\newlength{\copyrightBoxPosition}
\setlength{\copyrightBoxPosition}{25.2cm}

% Add the copyright notice towards the bottom of the page.
\begin{textblock*}{1\textwidth}(\sideMargin, \copyrightBoxPosition)
  \fbox{%
    \begin{minipage}{\dimexpr\linewidth-2\fboxrule-2\fboxsep}
      \begin{center}
        \begin{small}
          \textcopyright{} ASTRON 2020.\\
          All rights are reserved. Reproduction in whole or in part is\\
          prohibited without written consent of the copyright owner.
        \end{small}
      \end{center}
    \end{minipage}%
  }
\end{textblock*}

% We generate the author table once (but don't print it) to measure its height,
% then use that to position the textblock* which ultimately contains the table.
% Note the measured height is (approximately) half the full height.
\newlength{\authorTableHalfHeight}
\settoheight{\authorTableHalfHeight}{\authorTable}

\if@hastype
  \newlength{\docTypeHalfHeight}
  \settoheight{\docTypeHalfHeight}{\docTypeDescription}
  \begin{textblock*}{1\textwidth}(\sideMargin,
                                  \dimexpr\copyrightBoxPosition-2\docTypeHalfHeight+\fboxsep)
  \docTypeDescription
  \end{textblock*}

  \begin{textblock*}{1\textwidth}(\sideMargin,
                                  \dimexpr\copyrightBoxPosition-2\docTypeHalfHeight-2\authorTableHalfHeight+2\fboxsep)
  \authorTable
  \end{textblock*}
\else
  \begin{textblock*}{1\textwidth}(\sideMargin,
                                  \dimexpr\copyrightBoxPosition-2\authorTableHalfHeight+\fboxsep)
  \authorTable
  \end{textblock*}
\fi


\clearpage

\changeRecord
}
