// Copyright 2021 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:gcloud/db.dart';
import 'package:github/github.dart';

@Kind(name: 'Branch', idType: IdType.String)
class Branch extends Model<String> {
  Branch({Key<String>? key, this.lastActivity, this.channel}) {
    parentKey = key?.parent;
    id = key?.id;
  }

  /// The timestamp (in milliseconds since the Epoch) of the last time
  /// when current branch had activity.
  @IntProperty(propertyName: 'lastActivity', required: false)
  int? lastActivity;

  /// The channel of current branch
  @StringProperty(propertyName: 'channel', required: false)
  String? channel;

  /// [RepositorySlug] of where this commit exists.
  RepositorySlug get slug => RepositorySlug.full(repository);

  String get repository => key.id!.substring(0, key.id!.lastIndexOf('/'));

  String get name => key.id!.substring(key.id!.lastIndexOf('/') + 1);

  @override
  String toString() {
    final StringBuffer buf = StringBuffer()
      ..write('$runtimeType(')
      ..write('id: $id')
      ..write(', key: ${parentKey == null ? null : key.id}')
      ..write(', branch: $name')
      ..write(', channel: $channel')
      ..write(', repository: $repository')
      ..write(', lastActivity: $lastActivity')
      ..write(')');
    return buf.toString();
  }

  Map<String, dynamic> toJson() {
    return <String, dynamic>{
      'id': id,
      'branch': <String, dynamic>{
        'branch': name,
        'repository': repository,
      },
    };
  }
}
