/**
 * @flow
 * DynamicLink representation wrapper
 */
import AnalyticsParameters from './AnalyticsParameters';
import AndroidParameters from './AndroidParameters';
import IOSParameters from './IOSParameters';
import ITunesParameters from './ITunesParameters';
import NavigationParameters from './NavigationParameters';
import SocialParameters from './SocialParameters';

import type { NativeDynamicLink } from './types';

export default class DynamicLink {
  _analytics: AnalyticsParameters;
  _android: AndroidParameters;
  _dynamicLinkDomain: string;
  _ios: IOSParameters;
  _itunes: ITunesParameters;
  _link: string;
  _navigation: NavigationParameters;
  _social: SocialParameters;

  constructor(link: string, dynamicLinkDomain: string) {
    this._analytics = new AnalyticsParameters(this);
    this._android = new AndroidParameters(this);
    this._dynamicLinkDomain = dynamicLinkDomain;
    this._ios = new IOSParameters(this);
    this._itunes = new ITunesParameters(this);
    this._link = link;
    this._navigation = new NavigationParameters(this);
    this._social = new SocialParameters(this);
  }

  get analytics(): AnalyticsParameters {
    return this._analytics;
  }

  get android(): AndroidParameters {
    return this._android;
  }

  get ios(): IOSParameters {
    return this._ios;
  }

  get itunes(): ITunesParameters {
    return this._itunes;
  }

  get navigation(): NavigationParameters {
    return this._navigation;
  }

  get social(): SocialParameters {
    return this._social;
  }

  build(): NativeDynamicLink {
    if (!this._link) {
      throw new Error('DynamicLink: Missing required `link` property');
    } else if (!this._dynamicLinkDomain) {
      throw new Error(
        'DynamicLink: Missing required `dynamicLinkDomain` property'
      );
    }

    return {
      analytics: this._analytics.build(),
      android: this._android.build(),
      dynamicLinkDomain: this._dynamicLinkDomain,
      ios: this._ios.build(),
      itunes: this._itunes.build(),
      link: this._link,
      navigation: this._navigation.build(),
      social: this._social.build(),
    };
  }
}
