/// <reference path="../typings/tsd.d.ts" />
'use strict'

import * as chai from 'chai';
import * as helpers from './helpers';
import {ModelMetadata} from '../src/ModelMetadata';
import {BaseModel} from '../src/BaseModel';
import * as models from './fixtures/models';
import {manager} from '../src/manager';

const expect = chai.expect;

describe('BaseModel', () => {

  before(done => {
    manager.init().subscribe(() => {
      done();
    }, err => console.log(err));
  })

  helpers.checkClassExport(BaseModel);

  describe('assign data', () => {    

    it('via constructor', () => {
      const book = new models.Book({
        title: 'Book title',
        price: '10'
      });
      expect(book.title).to.be.equal('Book title');
      expect(book.price).to.be.equal(10);
      expect(book.available).to.be.equal(true);
    });

    it('via setters', () => {
      const book = new models.Book();
      book.title = 'Title';
      book.price = 20;
      book.available = false;

      expect(book.title).to.be.equal('Title');
      expect(book.price).to.be.equal(20);
      expect(book.available).to.be.equal(false);
    });
  });
  
  describe('validators', () => {
    afterEach(done => {
      models.Book.destroy().subscribe(() => done());
    });
    it('decorators', done => {
      const book = new models.Book({title: 'title', price: 5, no: 1});
            
      book.validate()
        .mergeMap(result => {
          expect(result.isValid).to.be.true;
          return book.save();
        })
        .mergeMap(() => {
           const book = new models.Book({title: 'title 1', price: 1, no: 1});
           return book.validate();
        })
        .subscribe(result => {
          expect(result['errors'][0].property).to.be.equal('no');
          expect(result['errors'][0].type).to.be.equal('custom');
          done();
        });      
    });
  });

  it('.toJSON(), .inspect()', () => {
    const book = new models.Book({
      title: 'Book title',
      promo: true
    });
    const author = new models.Author({
      id: 'authorId'
    });
    (<any>book).author(author);

    expect(book.toJSON()).to.be.deep.equal({
      title: 'Book title',
      available: true,
      authorId: 'authorId',
      promo: true
    });
    expect(book.toSafeJSON()).to.be.deep.equal({
      title: 'Book title',
      available: true,
      authorId: 'authorId'
    });
    expect(book.toJSON()).to.be.deep.equal(book.inspect());
  });
  
  it('embeded models', () => {
    const book = new models.Book({
      title: 'Book title',
      edition: {
        no: '10'
      }
    });
    
    expect(book.edition).to.be.instanceof(models.Edition);
    expect(book.edition.no).to.be.equal(10);
  });
});
  