import 'package:isar/isar.dart';

import '../../db/isar/main_db.dart';
import '../../dto/ordinals/inscription_data.dart';
import 'models/isar_models.dart';

part 'ordinal.g.dart';

@collection
class Ordinal {
  Id id = Isar.autoIncrement;

  final String walletId;

  @Index(
    unique: true,
    replace: true,
    composite: [
      CompositeIndex("utxoTXID"),
      CompositeIndex("utxoVOUT"),
    ],
  )
  final String inscriptionId;

  final int inscriptionNumber;

  final String content;

  // following two are used to look up the UTXO object in isar combined w/ walletId
  final String utxoTXID;
  final int utxoVOUT;

  Ordinal({
    required this.walletId,
    required this.inscriptionId,
    required this.inscriptionNumber,
    required this.content,
    required this.utxoTXID,
    required this.utxoVOUT,
  });

  factory Ordinal.fromInscriptionData(InscriptionData data, String walletId) {
    return Ordinal(
      walletId: walletId,
      inscriptionId: data.inscriptionId,
      inscriptionNumber: data.inscriptionNumber,
      content: data.content,
      utxoTXID: data.output.split(':')[
          0], // "output": "062f32e21aa04246b8873b5d9a929576addd0339881e1ea478b406795d6b6c47:0"
      utxoVOUT: int.parse(data.output.split(':')[1]),
    );
  }

  Ordinal copyWith({
    String? walletId,
    String? inscriptionId,
    int? inscriptionNumber,
    String? content,
    String? utxoTXID,
    int? utxoVOUT,
  }) {
    return Ordinal(
      walletId: walletId ?? this.walletId,
      inscriptionId: inscriptionId ?? this.inscriptionId,
      inscriptionNumber: inscriptionNumber ?? this.inscriptionNumber,
      content: content ?? this.content,
      utxoTXID: utxoTXID ?? this.utxoTXID,
      utxoVOUT: utxoVOUT ?? this.utxoVOUT,
    );
  }

  UTXO? getUTXO(MainDB db) {
    return db.isar.utxos
        .where()
        .walletIdEqualTo(walletId)
        .filter()
        .txidEqualTo(utxoTXID)
        .and()
        .voutEqualTo(utxoVOUT)
        .findFirstSync();
  }

  @override
  String toString() {
    return 'Ordinal {'
        ' walletId: $walletId,'
        ' inscriptionId: $inscriptionId,'
        ' inscriptionNumber: $inscriptionNumber,'
        ' content: $content,'
        ' utxoTXID: $utxoTXID,'
        ' utxoVOUT: $utxoVOUT'
        ' }';
  }
}