#!/usr/bin/env coffee

fs = require('fs')
mkdirp = require('mkdirp')

if not (process.argv.length in [3, 4])
  console.log('Usage: mkcomp <what?> <component-name>')
  process.exit()

if process.argv.length is 4
  what = process.argv[2]
  name = process.argv[3]
  if not (what in ['component', 'visualization'])
    console.log('bad what')
    process.exit()
else
  what = 'component'
  name = process.argv[2]

if not /^([a-z-])+$/.test(name)
  console.log('must be a hyphen case name')
  process.exit()

path = './src/client/' + what + 's/' + name + '/'
mkdirp.sync(path)
console.log('Making path:', path)

camelName = name.replace(/(^|-)[a-z]/g, (s) -> s.replace('-', '').toUpperCase())

writeFile = (path, data) ->
  try
    fs.writeFileSync(path, data, {
      flag: 'wx' # x = fail if file exists
      encoding: 'utf8'
    })
  catch
    console.log("Skipping #{path}")

any = 'any'

# Make the TypeScript file
writeFile(path + name + '.tsx', """
'use strict';
require('./#{name}.css');

import * as React from 'react';
import * as ReactDOM from 'react-dom';
import { $, Expression, Executor, Dataset } from 'plywood';
import { Stage, Clicker, Essence, DataSource, Filter, Dimension, Measure, TimePreset } from '../../../common/models/index';
// import { ... } from '../../config/constants';
import { SvgIcon } from '../svg-icon/svg-icon';

// I am: import { #{camelName} } from '../#{name}/#{name}';

export interface #{camelName}Props extends React.Props<#{any}> {
}

export interface #{camelName}State {
}

export class #{camelName} extends React.Component<#{camelName}Props, #{camelName}State> {
  public mounted: boolean;

  constructor() {
    super();
    // this.state = {};

  }

  componentDidMount() {
    this.mounted = true;
  }

  componentWillUnmount() {
    this.mounted = false;
  }

  componentWillReceiveProps(nextProps: #{camelName}Props) {

  }

  render() {
    return <div className="#{name}"></div>;
  }
}

""")


# Make the TypeScript test file
writeFile(path + name + '.mocha.tsx', """
'use strict';

import { expect } from 'chai';
import * as sinon from 'sinon';
import { setupDOM } from '../../utils/jsdom-setup';
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import * as TestUtils from 'react-addons-test-utils';

import { $, Expression } from 'plywood';
import { #{camelName} } from './#{name}';

describe('#{camelName}', () => {
  setupDOM();

  it('adds the correct class', () => {
    var renderedComponent = TestUtils.renderIntoDocument(
      <#{camelName}

      />
    );

    expect(TestUtils.isCompositeComponent(renderedComponent), 'should be composite').to.equal(true);
    expect((ReactDOM.findDOMNode(renderedComponent) as any).className, 'should contain class').to.contain('#{name}');
  });

});

""")


# Make the SASS file
writeFile(path + name + '.scss', """
@import '../../imports';

.#{name} {

}

""");
