import { SvelteComponentTyped } from "svelte";
import type { SvelteHTMLElements } from "svelte/elements";

export type ColumnSize = boolean | number;

export type ColumnSizeDescriptor = {
  span?: ColumnSize;
  offset: number;
};

export type ColumnBreakpoint = ColumnSize | ColumnSizeDescriptor;

type $RestProps = SvelteHTMLElements["div"];

type $Props = {
  /**
   * Set to `true` to render a custom HTML element.
   * Props are destructured as `props` in the default slot.
   * @example
   *  ```svelte
   *  <Column let:props>
   *    <article {...props}>Content</article>
   *  </Column>
   *  ```
   * @default false
   */
  as?: boolean;

  /**
   * Set to `true` to remove the gutter
   * @default false
   */
  noGutter?: boolean;

  /**
   * Set to `true` to remove the left gutter
   * @default false
   */
  noGutterLeft?: boolean;

  /**
   * Set to `true` to remove the right gutter
   * @default false
   */
  noGutterRight?: boolean;

  /**
   * Set to `true` to add top and bottom padding to the column
   * @default false
   */
  padding?: boolean;

  /**
   * Specify the aspect ratio of the column.
   * @default undefined
   */
  aspectRatio?: "2x1" | "16x9" | "9x16" | "1x2" | "4x3" | "3x4" | "1x1";

  /**
   * Set the small breakpoint.
   * @default undefined
   */
  sm?: ColumnBreakpoint;

  /**
   * Set the medium breakpoint.
   * @default undefined
   */
  md?: ColumnBreakpoint;

  /**
   * Set the large breakpoint.
   * @default undefined
   */
  lg?: ColumnBreakpoint;

  /**
   * Set the extra large breakpoint.
   * @default undefined
   */
  xlg?: ColumnBreakpoint;

  /**
   * Set the maximum breakpoint.
   * @default undefined
   */
  max?: ColumnBreakpoint;

  children?: (this: void, ...args: [{
        props: {
          class: string;
          [key: string]: any;
        }
      }]) => void;

  [key: `data-${string}`]: unknown;
};

export type ColumnProps = Omit<$RestProps, keyof $Props> & $Props;

export default class Column extends SvelteComponentTyped<
  ColumnProps,
  Record<string, any>,
  {
    default: {
      props: {
        class: string;
        [key: string]: any;
      }
    };
  }
> {}
