import 'package:flutter/material.dart';
import 'package:oc_front/models/resources/resources.dart';

class WorkflowItem extends AbstractItem<WorkflowPricing, WorkflowPartnership, WorkflowInstance, WorkflowItem> {
  // special attributes
  String? workflowID;
  
  WorkflowItem({
    this.workflowID,
  }): super();  

  @override String get topic => "workflow";

  @override deserialize(dynamic data) {
    try { data = data as Map<String, dynamic>;
    } catch (e) { return WorkflowItem(); }   
    var w = WorkflowItem(
      workflowID: data.containsKey("workflow_id") && data["workflow_id"] != null ? data["workflow_id"] : null,
    );
    w.mapFromJSON(data, WorkflowInstance());
    if (w.logo != null) { // get image dimensions
      var image = Image.network(w.logo!);
      image.image
        .resolve(const ImageConfiguration())
        .addListener(
            ImageStreamListener(
                (ImageInfo info, bool _) {
                  w.width = info.image.width.toDouble();
                  w.height = info.image.height.toDouble();
                }));
    }
    return w;
  }

  @override
  Map<String, dynamic> infos() {
    return {};
  }

  @override Map<String, dynamic> serialize() {
    Map<String, dynamic> obj ={
      "workflow_id": workflowID,
    };
    obj.addAll(toJSON());
    return obj;
  }
}

class WorkflowInstance extends AbstractInstance<WorkflowPricing, WorkflowPartnership> {
  WorkflowInstance(): super();

  @override
  WorkflowInstance deserialize(json) {
    try { json = json as Map<String, dynamic>;
    } catch (e) { return WorkflowInstance(); }
    var w = WorkflowInstance();
    w.mapFromJSON(json, WorkflowPartnership());
    return w;
  }

  @override
  Map<String, dynamic> infos() {
    return {};
  }

  @override
  Map<String, dynamic> serialize() {
    return toJSON();
  }
}

class WorkflowPartnership extends AbstractPartnerShip<WorkflowPricing> {
  WorkflowPartnership(): super();

  @override
  WorkflowPartnership deserialize(json) {
    try { json = json as Map<String, dynamic>;
    } catch (e) { return WorkflowPartnership(); }
    var w = WorkflowPartnership();
    w.mapFromJSON(json, WorkflowPricing());
    return w;
  }

  @override
  Map<String, dynamic> serialize() {
    return toJSON();
  }
}

class WorkflowPricing extends AbstractPricing {
  @override WorkflowPricing deserialize(json) {
    var w = WorkflowPricing();
    w.mapFromJSON(json);
    return w;
  }
  @override
  Map<String, dynamic> serialize() {
    return toJSON();
  }
}