////
///
/// Flip Animations Mixin Module
/// ===========================================================================
///
/// Provides 3D flip animations that rotate elements around X, Y, or Z axes.
/// Supports customizable rotation angles, axis combinations, and timing.
/// Useful for card flips, page transitions, and reveal effects.
///
/// @group Animations
/// @author Scape Agency
/// @link https://move.gl
/// @since 0.1.0 initial release
/// @access public
///
////


// ============================================================================
// Use
// ============================================================================

@use "../../dev" as *;
@use "../../variables" as *;
@use "../keyframes" as *;
@use "base" as *;


// ============================================================================
// Mixins
// ============================================================================


///
/// Flip Animation
/// ---------------------------------------------------------------------------
/// Creates a flip animation that rotates an element around a 3D axis.
///
/// @name animate_flip
/// @param {Number|String} $duration [$animate_base_duration] - Animation duration.
/// @param {String} $timing_function [ease-in-out] - Timing function.
/// @param {Number|String} $iteration_count [$animate_base_iteration_count] - Iterations.
/// @param {Number} $rotate_x [0] - X-axis rotation factor.
/// @param {Number} $rotate_y [1] - Y-axis rotation factor.
/// @param {Number} $rotate_z [0] - Z-axis rotation factor.
/// @param {Angle} $rotate_start_angle [0] - Starting angle.
/// @param {Angle} $rotate_end_angle [360deg] - Ending angle.
///
@mixin animate_flip(
    $duration: $animate_base_duration,
    $timing_function: $animate_base_timing_function,
    $iteration_count: $animate_base_iteration_count,
    $rotate_x: 0,
    $rotate_y: 1,
    $rotate_z: 0,
    $rotate_start_angle: 0,
    $rotate_end_angle: 360deg
) {
    @include animate_base(
        animate_flip,
        $duration,
        $timing_function,
        $iteration_count
    );
    @include keyframes_flip($rotate_x, $rotate_y, $rotate_z, $rotate_start_angle, $rotate_end_angle);
}


///
/// Flip In X Animation
/// ---------------------------------------------------------------------------
/// Creates a flip-in animation around the X-axis.
///
/// @name animate_flip_in_x
/// @param {Angle} $start_angle [90deg] - Starting angle.
/// @param {Time} $duration [$animate_base_duration] - Animation duration.
/// @param {String} $timing_function [ease-out] - Timing function.
///
@mixin animate_flip_in_x(
    $start_angle: 90deg,
    $duration: $animate_base_duration,
    $timing_function: ease-out
) {
    @include animate_base(
        animate_flip_in_x,
        $duration,
        $timing_function,
        1,
        $fill_mode: both
    );
    @include keyframes_flip_in_x($start_angle);
}


///
/// Flip In Y Animation
/// ---------------------------------------------------------------------------
/// Creates a flip-in animation around the Y-axis.
///
/// @name animate_flip_in_y
/// @param {Angle} $start_angle [90deg] - Starting angle.
/// @param {Time} $duration [$animate_base_duration] - Animation duration.
/// @param {String} $timing_function [ease-out] - Timing function.
///
@mixin animate_flip_in_y(
    $start_angle: 90deg,
    $duration: $animate_base_duration,
    $timing_function: ease-out
) {
    @include animate_base(
        animate_flip_in_y,
        $duration,
        $timing_function,
        1,
        $fill_mode: both
    );
    @include keyframes_flip_in_y($start_angle);
}


///
/// Flip Out X Animation
/// ---------------------------------------------------------------------------
/// Creates a flip-out animation around the X-axis.
///
/// @name animate_flip_out_x
/// @param {Angle} $end_angle [90deg] - Ending angle.
/// @param {Time} $duration [$animate_base_duration] - Animation duration.
/// @param {String} $timing_function [ease-in] - Timing function.
///
@mixin animate_flip_out_x(
    $end_angle: 90deg,
    $duration: $animate_base_duration,
    $timing_function: ease-in
) {
    @include animate_base(
        animate_flip_out_x,
        $duration,
        $timing_function,
        1,
        $fill_mode: forwards
    );
    @include keyframes_flip_out_x($end_angle);
}


///
/// Flip Out Y Animation
/// ---------------------------------------------------------------------------
/// Creates a flip-out animation around the Y-axis.
///
/// @name animate_flip_out_y
/// @param {Angle} $end_angle [90deg] - Ending angle.
/// @param {Time} $duration [$animate_base_duration] - Animation duration.
/// @param {String} $timing_function [ease-in] - Timing function.
///
@mixin animate_flip_out_y(
    $end_angle: 90deg,
    $duration: $animate_base_duration,
    $timing_function: ease-in
) {
    @include animate_base(
        animate_flip_out_y,
        $duration,
        $timing_function,
        1,
        $fill_mode: forwards
    );
    @include keyframes_flip_out_y($end_angle);
}


///
/// Card Flip Animation
/// ---------------------------------------------------------------------------
/// Creates a card flip with perspective effect.
///
/// @name animate_card_flip
/// @param {Length} $perspective [1000px] - 3D perspective distance.
/// @param {Time} $duration [$animate_base_duration] - Animation duration.
/// @param {String} $timing_function [ease-in-out] - Timing function.
/// @param {Number|String} $iteration_count [$animate_base_iteration_count] - Iterations.
///
@mixin animate_card_flip(
    $perspective: 1000px,
    $duration: $animate_base_duration,
    $timing_function: $animate_base_timing_function,
    $iteration_count: $animate_base_iteration_count
) {
    perspective: $perspective;

    @include animate_base(
        animate_card_flip,
        $duration,
        $timing_function,
        $iteration_count
    );
    @include keyframes_card_flip();
}


///
/// Flip with Scale Animation
/// ---------------------------------------------------------------------------
/// Creates a flip combined with scaling effect.
///
/// @name animate_flip_scale
/// @param {Number} $scale [1.1] - Scale factor at midpoint.
/// @param {Time} $duration [$animate_base_duration] - Animation duration.
/// @param {String} $timing_function [ease-in-out] - Timing function.
/// @param {Number|String} $iteration_count [$animate_base_iteration_count] - Iterations.
///
@mixin animate_flip_scale(
    $scale: 1.1,
    $duration: $animate_base_duration,
    $timing_function: $animate_base_timing_function,
    $iteration_count: $animate_base_iteration_count
) {
    @include animate_base(
        animate_flip_scale,
        $duration,
        $timing_function,
        $iteration_count
    );
    @include keyframes_flip_scale($scale);
}


///
/// Diagonal Flip Animation
/// ---------------------------------------------------------------------------
/// Creates a flip along a diagonal axis.
///
/// @name animate_flip_diagonal
/// @param {Time} $duration [$animate_base_duration] - Animation duration.
/// @param {String} $timing_function [ease-in-out] - Timing function.
/// @param {Number|String} $iteration_count [$animate_base_iteration_count] - Iterations.
///
@mixin animate_flip_diagonal(
    $duration: $animate_base_duration,
    $timing_function: $animate_base_timing_function,
    $iteration_count: $animate_base_iteration_count
) {
    @include animate_base(
        animate_flip_diagonal,
        $duration,
        $timing_function,
        $iteration_count
    );
    @include keyframes_flip_diagonal();
}
