import { formatPrice } from 'beta/utils/helpers';
import { extendObservable, makeObservable, observable } from 'mobx';

import { Contract } from '../../typings/graphql';

export default class Hradleid {
  constructor({ hradleid = {} }) {
    makeObservable(this, {
      contracts: observable,
      trigger: observable,
    });

    extendObservable(this, hradleid);
  }

  contracts: Contract[] | null = null;
  trigger = 0;

  incrementTrigger() {
    this.trigger++;
  }

  setContracts(contracts: Array<Contract>) {
    this.contracts = contracts;
  }

  getContractsAlreadyWithVariant(variantId: string) {
    const contractsThatDontFit = this.contracts
      ?.filter((contract) => contract?.variant?.id === variantId)
      .map((contract) => contract.id);
    return contractsThatDontFit;
  }

  getVariantOrMixed() {
    if (!this.contracts || this.contracts.length === 0) {
      return 'Blandað';
    }

    const firstVariantName = this.contracts?.[0]?.variant?.name;

    const allSameVariant = this.contracts.every(
      (contract) => contract?.variant?.name === firstVariantName,
    );

    return allSameVariant ? firstVariantName : 'Blandað';
  }

  getCeilingOrMixed() {
    if (!this.contracts || this.contracts.length === 0) {
      return 'Blandað';
    }

    const extraPayer = this.contracts?.[0]?.extraPayers?.find(
      (item) => item?.amount && item?.amount > 0 && item?.status === 'Active',
    );

    const firstCeiling = extraPayer?.amount;

    const allSameCeiling = this.contracts.every(
      (contract) =>
        contract?.extraPayers?.find(
          (item) => item?.amount && item?.amount > 0 && item?.status === 'Active',
        )?.amount === firstCeiling,
    );

    if (allSameCeiling && !firstCeiling) {
      return '0 kr.';
    }

    return allSameCeiling ? formatPrice(firstCeiling ?? 0) : 'Blandað';
  }
}
