import { MagGroupAndFilterDescription, SelectableZorroDataSource } from "ng-stalk/core/crud";
import { MagCodeCacheService, MagConfigService } from "ng-stalk/core/service";

import {<%= classify(name) %>Dto} from '../sample/<%= dasherize(name) %>-dto';
import {<%= classify(name) %>SearchModel} from '../<%= dasherize(name) %>-search-form/<%= dasherize(name) %>-search-model';

/**
 * 클라이언트 페이징 방식을 사용할 경우에 사용 가능한 필터링 대상 선정 함수
 * @param item
 * @param searchModel
 */
function filterModel(item: <%= classify(name) %>Dto, searchModel: <%= classify(name) %>SearchModel): boolean {
  // 특정 컬럼 제한을 적용하고 싶은 경우
  if (searchModel.status) {
    if (item.status !== searchModel.status) {
      return false;
    }
  }

  // 단일 키워드 형태의 필터링 조건을 적용하고 싶은 경우
  if (searchModel.keyword) {
    const nameI18nString = item.i18nNames.map(i18nPair => i18nPair.value).join('')
    const filterTarget = `${item.id}${item.name}${nameI18nString}${item.memo}`;
    return filterTarget.toLocaleLowerCase().indexOf(searchModel.keyword.toLocaleLowerCase()) >= 0;
  }

  // 멀티 키워드 형태의 필터링 조건을 적용하고 싶은 경우
  if (searchModel.keywords && searchModel.keywords.length > 0) {
    const nameI18nString = item.i18nNames.map(i18nPair => i18nPair.value).join('')
    const filterTarget = `${item.id}${item.name}${nameI18nString}${item.memo}`;
    let allMatched = true;
    for (const keyword of searchModel.keywords) {
      if (filterTarget.toLocaleLowerCase().indexOf(keyword.toLocaleLowerCase()) < 0) {
        allMatched = false;
      }
    }
    if (!allMatched) {
      return false;
    }
  }

  return true;
}

/**
 * 데이터에 기반한 테이블 컬럼 필터를 생성한다.
 * @param item
 */
const makeFilterValues = (item: <%= classify(name) %>Dto): MagGroupAndFilterDescription[] => {
  const result: MagGroupAndFilterDescription[] = [];
  // result.push(new MagGroupAndFilterDescription({
  //   group: 'category',
  //   filterDescription: {
  //     text: item.category,
  //     value: item.category,
  //   },
  // }));
  // result.push(new MagGroupAndFilterDescription({
  //   group: 'name',
  //   filterDescription: {
  //     text: item.name,
  //     value: item.name,
  //   },
  // }));
  return result;
};

export class <%= classify(name) %>DataSource extends SelectableZorroDataSource<<%= classify(name) %>Dto, <%= classify(name) %>SearchModel> {

  constructor(
    magCodeCacheService: MagCodeCacheService // TODO 고정된 테이블 필터가 필요할 경우 활성화 하여 사용 가능, 불필요한 경우 삭제
  ) {
    // TODO <머신건_페이징_가이드> 클라이언트 페이징
    super({
      modelFilter: filterModel,
      multipleSelection: true,
      makeFilterValues: makeFilterValues,

      // TODO : 고정된 테이블 필터 값 생성시 설정한다. 불필요한 경우 삭제
      filterValues: {
        status: magCodeCacheService.getList('fileStatuses').map((codeAndName) => {
          return {
            text: codeAndName.name,
            value: codeAndName.code
          };
        }),
      }
    });
    //  TODO <머신건_페이징_가이드> 서버 페이징
    // super({
    //   modelFilter: filterModel,
    //   multipleSelection: true,
    //   makeFilterValues: makeFilterValues,
    // });

    this.init();
  }

  init(): void {
    this.data = [];
  }

  isEquals(a: <%= classify(name) %>Dto, b: <%= classify(name) %>Dto): boolean {
    return a.id === b.id;
  }

}
