let Stringifier = require('postcss/lib/stringifier')

class ScssStringifier extends Stringifier {
  comment (node) {
    let left = this.raw(node, 'left', 'commentLeft')
    let right = this.raw(node, 'right', 'commentRight')

    if (node.raws.inline) {
      let text = node.raws.text || node.text
      this.builder('//' + left + text + right, node)
    } else {
      this.builder('/*' + left + node.text + right + '*/', node)
    }
  }

  decl (node, semicolon) {
    if (!node.isNested) {
      super.decl(node, semicolon)
    } else {
      let between = this.raw(node, 'between', 'colon')
      let string = node.prop + between + this.rawValue(node, 'value')
      if (node.important) {
        string += node.raws.important || ' !important'
      }

      this.builder(string + '{', node, 'start')

      let after
      if (node.nodes && node.nodes.length) {
        this.body(node)
        after = this.raw(node, 'after')
      } else {
        after = this.raw(node, 'after', 'emptyBody')
      }
      if (after) this.builder(after)
      this.builder('}', node, 'end')
    }
  }

  rawValue (node, prop) {
    let value = node[prop]
    let raw = node.raws[prop]
    if (raw && raw.value === value) {
      return raw.scss ? raw.scss : raw.raw
    } else {
      return value
    }
  }
}

module.exports = ScssStringifier
