////
/// @group pagination
////

/// A Bootstrap 4 mixin for generating larger or smaller pagination component.
/// @param {Number} $padding-y
/// @param {Number} $padding-x
/// @param {Number} $font-size
/// @param {Number} $line-height
/// @param {Number} $border-radius

@mixin pagination-size(
	$padding-y,
	$padding-x,
	$font-size,
	$line-height,
	$border-radius
) {
	.page-link {
		font-size: $font-size;
		line-height: $line-height;
		padding: $padding-y $padding-x;
	}

	.page-item {
		&:first-child {
			.page-link {
				@include border-left-radius($border-radius);
			}
		}
		&:last-child {
			.page-link {
				@include border-right-radius($border-radius);
			}
		}
	}
}

/// A mixin to help create `.pagination-items-per-page` variants.
/// @param {Map} $map - A map of `key: value` pairs. The keys and value types are listed below:
/// @example
/// (
/// 	enabled: {Bool}, // Set to false to prevent mixin styles from being output. Default: true
/// 	// .pagination-items-per-page
/// 	link: (
/// 		// .pagination-items-per-page > a, .pagination-items-per-page > button
/// 		hover: (
/// 			// .pagination-items-per-page > a:hover, .pagination-items-per-page > button:hover
/// 		),
/// 		focus: (
/// 			// .pagination-items-per-page > a:focus, .pagination-items-per-page > a.focus,
/// 			// .pagination-items-per-page > button:focus, .pagination-items-per-page > button.focus
/// 		),
/// 		active: (
/// 			// .pagination-items-per-page > a:active, .pagination-items-per-page > a.active,
/// 			// .pagination-items-per-page > button:active, .pagination-items-per-page > button.active,
/// 			// .pagination-items-per-page.active > a, .pagination-items-per-page.active > button
/// 		),
/// 		show: (
/// 			// .pagination-items-per-page > a[aria-expanded='true'],
/// 			// .pagination-items-per-page > a.show,
/// 			// .pagination-items-per-page > button[aria-expanded='true'],
/// 			// .pagination-items-per-page > button.show
/// 		),
/// 		disabled: (
/// 			// .pagination-items-per-page > a:disabled, .pagination-items-per-page > a.disabled,
/// 			// .pagination-items-per-page > button:disabled, .pagination-items-per-page > button.disabled,
/// 			// .pagination-items-per-page.disabled > a, .pagination-items-per-page.disabled > button
/// 		),
/// 	),
/// 	dropdown-menu: (
/// 		// .pagination-items-per-page .dropdown-menu
/// 		// See `clay-dropdown-menu-variant`
/// 	),
/// 	lexicon-icon: (
/// 		// .pagination-items-per-page .lexicon-icon
/// 	),
/// 	pagination-results: (
/// 		// .pagination-items-per-page + .pagination-results
/// 	),
/// 	media-breakpoint-down: (
/// 		xs: (
/// 			// @include media-breakpoint-down(xs) {
/// 			//     See above.
/// 			// }
/// 		),
/// 		sm: (
/// 			// @include media-breakpoint-down(sm) {
/// 			//     See above.
/// 			// }
/// 		),
/// 		md: (
/// 			// @include media-breakpoint-down(md) {
/// 			//     See above.
/// 			// }
/// 		),
/// 		lg: (
/// 			// @include media-breakpoint-down(lg) {
/// 			//     See above.
/// 			// }
/// 		),
/// 	),
/// )

@mixin clay-pagination-items-per-page-variant($map) {
	@if (type-of($map) == 'map') {
		$enabled: setter(map-get($map, enabled), true);

		@if ($enabled) {
			@if (length($map) != 0) {
				@include clay-css($map);
			}

			$_link: map-get($map, link);

			@if ($_link) {
				> a,
				> button {
					@include clay-link(map-get($map, link));
				}

				$_active-class: map-get($_link, active-class);

				@if ($_active-class) {
					&.active {
						> a,
						> button {
							@include clay-link($_active-class);
						}
					}
				}

				$_disabled: map-get($_link, disabled);

				@if ($_disabled) {
					&.disabled {
						> a,
						> button {
							@include clay-link($_disabled);
						}
					}
				}
			}

			$_dropdown-menu: map-get($map, dropdown-menu);

			@if ($_dropdown-menu) {
				.dropdown-menu {
					@include clay-dropdown-menu-variant($_dropdown-menu);
				}
			}

			$_lexicon-icon: map-get($map, lexicon-icon);

			@if ($_lexicon-icon) {
				.lexicon-icon {
					@include clay-css($_lexicon-icon);
				}
			}

			$_pagination-results: map-get($map, pagination-results);

			@if ($_pagination-results) {
				+ .pagination-results {
					@include clay-css($_pagination-results);
				}
			}

			$_media-breakpoint-down: map-get($map, media-breakpoint-down);

			@if ($_media-breakpoint-down) {
				@each $breakpoint in map-keys($_media-breakpoint-down) {
					$media-breakpoint-down: map-get(
						$_media-breakpoint-down,
						$breakpoint
					);

					@include media-breakpoint-down($breakpoint) {
						@include clay-css($media-breakpoint-down);

						$_link: map-get($media-breakpoint-down, link);

						@if ($_link) {
							> a,
							> button {
								@include clay-link($_link);
							}

							$_active-class: map-get($_link, active-class);

							@if ($_active-class) {
								&.active {
									> a,
									> button {
										@include clay-link($_active-class);
									}
								}
							}

							$_disabled: map-get($_link, disabled);

							@if ($_disabled) {
								&.disabled {
									> a,
									> button {
										@include clay-link($_disabled);
									}
								}
							}
						}

						$_dropdown-menu: map-get(
							$media-breakpoint-down,
							dropdown-menu
						);

						@if ($_dropdown-menu) {
							.dropdown-menu {
								@include clay-dropdown-menu-variant(
									$_dropdown-menu
								);
							}
						}

						$_lexicon-icon: map-get(
							$media-breakpoint-down,
							lexicon-icon
						);

						@if ($_lexicon-icon) {
							.lexicon-icon {
								@include clay-css($_lexicon-icon);
							}
						}

						$_pagination-results: map-get(
							$media-breakpoint-down,
							pagination-results
						);

						@if ($_pagination-results) {
							+ .pagination-results {
								@include clay-css($_pagination-results);
							}
						}
					}
				}
			}
		}
	}
}

/// A mixin to help create `.pagination` variants.
/// @param {Map} $map - A map of `key: value` pairs. The keys and value types are listed below:
/// @example
/// (
/// 	enabled: {Bool}, // Set to false to prevent mixin styles from being output. Default: true
/// 	// .pagination
/// 	page-item: (
/// 		// .pagination .page-item
/// 	),
/// 	page-link: (
/// 		// .pagination .page-link
/// 		hover: (
/// 			// .pagination .page-link:hover
/// 		),
/// 		focus: (
/// 			// .pagination .page-link:focus, .pagination .page-link.focus
/// 		),
/// 		active: (
/// 			// .pagination .page-link:active, .pagination .page-item.active .page-link
/// 		),
/// 		show: (
/// 			// .pagination .page-link[aria-expanded='true'], .pagination .page-link.show
/// 		),
/// 		disabled: (
/// 			// .pagination .page-link:disabled, .pagination .page-link.disabled,
/// 			// .pagination .page-item.disabled .page-link
/// 		),
/// 	),
/// 	page-link-first: (
/// 		// .pagination .page-item:first-child .page-link, .page-link-first
/// 	),
/// 	page-link-last: (
/// 		// .pagination .page-item:last-child .page-link, .page-link-last
/// 	),
/// 	pagination: (
/// 		// Used for .pagination-bar
/// 		// .pagination-bar .pagination
/// 		// See `clay-pagination-variant`
/// 	),
/// 	pagination-items-per-page: (
/// 		// Used for .pagination-bar
/// 		// .pagination-bar .pagination-items-per-page
/// 		// See `clay-pagination-items-per-page-variant`
/// 	),
/// 	media-breakpoint-down: (
/// 		xs: (
/// 			// @include media-breakpoint-down(xs) {
/// 			//     See above.
/// 			// }
/// 		),
/// 		sm: (
/// 			// @include media-breakpoint-down(sm) {
/// 			//     See above.
/// 			// }
/// 		),
/// 		md: (
/// 			// @include media-breakpoint-down(md) {
/// 			//     See above.
/// 			// }
/// 		),
/// 		lg: (
/// 			// @include media-breakpoint-down(lg) {
/// 			//     See above.
/// 			// }
/// 		),
/// 	),
/// )

@mixin clay-pagination-variant($map) {
	@if (type-of($map) == 'map') {
		$enabled: setter(map-get($map, enabled), true);

		@if ($enabled) {
			@if (length($map) != 0) {
				@include clay-css($map);
			}

			$_page-item: map-get($map, page-item);

			@if ($_page-item) {
				.page-item {
					@include clay-css($_page-item);
				}
			}

			$_page-link: map-get($map, page-link);

			@if ($_page-link) {
				.page-link {
					@include clay-link($_page-link);
				}
			}

			$_page-link-first: map-get($map, page-link-first);

			@if ($_page-link-first) {
				.page-item:first-child .page-link,
				.page-link-first {
					@include clay-css($_page-link-first);
				}
			}

			$_page-link-last: map-get($map, page-link-last);

			@if ($_page-link-last) {
				.page-item:last-child .page-link,
				.page-link-last {
					@include clay-css($_page-link-last);
				}
			}

			@if ($_page-link) {
				.page-item {
					$_active-class: map-get($_page-link, active-class);

					@if ($_active-class) {
						&.active {
							.page-link {
								@include clay-link($_active-class);
							}
						}
					}

					$_disabled: map-get($_page-link, disabled);

					@if ($_disabled) {
						&.disabled {
							.page-link {
								@include clay-link($_disabled);
							}
						}
					}
				}
			}

			$_pagination: map-get($map, pagination);

			@if ($_pagination) {
				.pagination {
					@include clay-pagination-variant($_pagination);
				}
			}

			$_pagination-items-per-page: map-get(
				$map,
				pagination-items-per-page
			);

			@if ($_pagination-items-per-page) {
				.pagination-items-per-page {
					@include clay-pagination-items-per-page-variant(
						$_pagination-items-per-page
					);
				}
			}

			$_media-breakpoint-down: map-get($map, media-breakpoint-down);

			@if ($_media-breakpoint-down) {
				@each $breakpoint in map-keys($_media-breakpoint-down) {
					$media-breakpoint-down: map-get(
						$_media-breakpoint-down,
						$breakpoint
					);

					@include media-breakpoint-down($breakpoint) {
						@include clay-css($media-breakpoint-down);

						$_page-item: map-get($media-breakpoint-down, page-item);

						@if ($_page-item) {
							.page-item {
								@include clay-css($_page-item);
							}
						}

						$_page-link: map-get($media-breakpoint-down, page-link);

						@if ($_page-link) {
							.page-link {
								@include clay-link($_page-link);
							}
						}

						$_page-link-first: map-get(
							$media-breakpoint-down,
							page-link-first
						);

						@if ($_page-link-first) {
							.page-item:first-child .page-link,
							.page-link-first {
								@include clay-css($_page-link-first);
							}
						}

						$_page-link-last: map-get(
							$media-breakpoint-down,
							page-link-last
						);

						@if ($_page-link-last) {
							.page-item:last-child .page-link,
							.page-link-last {
								@include clay-css($_page-link-last);
							}
						}

						@if ($_page-link) {
							.page-item {
								$_active: map-get($_page-link, active);

								@if ($_active) {
									&.active {
										.page-link {
											@include clay-link($_active);
										}
									}
								}

								$_disabled: map-get($_page-link, disabled);

								@if ($_disabled) {
									&.disabled {
										.page-link {
											@include clay-link($_disabled);
										}
									}
								}
							}
						}

						$_pagination: map-get(
							$media-breakpoint-down,
							pagination
						);

						@if ($_pagination) {
							.pagination {
								@include clay-pagination-variant($_pagination);
							}
						}

						$_pagination-items-per-page: map-get(
							$media-breakpoint-down,
							pagination-items-per-page
						);

						@if ($_pagination-items-per-page) {
							.pagination-items-per-page {
								@include clay-pagination-items-per-page-variant(
									$_pagination-items-per-page
								);
							}
						}
					}
				}
			}
		}
	}
}
