import 'package:colorize/colorize.dart';
import 'package:core_generator/src/definition.dart';
import 'package:core_generator/src/field_type.dart';
import 'package:core_generator/src/key.dart';

class Property {
  final String name;
  final FieldType type;
  final Definition definition;
  String initialValue;
  String initialValueRuntime;
  bool isVirtual = false;
  bool animates = false;
  String group;
  Key key;
  String description;
  bool isNullable = false;
  bool isRuntime = true;
  bool isCoop = true;
  bool isSetOverride = false;
  bool isGetOverride = false;
  bool isEncoded = false;
  FieldType typeRuntime;

  factory Property(Definition type, String name, Map<String, dynamic> data) {
    if (data['runtime'] is bool && data['runtime'] == false) {
      return null;
    }

    var fieldType =
        FieldType.find(data['typeRuntime']) ?? FieldType.find(data['type']);

    if (fieldType == null) {
      color('Invalid field type ${data['type']} for $name.', front: Styles.RED);
      return null;
    }
    return Property.make(type, name, fieldType, data);
  }

  Property.make(
      this.definition, this.name, this.type, Map<String, dynamic> data) {
    dynamic encodedValue = data['encoded'];
    if (encodedValue is bool) {
      isEncoded = encodedValue;
    }
    dynamic descriptionValue = data['description'];
    if (descriptionValue is String) {
      description = descriptionValue;
    }
    dynamic nullableValue = data['nullable'];
    if (nullableValue is bool) {
      isNullable = nullableValue;
    }
    dynamic init = data['initialValue'];
    if (init is String) {
      initialValue = init;
    }
    dynamic initRuntime = data['initialValueRuntime'];
    if (initRuntime is String) {
      initialValueRuntime = initRuntime;
    }
    dynamic overrideSet = data['overrideSet'];
    if (overrideSet is bool && overrideSet) {
      isSetOverride = true;
    }
    dynamic overrideGet = data['overrideGet'];
    if (overrideGet is bool && overrideGet) {
      isGetOverride = true;
    }
    dynamic a = data['animates'];
    if (a is bool) {
      animates = a;
    }
    dynamic virtualValue = data['virtual'];
    isVirtual = virtualValue is bool && virtualValue;
    dynamic g = data['group'];
    if (g is String) {
      group = g;
    }
    dynamic e = data['editorOnly'];
    if (e is bool && e) {
      isCoop = false;
    }
    dynamic r = data['runtime'];
    if (r is bool) {
      isRuntime = r;
    }
    dynamic c = data['coop'];
    if (c is bool) {
      isCoop = c;
    }
    dynamic rt = data['typeRuntime'];
    if (rt is String) {
      typeRuntime = FieldType.find(rt);
    }
    key = Key.fromJSON(data['key']) ?? Key.forProperty(this);
  }

  FieldType getExportType() => typeRuntime ?? type;

  @override
  String toString() {
    return '$name(${key.intValue})';
  }

  String get capitalizedName => '${name[0].toUpperCase()}${name.substring(1)}'
      .replaceAll('<', '')
      .replaceAll('>', '');
}
