import { TSchema, Data } from '@evolution-sdk/evolution';
import { Schema } from 'effect';

const OpaqueData = Schema.typeSchema(Data.DataSchema);

export const MultisigSchema = TSchema.Union(
  TSchema.Struct(
    {
      Signature: TSchema.Struct(
        {
          keyHash: TSchema.ByteArray,
        },
        { flatFields: true },
      ),
    },
    { flatInUnion: true },
  ),
  TSchema.Struct(
    {
      AtLeast: TSchema.Struct(
        {
          required: TSchema.Integer,
          authSignatories: TSchema.Array(OpaqueData),
        },
        { flatFields: true },
      ),
    },
    { flatInUnion: true },
  ),
);

export type Multisig = typeof MultisigSchema.Type;

export function parseMultisig(datum: string): Multisig {
  return Data.withSchema(MultisigSchema).fromCBORHex(datum);
}

export function fromDataMultisig(data: Data.Data): Multisig {
  return Data.withSchema(MultisigSchema).fromCBORHex(Data.toCBORHex(data));
}

export function toDataMultisig(data: Multisig): Data.Data {
  return Data.withSchema(MultisigSchema).toData(data);
}

export function serialiseMultisig(datum: Multisig): string {
  return Data.withSchema(MultisigSchema).toCBORHex(datum);
}
