'use strict';

import {Query} from 'blow-query';
import {PersistedModel} from '../../src/PersistedModel';
import * as decorators from '../../src/decorators';
import {IBelongsToRelation} from '../../src/interfaces';
import {Author, Edition} from './interfaces';

@decorators.model({
  name: 'Book', 
  connection: 'default'
})
export class Book extends PersistedModel {
  
  @decorators.property({
    type: 'String',
    validations: {
      required: true
    }
  })
  title: string;
  
  @decorators.property({
    type: 'String',
    validations: {
      required: true,
      custom: uniqueValidator
    }
  })
  no: string;
  
  @decorators.property({
    type: 'Number',
    validations: {
      required: true,
      max: 5
    }
  })
  price: number;
  
  @decorators.property({
    type: 'Boolean',
    hidden: true
  })
  promo: boolean;
  
  @decorators.property({
    type: 'Boolean',
    default: true
  })
  available: boolean;
  
  @decorators.property({
    type: 'Edition'
  })
  edition: Edition;
  
  @decorators.relation({
    type: 'belongsTo', 
    model: 'Author', 
    foreignKey: 'authorId'
  })
  author: IBelongsToRelation<Author>;
}

function uniqueValidator(property) {
  const query = new Query();
  query.equal(property.name, this[property.name]);
  return Book.count(query.toJSON().where).map(c => {
    if(c === 0) {
      return;
    }
    return `"${property.name}" does not have unique value`;
  });  
}
