/* @flow */
"use strict";
/*:: type postcssType = {
  atRule: Function,
  comment: Function,
  decl: Function,
  list: any,
  parse: any,
  plugin: Function,
  root: Function,
  rule: Function,
  stringify: any,
  vendor: any,
} */
const _ = require("lodash");
const createStylelint = require("./createStylelint");
const path = require("path");
const postcss /*: postcssType*/ = require("postcss");
//'block-no-empty': bool || Array
/*:: type OptionsT = {
  config?: {
    extends?: Array<string>,
    plugins?: Array<string>,
    rules?: Object,
  };
  configBasedir?: string;
  configFile?: string;
  defaultSeverity?: string;
  from?: string;
  ignoreDisables?: boolean;
  ignoreFiles?: string;
  pluginFunctions?: Object;
  plugins?: Array<string>;
  rules?: Object;
}
*/

/*:: type rootParamT = {
  raws: {
    semicolon: boolean,
    after: string,
  },
  type: string,
  nodes: Array<Object>,
  source: {
    input: {
      css: string,
      id?: string,
      file?: string,
    },
    start: {
      line: number,
      column: number,
    }
  }
} */

/*:: type resultParamT = {
  processor: {
    version: string,
    plugins: Array<Object>,
  },
  messages: Array<any>,
  root: {
    raws: {
      semicolon: boolean,
      after: string,
    },
    type: string,
    nodes: Array<Object>,
    source: {
      input: Object,
      start: Object,
    },
  },
  opts: {
    config?: {
      rules: Object,
    },
    configFile?: string,
    defaultSeverity?: string,
    rules?: Object,
    ignoreDisables?: boolean,
    ignoreFiles?: string,
    from?: string,
    syntax?: {
      parse: Function,
      stringify: Function,
    }
  },
  css: ?any,
  map: ?any,
  lastPlugin: {
    postcssPlugin: string,
    postcssVersion: string,
  }
} */

/*:: type postcssPromise = Promise<?{ config: stylelint$config, filepath: string }>*/

module.exports = postcss.plugin("stylelint", function(
  options /*: OptionsT*/
) /*: Function*/ {
  options = options || {};

  const tailoredOptions /*: Object*/ = options.rules
    ? { config: options }
    : options;
  const stylelint /*: stylelint$internalApi*/ = createStylelint(
    tailoredOptions
  );

  // prettier-ignore
  return (root/*: rootParamT*/, result/*: resultParamT*/)/*: Promise<any>*/ => {
    let filePath = options.from || _.get(root, "source.input.file");
    if (filePath !== undefined && !path.isAbsolute(filePath)) {
      filePath = path.join(process.cwd(), filePath);
    }

    return stylelint._lintSource({
      filePath,
      existingPostcssResult: result
    });
  };
});