import * as React from "react";
import { Observable } from "rxjs";
import {
  CProps,
  ComponentList,
  ComponentListProps
} from "../runtime";
import {
  Arc as Protocol,
  ArcConfig as ProtocolConfig
} from "../protocol";
import {
  ArcReputation as Component,
  ReputationEntity as Entity,
  ReputationData as Data
} from "./";
import {
  IReputationQueryOptions as FilterOptions
} from "@daostack/client";

interface RequiredProps extends ComponentListProps<Entity, Data, FilterOptions> { }

interface InferredProps {
  arcConfig: ProtocolConfig | undefined;
}

type Props = RequiredProps & InferredProps;

class ArcReputations extends ComponentList<Props, Component>
{
  createObservableEntities(): Observable<Entity[]> {
    const { arcConfig, filter } = this.props;
    if (!arcConfig) {
      throw Error("Arc Config Missing: Please provide this field as a prop, or use the inference component.");
    }
    return Entity.search(arcConfig.connection, filter);
  }

  renderComponent(entity: Entity, children: any): React.ComponentElement<CProps<Component>, any> {
    const { arcConfig } = this.props;

    return (
      <Component address={entity.address} arcConfig={arcConfig}>
      {children}
      </Component>
    );
  }
}

class Reputations extends React.Component<RequiredProps>
{
  render() {
    const { children, sort, filter } = this.props;

    return (
      <Protocol.Config>
      {(arc: ProtocolConfig) =>
        <ArcReputations arcConfig={arc} sort={sort} filter={filter}>
        {children}
        </ArcReputations>
      }
      </Protocol.Config>
    );
  }
}

export default Reputations;

export {
  ArcReputations,
  Reputations
};
