\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{thesis}[2025/05/10 Bachelor Thesis Class]

\newif\if@draftmark \@draftmarkfalse
\newif\if@primarytitle   \@primarytitletrue
\newif\if@secondarytitle \@secondarytitletrue


\DeclareOption{draftmark}{\@draftmarktrue}
\DeclareOption{noprimarytitle}{\@primarytitlefalse}
\DeclareOption{nosecondarytitle}{\@secondarytitlefalse}

\ProcessOptions \relax
\LoadClass[a4paper,12pt,oneside]{book}

% Load common packages
\RequirePackage{polyglossia}
\RequirePackage{fontspec}
\RequirePackage{titlesec}
\RequirePackage{titling}
\RequirePackage{fancyhdr}
\RequirePackage{geometry}
\RequirePackage{setspace}
\RequirePackage{graphicx}
\RequirePackage{svg}
\RequirePackage{etoolbox}
\RequirePackage[titles]{tocloft}
\RequirePackage{tocbibind}
\RequirePackage{indentfirst}
\RequirePackage{float}
\RequirePackage{amsmath,amsfonts,amssymb}
\RequirePackage[style=apa,%
                % dateabbrev=false,% when false, don't abbreviate months/year divisions
                % julian=true,% convert dates before gregorianstart to Julian Calendar
                % gregorianstart=1582-10-15,% Default
                % alldates=short,%
                % alldates=ymd,% Year-Month-Day format
                % alldates=iso,% ISO8601 format
                % alldatesusetime=true, % print time components in non-compact date ranges
                % alltimes=12h,%
                alltimes=24h,% prints 24 hour format times (default)
                % alltimes=24hcomp,% prints 24 hour compressed format times
                % seconds=true,% uncomment to print seconds
                % timezones=true,% uncomment to print timezones
                datezeros=false,% pad date components with zeros?
                dateera=secular,% prints BCE/CE controlled by dateerauto, datezeros
                % dateera=christian,% prints BC/AD controlled by dateerauto, datezeros
                % dateera=astronomical,% prints astronomical dates, controlled by datezeros
                dateeraauto=600,% Sets the max year ceiling for automatic printing of era
                % abbreviate=false,% prints full date localisation strings
                dateuncertain=true,%
                datecirca=true,%
                sorting=none,%
                backend=biber]{biblatex}
\RequirePackage{hyperref}
\RequirePackage[acronym, nogroupskip, toc]{glossaries}
% \RequirePackage{glossaries-extra}
% \RequirePackage{hyperxmp}

% Polyglossia set language
\setdefaultlanguage[variant=indonesian]{malay}
\setotherlanguage{english}

% Change "Bibliography" to "Daftar Pustaka" for book class
% \DefineBibliographyStrings{english}{%
% andothers={dkk\adddot},
% pages    ={hlm\adddot},
% }


% \DefineBibliographyStrings{english}{
%   bibliography = {Daftar Pustaka},
% }

% \DefineBibliographyStrings{american-apa}{%
%     bibliography = {Daftar Pustaka},
% }
% \renewcommand{\bibname}{DAFTAR PUSTAKA}

% Conditionally load the watermark package and settings
\if@draftmark
  \RequirePackage{draftwatermark}
  \SetWatermarkText{nuluh/thesis (wip)[draft: \today)}
  \SetWatermarkColor[gray]{0.8}
  \SetWatermarkFontSize{1.5cm}
  \SetWatermarkAngle{90}
  \SetWatermarkHorCenter{1.5cm}
  \RequirePackage[left]{lineno}
  \linenumbers
\fi

% Page layout
\geometry{left=4cm, top=3cm, right=3cm, bottom=3cm}
\setlength{\parskip}{0.5em}
% \setlength{\parindent}{0pt}

% Fonts
\defaultfontfeatures{Ligatures=TeX}
\setmainfont{Times New Roman}[
  SmallCapsFont  = {Latin Modern Roman}, % fallback for \textsc
]
\setsansfont{Arial}
\setmonofont{Courier New}

% Metadata commands
% \input{metadata}

% \newcommand{\setthesisinfo}[7]{%
%   \renewcommand{\thesistitle}{#1}%
%   \renewcommand{\studentname}{#2}%
%   \renewcommand{\studentid}{#3}%
%   \renewcommand{\program}{#4}%
%   \renewcommand{\faculty}{#5}%
%   \renewcommand{\university}{#6}%
%   \renewcommand{\yearofsubmission}{#7}%
% }

% % Header and footer
\fancypagestyle{fancy}{%
    \fancyhf{}
    \fancyhead[R]{\nouppercase{\rightmark}}
    \fancyhead[L]{\nouppercase{\leftmark}}
    \fancyfoot[C]{\thepage}
}
\fancypagestyle{fancyplainfrontmatter}{%
    \renewcommand{\headrulewidth}{0pt}
    \fancyfoot[C]{\thepage}
}
\fancypagestyle{fancyplain}{%
    \fancyhf{}
    \renewcommand{\headrulewidth}{0pt}
    \fancyhead[R]{\thepage}
}

% change the behaviour of \backmatter to change page number into roman by continue frontmatter page counter (modified from original book.cls)
\newcounter{savepagenumber}
\renewcommand\mainmatter{%
  \cleardoublepage
  \setcounter{savepagenumber}{\value{page}}
  \@mainmattertrue
  \pagenumbering{arabic}%
}
\renewcommand\backmatter{%
  \if@openright
    \cleardoublepage
  \else
    \clearpage
  \fi
  \pagenumbering{roman}%
  \setcounter{page}{\value{savepagenumber}}%
  \@mainmatterfalse
}

% Chapter formatting
\titlespacing{\chapter}{0pt}{0cm}{*1.5}

\titleformat{\chapter}[display]
  {\normalsize\bfseries\centering}
  {BAB~\Roman{chapter}} % << display format
  {1ex}
  {\MakeUppercase}
\titleformat{\section}
    {\normalsize\bfseries}{\thesection}{1em}{}

\titleformat{\subsection}
    {\normalsize\bfseries}{\thesubsection}{1em}{}

% Section numbering depth
\setcounter{secnumdepth}{3}

% Ensure chapter reference in TOC matches
\renewcommand{\cftchappresnum}{BAB~}
\renewcommand{\cftchapaftersnum}{\quad}


% Redefine \maketitle
\renewcommand{\maketitle}{%
  \if@primarytitle
    \input{frontmatter/maketitle}%
  \fi
  \if@secondarytitle
    \clearpage
    \input{frontmatter/maketitle_secondary}%
  \fi
}

% Chapter & Section format
% thanks to https://latex.org/forum/viewtopic.php?p=83118&sid=a22ccb456531faabf65070c18af69680#p83118 for elegant solution
\makeatletter
\patchcmd{\l@chapter}
  {\cftchapfont #1}% original
  {\cftchapfont{#1}}% patched
  {}{}            % success/failure handlers
\makeatother
\renewcommand{\cftchapfont}{\normalsize\MakeUppercase}
% \renewcommand{\cftsecfont}{}
% \renewcommand{\cftsubsecfont}{\itshape}
% \renewcommand{\thesection}{\textup{\Roman{chapter}}.\arabic{section}}

% Dot leaders, spacing, indentation
\setlength{\cftbeforetoctitleskip}{0cm}
\setlength{\cftbeforeloftitleskip}{0cm}
\setlength{\cftbeforelottitleskip}{0cm}
\setlength{\cftbeforechapskip}{0em}
\setlength{\cftchapindent}{0pt}
\setlength{\cftsecindent}{0em}
\setlength{\cftsubsecindent}{2em}
\setlength{\cftchapnumwidth}{3.5em}
\setlength{\cftsecnumwidth}{2em}
\setlength{\cftsubsecnumwidth}{2.5em}
\setlength{\cftfignumwidth}{6em}
\setlength{\cfttabnumwidth}{4em}
\renewcommand \cftchapdotsep{1} % https://tex.stackexchange.com/a/273764
\renewcommand \cftsecdotsep{1} % https://tex.stackexchange.com/a/273764
\renewcommand \cftsubsecdotsep{1} % https://tex.stackexchange.com/a/273764
\renewcommand \cftfigdotsep{1.5} % https://tex.stackexchange.com/a/273764
\renewcommand \cfttabdotsep{1.5} % https://tex.stackexchange.com/a/273764
\renewcommand{\cftchapleader}{\normalfont\cftdotfill{\cftsecdotsep}}
\renewcommand{\cftchappagefont}{\normalfont}

% Add Prefix in the Lof and LoT entries
\renewcommand{\cftfigpresnum}{\figurename~}
\renewcommand{\cfttabpresnum}{\tablename~}

% Ensure TOC and References Respect Custom Numbering
\renewcommand{\thechapter}{\Roman{chapter}}
\renewcommand\thesection{\arabic{chapter}.\arabic{section}}

% Change figure numbering to include chapter (e.g., Figure 1.1, 1.2...)
\renewcommand{\thefigure}{\arabic{chapter}.\arabic{figure}}
\renewcommand{\thetable}{\arabic{chapter}.\arabic{table}}
\renewcommand{\theequation}{\arabic{chapter}.\arabic{equation}}

% Table of Content (TOC, LoF, LoT) Title styling
% \renewcommand{\contentsname}{DAFTAR ISI}
\renewcommand{\cfttoctitlefont}{\hfill\bfseries\MakeUppercase}
\renewcommand{\cftaftertoctitle}{\hfill} % https://tex.stackexchange.com/a/255699/394075
\renewcommand{\cftloftitlefont}{\hfill\bfseries\MakeUppercase}
\renewcommand{\cftafterloftitle}{\hfill}
\renewcommand{\cftlottitlefont}{\hfill\bfseries\MakeUppercase}
\renewcommand{\cftafterlottitle}{\hfill}

% Defines a new glossary called “notation”
\newglossary[nlg]{notation}{not}{ntn}{Notation}

% Define the new glossary style called 'mylistalt'
\makeatletter
\newglossarystyle{mylistalt}{%
  % start the list, initializing glossaries internals
  \renewenvironment{theglossary}%
    {\glslistinit\begin{enumerate}}%
    {\end{enumerate}}%
  % suppress all headers/groupskips
  \renewcommand*{\glossaryheader}{}%
  \renewcommand*{\glsgroupheading}[1]{}%
  \renewcommand*{\glsgroupskip}{}%
  % main entries: let \item produce "1." etc., then break
  \renewcommand*{\glossentry}[2]{%
    \item \glstarget{##1}{\glossentryname{##1}}%
    \mbox{}\\
    \glossentrydesc{##1}
    % [##2] % appears on page x
  }%
  % sub-entries as separate paragraphs, still aligned
  \renewcommand*{\subglossentry}[3]{%
    \par
    \glssubentryitem{##2}%
    \glstarget{##2}{\strut}\space
    \glossentrydesc{##2}\space ##3%
  }%
}

% Define the header for the location column
\providecommand*{\locationname}{Location}

% Define the new glossary style 'altlong3customheader'
\newglossarystyle{altlong3customheader}{%
  % The glossary will be a longtable environment with three columns:
  % 1. Symbol (left-aligned)
  % 2. Description (paragraph, width \glsdescwidth)
  % 3. Location (paragraph, width \glspagelistwidth)
  \renewenvironment{theglossary}%
    {\begin{longtable}{lp{\glsdescwidth}p{\glspagelistwidth}}}%
    {\end{longtable}}%
  % Define the table header row
  \renewcommand*{\symbolname}{Simbol}
  \renewcommand*{\descriptionname}{Keterangan}
  \renewcommand*{\locationname}{Halaman}
  \renewcommand*{\glossaryheader}{%
    \bfseries\symbolname & \bfseries\descriptionname & \bfseries\locationname \tabularnewline\endhead}%
  % Suppress group headings (e.g., A, B, C...)
  \renewcommand*{\glsgroupheading}[1]{}%
  % Define how a main glossary entry is displayed
  % ##1 is the entry label
  % ##2 is the location list (page numbers)
  \renewcommand{\glossentry}[2]{%
    \glsentryitem{##1}% Inserts entry number if entrycounter option is used
    \glstarget{##1}{\glossentryname{##1}} & % Column 1: Symbol (with hyperlink target)
    \glossentrydesc{##1}\glspostdescription & % Column 2: Description (with post-description punctuation)
    ##2\tabularnewline % Column 3: Location list
  }%
  % Define how a sub-entry is displayed
  % ##1 is the sub-entry level (e.g., 1 for first sub-level)
  % ##2 is the entry label
  % ##3 is the location list
  \renewcommand{\subglossentry}[3]{%
    & % Column 1 (Symbol) is left blank for sub-entries to create an indented look
    \glssubentryitem{##2}% Inserts sub-entry number if subentrycounter is used
    \glstarget{##2}{\strut}\glossentrydesc{##2}\glspostdescription & % Column 2: Description (target on strut for hyperlink)
    ##3\tabularnewline % Column 3: Location list
  }%
  % Define the skip between letter groups (if group headings were enabled)
  % For 3 columns, we need 2 ampersands for a full blank row if not using \multicolumn
  \ifglsnogroupskip
    \renewcommand*{\glsgroupskip}{}%
  \else
    \renewcommand*{\glsgroupskip}{& & \tabularnewline}%
  \fi
}

% Define a new style 'supercol' based on 'super'
\newglossarystyle{supercol}{%
  \setglossarystyle{super}% inherit everything from the original
  % override just the main-entry format:
  \renewcommand*{\glossentry}[2]{%
    \glsentryitem{##1}%
    \glstarget{##1}{\glossentryname{##1}}\space  % <-- added colon here
    &: \glossentrydesc{##1}\glspostdescription\space ##2\tabularnewline
  }%
  % likewise for sub‐entries, if you want a colon there too:
  \renewcommand*{\subglossentry}[3]{%
    &: 
    \glssubentryitem{##2}%
    \glstarget{##2}{\strut}\glossentryname{##2}\space % <-- and here
    \glossentrydesc{##2}\glspostdescription\space ##3\tabularnewline
  }%
}
% Define a new style 'supercolnoloc' based on 'super'
\newglossarystyle{supercolnoloc}{%
  \setglossarystyle{super}% inherit everything from the original
  \renewenvironment{theglossary}%
  {\begin{longtable}{lp{0.8\textwidth}}}%
  {\end{longtable}}%
  % override just the main-entry format:
  \renewcommand*{\glossentry}[2]{%
    \glsentryitem{##1}%
    \glstarget{##1}{\glossentryname{##1}}\space  % <-- added colon here
    &: \glossentrydesc{##1}\glspostdescription \tabularnewline
  }%
  % likewise for sub‐entries, if you want a colon there too:
  \renewcommand*{\subglossentry}[3]{%
    &: 
    \glssubentryitem{##2}%
    \glstarget{##2}{\strut}\glossentryname{##2}\space % <-- and here
    \glossentrydesc{##2}\glspostdescription\space ##3\tabularnewline
  }%
}
\makeatother

% A new command that enables us to enter bi-lingual (Slovene and English) terms
% syntax: \addterm[options]{label}{Slovene}{Slovene first use}{English}{Slovene
% description}
\newcommand{\addterm}[6][]{
  \newglossaryentry{#2}{
    name={#3 (angl.\ #5)},
    first={#4 (\emph{#5})},
    text={#3},
    sort={#3},
    description={#6},
    #1 % pass additional options to \newglossaryentry
  }
}

% A new command that enables us to enter (English) acronyms with bi-lingual
% (Slovene and English) long versions
% syntax: \addacronym[options]{label}{abbreviation}{Slovene long}{Slovene first
% use long}{English long}{Slovene description}
\newcommand{\addacronym}[7][]{
  % Create the main glossary entry with \newacronym
  % \newacronym[key-val list]{label}{abbrv}{long}
  \newacronym[
    name={#4 (angl.\ #6,\ #3)},
    first={\emph{#5} (angl.\ \emph{#6},\ \emph{#3})},
    sort={#4},
    description={#7},
    #1 % pass additional options to \newglossaryentry
    ]
    {#2}{#3}{#4}
  % Create a cross-reference from the abbreviation to the main glossary entry by
  % creating an auxiliary glossary entry (note: we set the label of this entry
  % to '<original label>_auxiliary' to avoid clashes)
  \newglossaryentry{#2_auxiliary}{
    name={#3},
    sort={#3},
    description={\makefirstuc{#6}},
    see=[See:]{#2}
  }
}

% Change the text of the cross-reference links to the Slovene long version.
\renewcommand*{\glsseeitemformat}[1]{\emph{\acrlong{#1}}.}

% % Apply a custom fancyhdr layout only on the first page of each \chapter, and use no header/footer elsewhere
% % \let\oldchapter\chapter
% % \renewcommand{\chapter}{%
% %   \cleardoublepage
% %   \pagestyle{fancyplainchapter}%
% %   \oldchapter
% %   \thispagestyle{fancyplainchapter} % ensure chapter start page uses it
% %   \pagestyle{fancyplain}% switch for subsequent pages
% % }

\makeatletter
% Extracting the Year from \today
\newcommand{\theyear}{%
  \expandafter\@car\expandafter\@gobble\the\year\@nil
}

% Declare internal macros as initially empty
\newcommand{\@authorid}{}
\newcommand{\@firstadvisor}{}
\newcommand{\@secondadvisor}{}
\newcommand{\@headdepartement}{}
\newcommand{\@headdepartementid}{}
\newcommand{\@faculty}{}
\newcommand{\@program}{}
\newcommand{\@university}{}
\newcommand{\@yearofsubmission}{}

% Define user commands to set these values.
\newcommand{\authorid}[1]{\gdef\@authorid{#1}}
\newcommand{\firstadvisor}[1]{\gdef\@firstadvisor{#1}}
\newcommand{\secondadvisor}[1]{\gdef\@secondadvisor{#1}}
\newcommand{\headdepartement}[1]{\gdef\@headdepartement{#1}}
\newcommand{\headdepartementid}[1]{\gdef\@headdepartementid{#1}}
\newcommand{\faculty}[1]{\gdef\@faculty{#1}}
\newcommand{\program}[1]{\gdef\@program{#1}}
\newcommand{\university}[1]{\gdef\@university{#1}}
% \newcommand{\yearofsubmission}[1]{\gdef\@yearofsubmission{#1}}

% Now expose robust “the‑” getters to access the values
\newcommand{\theauthorid}{\@authorid}
\newcommand{\thefirstadvisor}{\@firstadvisor}
\newcommand{\thesecondadvisor}{\@secondadvisor}
\newcommand{\theheaddepartement}{\@headdepartement}
\newcommand{\theheaddepartementid}{\@headdepartementid}
\newcommand{\thefaculty}{\@faculty}
\newcommand{\theprogram}{\@program}
\newcommand{\theuniversity}{\@university}

% Ensure title/author/date get expanded correctly in hypersetup
% \hypersetup{
%   pdftitle={\@title},
%   pdfauthor={\@author},
%   pdfdate={\@date},
%   pdfsubject={Bachelor Thesis},
%   pdfkeywords={structural health monitoring, machine learning, stft, vibration, signal},
%   pdfpublisher={Universitas Muhammadiyah Yogyakarta},
%   pdfcontactemail={rifqi.damar.ft21@mail.umy.ac.id},
%   pdflicenseurl={https://github.com/nuluh/thesis/blob/main/LICENSE},
%   pdflang={id},
%   pdfcreator={XeLaTeX with hyperref and hyperxmp},
%   pdfproducer={TeX Live 2024},
%   pdftrapped=False
% }
\makeatother
\endinput