/**

 * Copyright (c) 2024 Huawei Technologies Co., Ltd.

 *

 * This source code is licensed under the MIT license found in the

 * LICENSE-MIT file in the root directory of this source tree.

 */



import React, { useState } from 'react';

import { StyleSheet, StatusBar, Text, View, StatusBarStyle } from 'react-native';

import { TestCase, TestSuite } from '@rnoh/testerino';



export function StatusBarTest() {

  return (

    <TestSuite name="Status bar">

      <StatusBarView />

    </TestSuite>

  );

}

const STYLES = ['default', 'dark-content', 'light-content'] as const;

const BACKGROUND_COLORS = ['#FF000088', '#00FF0088'];



function StatusBarView() {

  const [hidden, setHidden] = useState(false);

  const [backgroundColor, setBackgroundColor] = useState(BACKGROUND_COLORS[0]);

  const [statusBarStyle, setStatusBarStyle] = useState<StatusBarStyle>(

    STYLES[0],

  );

  const [translucent, setTranslucent] = useState(false);



  const changeStatusBarStyle = () => {

    const styleId = STYLES.indexOf(statusBarStyle) + 1;

    if (styleId === STYLES.length) {

      setStatusBarStyle(STYLES[0]);

    } else {

      setStatusBarStyle(STYLES[styleId]);

    }

  };

  const changeBackgroundColor = () => {

    setBackgroundColor(prevColor => {

      const newColorId = BACKGROUND_COLORS.indexOf(prevColor) + 1;

      return BACKGROUND_COLORS[

        newColorId === BACKGROUND_COLORS.length ? 0 : newColorId

      ];

    });

  };



  return (

    <View>

      <StatusBar

        backgroundColor={backgroundColor}

        barStyle={statusBarStyle}

        hidden={hidden}

        translucent={translucent}

      />

      <TestCase itShould="toggle status bar visibility">

        <View

          style={styles.button}

          onTouchEnd={() => {

            setHidden(!hidden);

          }}>

          <Text style={styles.buttonText}>{hidden ? 'hidden' : 'visible'}</Text>

        </View>

      </TestCase>

      <TestCase itShould="toggle status bar background color(red/green), with alpha 88">

        <View

          style={styles.button}

          onTouchEnd={() => {

            changeBackgroundColor();

          }}>

          <Text style={styles.buttonText}>{backgroundColor}</Text>

        </View>

      </TestCase>

      <TestCase itShould="toggle status bar style (light-content(default)/dark-content) ">

        <View

          style={styles.button}

          onTouchEnd={() => {

            changeStatusBarStyle();

          }}>

          <Text style={styles.buttonText}>{statusBarStyle}</Text>

        </View>

      </TestCase>

      <TestCase itShould="toggle status bar translucent">

        <View

          style={styles.button}

          onTouchEnd={() => {

            setTranslucent(!translucent);

          }}>

          <Text style={styles.buttonText}>

            {translucent ? 'translucent' : 'non-translucent'}

          </Text>

        </View>

      </TestCase>

      <TestCase itShould="set status bar color to blue (StatusBar.setBackgroundColor)">

        <View

          style={styles.button}

          onTouchEnd={() => {

            StatusBar.setBackgroundColor('#0000FF88');

          }}>

          <Text style={styles.buttonText}>Set blue</Text>

        </View>

      </TestCase>

      <TestCase itShould="set status bar dark style (light-content(default)/dark-content) (StatusBar.setBarStyle) ">

        <View

          style={styles.button}

          onTouchEnd={() => {

            StatusBar.setBarStyle('dark-content');

          }}>

          <Text style={styles.buttonText}>Set dark-content</Text>

        </View>

      </TestCase>

      <TestCase itShould="set status bar translucent (StatusBar.setTranslucent)">

        <View

          style={styles.button}

          onTouchEnd={() => {

            StatusBar.setTranslucent(true);

          }}>

          <Text style={styles.buttonText}>Set translucent</Text>

        </View>

      </TestCase>

      <TestCase

        itShould="return correct status bar height for device"

        fn={({ expect }) => {

          expect(StatusBar.currentHeight).to.be.closeTo(38.8, 0.1);

        }}

      />

    </View>

  );

}



const styles = StyleSheet.create({

  button: {

    width: 160,

    height: 40,

    backgroundColor: 'red',

    paddingHorizontal: 16,

  },

  buttonText: {

    width: '100%',

    height: '100%',

    fontWeight: 'bold',

    color: 'white',

  },

});