import { FaceCameraLensDirection } from '../config/enums/FaceCameraLensDirection';
import { FaceImageFormat } from '../config/enums/FaceImageFormat';
import { FaceMaskFormat } from '../config/enums/FaceMaskFormat';
import { FaceResolutionPreset } from '../config/enums/FaceResolutionPreset';
import type { FaceConfig } from '../config/FaceConfig';

const defaultConfig: FaceConfig = {
  licenseKey: '',
  resolutionPreset: FaceResolutionPreset.VERYHIGH,
  lensDirection: FaceCameraLensDirection.FRONT,
  imageFormat: FaceImageFormat.JPEG,
  flashEnabled: false,
  fontFamily: 'facesdk_opensans_bold',
  liveness: {
    enabled: false,
    debug: false,
    timeToCapture: 3000,
    maxFaceDetectionTime: 60000,
    minFaceProp: 0.1,
    maxFaceProp: 0.4,
    minFaceWidth: 150,
    minFaceHeight: 150,
    ied: 90,
    bboxPad: 20,
    faceDetectionThresh: 0.5,
    rollThresh: 4.0,
    pitchThresh: 4.0,
    yawThresh: 4.0,
    closedEyesThresh: 0.7,
    smilingThresh: 0.7,
    tooDarkThresh: 50,
    tooLightThresh: 170,
    faceCentralizationThresh: 0.05,
  },
  continuousCapture: {
    enabled: false,
    timeToCapture: 1000,
    maxNumberFrames: 40,
  },
  faceDetection: {
    enabled: true,
    autoCapture: true,
    multipleFacesEnabled: false,
    timeToCapture: 3000,
    maxFaceDetectionTime: 40000,
    scoreThreshold: 0.7,
  },
  mask: {
    enabled: true,
    type: FaceMaskFormat.FACE,
    backgroundColor: '#CC000000',
    frameColor: '#FFFFFF',
    frameEnabledColor: '#16AC81',
    frameErrorColor: '#E25353',
  },
  titleText: {
    enabled: true,
    content: 'Capturing Face',
    textColor: '#FFFFFF',
    textSize: 20,
  },
  loadingText: {
    enabled: true,
    content: 'Processing...',
    textColor: '#FFFFFF',
    textSize: 14,
  },
  helpText: {
    enabled: true,
    content: 'Fit your face into the shape below',
    textColor: '#FFFFFF',
    textSize: 14,
  },
  feedbackText: {
    enabled: true,
    messages: {
      noDetection: 'No faces detected',
      multipleFaces: 'Multiple faces detected',
      faceCentered: 'Face centered. Do not move',
      tooClose: 'Turn your face away',
      tooFar: 'Bring your face closer',
      tooLeft: 'Move your face to the right',
      tooRight: 'Move your face to the left',
      tooUp: 'Move your face down',
      tooDown: 'Move your face up',
      invalidIED: 'Invalid inter-eye distance',
      faceAngleMisaligned: 'Misaligned face angle',
      closedEyes: 'Open your eyes',
      smiling: 'Do not smile',
      tooDark: 'Too dark',
      tooLight: 'Too light',
    },
    textColor: '#FFFFFF',
    textSize: 14,
  },
  backButton: {
    enabled: true,
    backgroundColor: '#00000000',
    buttonPadding: 0,
    buttonSize: { width: 56, height: 56 },
    iconOptions: {
      enabled: true,
      iconFile: 'facesdk_ic_close',
      iconColor: '#FFFFFF',
      iconSize: { width: 32, height: 32 },
    },
    labelOptions: {
      enabled: false,
      content: 'Back',
      textColor: '#FFFFFF',
      textSize: 14,
    },
  },
  flashButton: {
    enabled: false,
    backgroundColor: '#FFFFFF',
    buttonPadding: 0,
    buttonSize: { width: 56, height: 56 },
    flashOnIconOptions: {
      enabled: true,
      iconFile: 'facesdk_ic_flash_on',
      iconColor: '#FFCC01',
      iconSize: { width: 32, height: 32 },
    },
    flashOnLabelOptions: {
      enabled: false,
      content: 'Flash On',
      textColor: '#323232',
      textSize: 14,
    },
    flashOffIconOptions: {
      enabled: true,
      iconFile: 'facesdk_ic_flash_off',
      iconColor: '#323232',
      iconSize: { width: 32, height: 32 },
    },
    flashOffLabelOptions: {
      enabled: false,
      content: 'Flash Off',
      textColor: '#323232',
      textSize: 14,
    },
  },
  switchCameraButton: {
    enabled: true,
    backgroundColor: '#FFFFFF',
    buttonPadding: 0,
    buttonSize: { width: 56, height: 56 },
    iconOptions: {
      enabled: true,
      iconFile: 'facesdk_ic_switch_camera',
      iconColor: '#323232',
      iconSize: { width: 32, height: 32 },
    },
    labelOptions: {
      enabled: false,
      content: 'Switch Camera',
      textColor: '#323232',
      textSize: 14,
    },
  },
  captureButton: {
    enabled: true,
    backgroundColor: '#FFFFFF',
    buttonPadding: 0,
    buttonSize: { width: 56, height: 56 },
    iconOptions: {
      enabled: true,
      iconFile: 'facesdk_ic_capture',
      iconColor: '#323232',
      iconSize: { width: 32, height: 32 },
    },
    labelOptions: {
      enabled: false,
      content: 'Capture',
      textColor: '#323232',
      textSize: 14,
    },
  },
};

export function mergeConfigs(config: FaceConfig): FaceConfig {
  return {
    ...defaultConfig,
    ...config,
    liveness: {
      ...defaultConfig.liveness,
      ...config.liveness,
    },
    continuousCapture: {
      ...defaultConfig.continuousCapture,
      ...config.continuousCapture,
    },
    faceDetection: {
      ...defaultConfig.faceDetection,
      ...config.faceDetection,
    },
    mask: {
      ...defaultConfig.mask,
      ...config.mask,
    },
    titleText: {
      ...defaultConfig.titleText,
      ...config.titleText,
    },
    loadingText: {
      ...defaultConfig.loadingText,
      ...config.loadingText,
    },
    helpText: {
      ...defaultConfig.helpText,
      ...config.helpText,
    },
    feedbackText: {
      ...defaultConfig.feedbackText,
      ...config.feedbackText,
      messages: {
        ...defaultConfig.feedbackText?.messages,
        ...config.feedbackText?.messages,
      },
    },
    backButton: {
      ...defaultConfig.backButton,
      ...config.backButton,
      buttonSize: {
        ...defaultConfig.backButton?.buttonSize,
        ...config.backButton?.buttonSize,
      },
      iconOptions: {
        ...defaultConfig.backButton?.iconOptions,
        ...config.backButton?.iconOptions,
        iconSize: {
          ...defaultConfig.backButton?.iconOptions?.iconSize,
          ...config.backButton?.iconOptions?.iconSize,
        },
      },
      labelOptions: {
        ...defaultConfig.backButton?.labelOptions,
        ...config.backButton?.labelOptions,
      },
    },
    flashButton: {
      ...defaultConfig.flashButton,
      ...config.flashButton,
      buttonSize: {
        ...defaultConfig.flashButton?.buttonSize,
        ...config.flashButton?.buttonSize,
      },
      flashOnIconOptions: {
        ...defaultConfig.flashButton?.flashOnIconOptions,
        ...config.flashButton?.flashOnIconOptions,
        iconSize: {
          ...defaultConfig.flashButton?.flashOnIconOptions?.iconSize,
          ...config.flashButton?.flashOnIconOptions?.iconSize,
        },
      },
      flashOnLabelOptions: {
        ...defaultConfig.flashButton?.flashOnLabelOptions,
        ...config.flashButton?.flashOnLabelOptions,
      },
      flashOffIconOptions: {
        ...defaultConfig.flashButton?.flashOffIconOptions,
        ...config.flashButton?.flashOffIconOptions,
        iconSize: {
          ...defaultConfig.flashButton?.flashOffIconOptions?.iconSize,
          ...config.flashButton?.flashOffIconOptions?.iconSize,
        },
      },
      flashOffLabelOptions: {
        ...defaultConfig.flashButton?.flashOffLabelOptions,
        ...config.flashButton?.flashOffLabelOptions,
      },
    },
    switchCameraButton: {
      ...defaultConfig.switchCameraButton,
      ...config.switchCameraButton,
      buttonSize: {
        ...defaultConfig.switchCameraButton?.buttonSize,
        ...config.switchCameraButton?.buttonSize,
      },
      iconOptions: {
        ...defaultConfig.switchCameraButton?.iconOptions,
        ...config.switchCameraButton?.iconOptions,
        iconSize: {
          ...defaultConfig.switchCameraButton?.iconOptions?.iconSize,
          ...config.switchCameraButton?.iconOptions?.iconSize,
        },
      },
      labelOptions: {
        ...defaultConfig.switchCameraButton?.labelOptions,
        ...config.switchCameraButton?.labelOptions,
      },
    },
    captureButton: {
      ...defaultConfig.captureButton,
      ...config.captureButton,
      buttonSize: {
        ...defaultConfig.captureButton?.buttonSize,
        ...config.captureButton?.buttonSize,
      },
      iconOptions: {
        ...defaultConfig.captureButton?.iconOptions,
        ...config.captureButton?.iconOptions,
        iconSize: {
          ...defaultConfig.captureButton?.iconOptions?.iconSize,
          ...config.captureButton?.iconOptions?.iconSize,
        },
      },
      labelOptions: {
        ...defaultConfig.captureButton?.labelOptions,
        ...config.captureButton?.labelOptions,
      },
    },
  };
}
