import * as ts from 'typescript';

import { getDecorator, getDecoratorName } from '../helpers';

export function transformProperty(members: any[], index: number) {
  const property = members[index] as ts.PropertyDeclaration,
    decorator = getDecorator(property),
    decoratorName = getDecoratorName(decorator);

  let type: 'cordova' | 'instance';

  switch (decoratorName) {
    case 'CordovaProperty':
      type = 'cordova';
      break;

    case 'InstanceProperty':
      type = 'instance';
      break;

    default:
      return property;
  }

  const getter = ts.createGetAccessor(
    undefined,
    undefined,
    property.name,
    undefined,
    property.type,
    ts.createBlock([
      ts.createReturn(
        ts.createCall(ts.createIdentifier(type + 'PropertyGet'), undefined, [
          ts.createThis(),
          ts.createLiteral((property.name as any).text),
        ])
      ),
    ])
  );

  const setter = ts.createSetAccessor(
    undefined,
    undefined,
    property.name,
    [ts.createParameter(undefined, undefined, undefined, 'value', undefined, property.type)],
    ts.createBlock([
      ts.createStatement(
        ts.createCall(ts.createIdentifier(type + 'PropertySet'), undefined, [
          ts.createThis(),
          ts.createLiteral((property.name as any).text),
          ts.createIdentifier('value'),
        ])
      ),
    ])
  );

  return [getter, setter];
}