import { Container, PluginCreator } from "postcss";

declare namespace postcssMixins {
    interface Options {
        /**
         * Define mixins in code instead of with CSS.
         *
         * For functions: the first parameter is the mixin rule,
         * and all others are parameters passed to the mixin.
         */
        mixins?: Record<string, Mixin> | undefined;
        /**
         * Autoload all mixins from one or more dirs.
         * Mixin name will be taken from file name.
         */
        mixinsDir?: string | string[] | undefined;
        /**
         * Similar to mixinsDir, except you can provide fast-glob syntax
         * to target or not to target specific files.
         */
        mixinsFiles?: string | string[] | undefined;
        /**
         * Remove unknown mixins instead of throwing an error.
         * Off by default.
         */
        silent?: boolean | undefined;
    }

    /**
     * A mixin, either a function or an object
     */
    type Mixin = MixinFn | MixinObj;
    // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
    type MixinFn = (mixin: Container, ...args: string[]) => MixinObj | void;
    // The Exclude here is meant to make sure that you can't assign invalid functions to MixinObj,
    // which is possible with Record<string, any>
    // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type,@typescript-eslint/no-wrapper-object-types
    type MixinObj = Record<string, Exclude<Object, Function>>;
}

declare var postcssMixins: PluginCreator<postcssMixins.Options>;

export = postcssMixins;
