sequence!(
    /// Switches to the alternate buffer.
    ///
    /// Use the [`SwitchBufferToNormal`](struct.SwitchBufferToNormal.html) sequence to switch
    /// back to the normal buffer.
    ///
    /// # Examples
    ///
    /// ```no_run
    /// use std::io::{stdout, Write};
    /// use anes::{SwitchBufferToAlternate, SwitchBufferToNormal};
    ///
    /// let mut stdout = stdout();
    /// write!(stdout, "{}", SwitchBufferToAlternate);
    /// // Your app on alternate screen
    /// write!(stdout, "{}", SwitchBufferToNormal);
    /// ```
    struct SwitchBufferToAlternate => csi!("?1049h")
);

sequence!(
    /// Switches to the normal buffer.
    ///
    /// # Examples
    ///
    /// ```no_run
    /// use std::io::{stdout, Write};
    /// use anes::{SwitchBufferToAlternate, SwitchBufferToNormal};
    ///
    /// let mut stdout = stdout();
    /// write!(stdout, "{}", SwitchBufferToAlternate);
    /// // Your app on alternate screen
    /// write!(stdout, "{}", SwitchBufferToNormal);
    /// ```
    struct SwitchBufferToNormal => csi!("?1049l")
);

sequence!(
    /// Scrolls up by the given number of rows.
    ///
    /// # Examples
    ///
    /// ```no_run
    /// use std::io::{stdout, Write};
    /// use anes::ScrollBufferUp;
    ///
    /// let mut stdout = stdout();
    /// // Scroll up by 5 lines
    /// write!(stdout, "{}", ScrollBufferUp(5));
    /// ```
    struct ScrollBufferUp(u16) =>
    |this, f| write!(f, csi!("{}S"), this.0)
);

sequence!(
    /// Scrolls down by the given number of rows.
    ///
    /// # Examples
    ///
    /// ```no_run
    /// use std::io::{stdout, Write};
    /// use anes::ScrollBufferDown;
    ///
    /// let mut stdout = stdout();
    /// // Scroll down by 10 lines
    /// write!(stdout, "{}", ScrollBufferDown(10));
    /// ```
    struct ScrollBufferDown(u16) =>
    |this, f| write!(f, csi!("{}T"), this.0)
);

sequence!(
    /// Clears part of the line.
    ///
    /// # Examples
    ///
    /// ```no_run
    /// use std::io::{stdout, Write};
    /// use anes::ClearLine;
    ///
    /// let mut stdout = stdout();
    /// // Clear the whole line
    /// write!(stdout, "{}", ClearLine::All);
    /// ```
    enum ClearLine {
        /// Clears from the cursor position to end of the line.
        Right => csi!("K"),
        /// Clears from the cursor position to beginning of the line.
        Left => csi!("1K"),
        /// Clears the whole line.
        All => csi!("2K"),
    }
);

sequence!(
    /// Clears part of the buffer.
    ///
    /// # Examples
    ///
    /// ```no_run
    /// use std::io::{stdout, Write};
    /// use anes::ClearBuffer;
    ///
    /// let mut stdout = stdout();
    /// // Clear the entire buffer
    /// write!(stdout, "{}", ClearBuffer::All);
    /// ```
    enum ClearBuffer {
        /// Clears from the cursor position to end of the screen.
        Below => csi!("J"),
        /// Clears from the cursor position to beginning of the screen.
        Above => csi!("1J"),
        /// Clears the entire buffer.
        All => csi!("2J"),
        /// Clears the entire buffer and all saved lines in the scrollback buffer.
        SavedLines => csi!("3J"),
    }
);

#[cfg(test)]
test_sequences!(
    switch_buffer_to_alternate(
        SwitchBufferToAlternate => "\x1B[?1049h",
    ),
    switch_buffer_to_main(
        SwitchBufferToNormal => "\x1B[?1049l",
    ),
    scroll_buffer_up(
        ScrollBufferUp(10) => "\x1B[10S",
    ),
    scroll_buffer_down(
        ScrollBufferDown(10) => "\x1B[10T",
    ),
    clear_line(
        ClearLine::Right => "\x1B[K",
        ClearLine::Left => "\x1B[1K",
        ClearLine::All => "\x1B[2K",
    ),
    clear_buffer(
        ClearBuffer::Below => "\x1B[J",
        ClearBuffer::Above => "\x1B[1J",
        ClearBuffer::All => "\x1B[2J",
        ClearBuffer::SavedLines => "\x1B[3J",
    ),
);
