import { BackgroundStyle } from '../common/Common';
import { BarButtonConfiguration } from '../common/Common';
import { ButtonConfiguration } from '../common/Common';
import { CroppingBottomBar } from '../document/CroppingScreenConfiguration';
import { CroppingScreenConfiguration } from '../document/CroppingScreenConfiguration';
import { CroppingTextLocalization } from '../document/CroppingTextLocalization';
import { DeepPartial, PartiallyConstructible } from '../../utils';
import { DocumentAnalysisMode } from '../document/DocumentScannerOutputSettings';
import { ForegroundStyle } from '../common/Common';
import { IconStyle } from '../common/Common';
import { NavigationBarMode } from '../common/NavigationBarConfiguration';
import { OrientationLockMode } from '../common/Common';
import { Palette } from '../common/Common';
import { StatusBarMode } from '../common/TopBarConfiguration';
import { StyledText } from '../common/Common';

/**
Configuration of the general appearance for the cropping screen.
*/
export class CroppingAppearanceConfiguration extends PartiallyConstructible {
  /**
    Determines the visual mode used for the status bar icons.
    Default is LIGHT
    */
  public statusBarMode: StatusBarMode = 'LIGHT';
  /**
    Determines the visual mode used for the navigation bar icons. Android only.
    Default is LIGHT
    */
  public navigationBarMode: NavigationBarMode = 'LIGHT';
  /**
    The background color of the top bar. Only applicable when the visual mode is specified as 'SOLID', otherwise ignored.
    Default is "?sbColorPrimary"
    */
  public topBarBackgroundColor: string = '?sbColorPrimary';
  /**
    The background color of the bottom bar.
    Default is "?sbColorPrimary"
    */
  public bottomBarBackgroundColor: string = '?sbColorPrimary';
  /**
    Which mode to use when orientation should be locked to landscape or portrait.
    Default is NONE
    */
  public orientationLockMode: OrientationLockMode = 'NONE';

  /** @param source {@displayType `DeepPartial<CroppingAppearanceConfiguration>`} */
  public constructor(source: DeepPartial<CroppingAppearanceConfiguration> = {}) {
    super();
    if (source.statusBarMode !== undefined) {
      this.statusBarMode = source.statusBarMode;
    }
    if (source.navigationBarMode !== undefined) {
      this.navigationBarMode = source.navigationBarMode;
    }
    if (source.topBarBackgroundColor !== undefined) {
      this.topBarBackgroundColor = source.topBarBackgroundColor;
    }
    if (source.bottomBarBackgroundColor !== undefined) {
      this.bottomBarBackgroundColor = source.bottomBarBackgroundColor;
    }
    if (source.orientationLockMode !== undefined) {
      this.orientationLockMode = source.orientationLockMode;
    }
  }
}

/**
Configuration of the standalone cropping screen.
*/
export class CroppingConfiguration extends PartiallyConstructible {
  /**
    Version number of the configuration object.
    Default is "1.0"
    */
  public version: string = '1.0';
  /**
    The configuration object should be applied for this screen.
    Default is "CroppingConfiguration"
    */
  public screen: string = 'CroppingConfiguration';
  /**
    Define the screen's base color values from which other colors are derived.
    */
  public palette: Palette = new Palette({
    sbColorPrimary: '#C8193C',
    sbColorPrimaryDisabled: '#F5F5F5',
    sbColorNegative: '#FF3737',
    sbColorPositive: '#4EFFB4',
    sbColorWarning: '#FFCE5C',
    sbColorSecondary: '#FFEDEE',
    sbColorSecondaryDisabled: '#F5F5F5',
    sbColorOnPrimary: '#FFFFFF',
    sbColorOnSecondary: '#C8193C',
    sbColorSurface: '#FFFFFF',
    sbColorOutline: '#EFEFEF',
    sbColorOnSurfaceVariant: '#707070',
    sbColorOnSurface: '#000000',
    sbColorSurfaceLow: '#00000026',
    sbColorSurfaceHigh: '#0000007A',
    sbColorModalOverlay: '#000000A3',
  });
  /**
    The UUID of the document to be cropped.
    */
  public documentUuid: string;
  /**
    The UUID of the page of the document to be cropped.
    */
  public pageUuid: string;
  /**
    Configuration of all the strings for the standalone cropping screen.
    */
  public localization: CroppingTextLocalization = new CroppingTextLocalization({});
  /**
    Configuration of the general appearance for the cropping screen.
    */
  public appearance: CroppingAppearanceConfiguration = new CroppingAppearanceConfiguration({});
  /**
    Configuration of the cropping screen.
    */
  public cropping: CroppingScreenConfiguration = new CroppingScreenConfiguration({});
  /**
    Determines if the quality analysis for the acknowledgement mode will run on the filtered or the unfiltered image.
    Default is UNFILTERED_DOCUMENT
    */
  public documentAnalysisMode: DocumentAnalysisMode = 'UNFILTERED_DOCUMENT';

  /** @param source {@displayType `DeepPartial<CroppingConfiguration>`} */
  public constructor(source: DeepPartial<CroppingConfiguration> = {}) {
    super();
    if (source.version !== undefined) {
      this.version = source.version;
    }
    if (source.screen !== undefined) {
      this.screen = source.screen;
    }
    if (source.palette !== undefined) {
      this.palette = new Palette(source.palette);
    }
    if (source.documentUuid !== undefined) {
      this.documentUuid = source.documentUuid;
    } else {
      throw new Error('documentUuid must be present in constructor argument');
    }
    if (source.pageUuid !== undefined) {
      this.pageUuid = source.pageUuid;
    } else {
      throw new Error('pageUuid must be present in constructor argument');
    }
    if (source.localization !== undefined) {
      this.localization = new CroppingTextLocalization(source.localization);
    }
    if (source.appearance !== undefined) {
      this.appearance = new CroppingAppearanceConfiguration(source.appearance);
    }
    if (source.cropping !== undefined) {
      this.cropping = new CroppingScreenConfiguration(source.cropping);
    }
    if (source.documentAnalysisMode !== undefined) {
      this.documentAnalysisMode = source.documentAnalysisMode;
    }
  }
}
