% ------------------------------------------------------------------------------
% Copyright (c) 2019, 2025 Contributors to the Eclipse Foundation
%
% See the NOTICE file(s) distributed with this work for additional
% information regarding copyright ownership.
%
% This program and the accompanying materials are made available under the terms
% of the MIT License which is available at https://opensource.org/licenses/MIT
%
% SPDX-License-Identifier: MIT
% ------------------------------------------------------------------------------
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, arrows, automata, positioning, shapes, shapes.misc}
\usepackage[paperwidth=40in, paperheight=20in]{geometry}

\begin{document}
\pagestyle{empty}

\begin{tikzpicture}[
    auto,
    ->,
    node distance=2cm,
    every state/.style={ellipse, semithick, fill=black!5, minimum size=1.5cm, font=\Large},
    initial distance=1.2cm,
    every initial by arrow/.style={-{Stealth[scale=1.4]}},
    initial text=,
    transform shape,
    double distance=2pt,
    every loop/.style={min distance=10mm}
]

\node[state, initial left, accepting]                   (A) {\emph{Released}};
\node[state, right=of A]                                (B) {\emph{Pushed}};

\node[state, initial left, accepting, right=of B]       (C) {\emph{Off}};
\node[state, right=of C]                                (D) {\emph{On}};

\node[state, initial left, accepting, below=1.5cm of B] (E) {\emph{Off}};
\node[state,                          below=1.5cm of C] (F) {\emph{TurnOn}};
\node[state,                          below=of E]       (G) {\emph{TurnOff}};
\node[state,                          below=of F]       (H) {\emph{On}};

\path[-{Stealth[scale=1.4]}]
    (A) edge[bend left, above, dashed] node[align=center] {\texttt{push}}      (B)
    (B) edge[bend left, below, dashed] node[align=center] {\texttt{release}}   (A)

    (C) edge[bend left, above]         node[align=center] {\texttt{turn\_on}}  (D)
    (D) edge[bend left, below]         node[align=center] {\texttt{turn\_off}} (C)

    (E) edge[above, dashed]            node[align=center] {\texttt{push}}      (F)
    (F) edge[bend left, below, dashed] node[align=center] {\texttt{push}}      (E)
    (F) edge[right]                    node[align=center] {\texttt{turn\_on}}  (H)
    (H) edge[below, dashed]            node[align=center] {\texttt{push}}      (G)
    (G) edge[bend left, above, dashed] node[align=center] {\texttt{push}}      (H)
    (G) edge[left]                     node[align=center] {\texttt{turn\_off}} (E)
;

\end{tikzpicture}
\end{document}
