/*
 * Copyright (C) 2010 ZXing authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * These authors would like to acknowledge the Spanish Ministry of Industry,
 * Tourism and Trade, for the support in the project TSI020301-2008-2
 * "PIRAmIDE: Personalizable Interactions with Resources on AmI-enabled
 * Mobile Dynamic Environments", led by Treelogic
 * ( http://www.treelogic.com/ ):
 *
 *   http://www.piramidepse.com/
 */

use crate::common::{BitArray, Result};

use super::{AbstractExpandedDecoder, GeneralAppIdDecoder};

/**
 * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es)
 * @author Eduardo Castillejo, University of Deusto (eduardo.castillejo@deusto.es)
 */
pub struct AnyAIDecoder<'a> {
    // information: &'a BitArray,
    general_decoder: GeneralAppIdDecoder<'a>,
}
impl AbstractExpandedDecoder for AnyAIDecoder<'_> {
    fn parseInformation(&mut self) -> Result<String> {
        let buf = String::new();
        self.general_decoder.decodeAllCodes(buf, Self::HEADER_SIZE)
    }

    fn getGeneralDecoder(&self) -> &super::GeneralAppIdDecoder<'_> {
        &self.general_decoder
    }
}

impl<'a> AnyAIDecoder<'_> {
    const HEADER_SIZE: usize = 2 + 1 + 2;

    pub fn new(information: &'a BitArray) -> AnyAIDecoder<'a> {
        AnyAIDecoder {
            // information,
            general_decoder: GeneralAppIdDecoder::new(information),
        }
    }
}

/**
 * @author Pablo Orduña, University of Deusto (pablo.orduna@deusto.es)
 */
#[cfg(test)]
mod AnyAIDecoderTest {
    use crate::oned::rss::expanded::decoders::abstract_decoder_test_utils::*;

    const HEADER: &str = ".....";

    #[test]
    fn testAnyAIDecoder1() {
        let data = format!(
            "{HEADER}{NUMERIC10}{NUMERIC12}{NUMERIC2ALPHA}{ALPHA_A}{ALPHA2NUMERIC}{NUMERIC12}"
        );
        let expected = "(10)12A12";

        assertCorrectBinaryString(&data, expected);
    }

    #[test]
    fn testAnyAIDecoder2() {
        let data = format!(
            "{HEADER}{NUMERIC10}{NUMERIC12}{NUMERIC2ALPHA}{ALPHA_A}{ALPHA2ISOIEC646}{I646_B}"
        );
        let expected = "(10)12AB";

        assertCorrectBinaryString(&data, expected);
    }

    #[test]
    fn testAnyAIDecoder3() {
        let data = format!(
            "{HEADER}{NUMERIC10}{NUMERIC2ALPHA}{ALPHA2ISOIEC646}{I646_B}{I646_C}{ISOIEC6462ALPHA}{ALPHA_A}{ALPHA2NUMERIC}{NUMERIC10}"
        );
        let expected = "(10)BCA10";

        assertCorrectBinaryString(&data, expected);
    }

    #[test]
    fn testAnyAIDecodernumericFNC1secondDigit() {
        let data = format!("{HEADER}{NUMERIC10}{NUMERIC1_FNC1}");
        let expected = "(10)1";

        assertCorrectBinaryString(&data, expected);
    }

    #[test]
    fn testAnyAIDecoderalphaFNC1() {
        let data = format!("{HEADER}{NUMERIC10}{NUMERIC2ALPHA}{ALPHA_A}{ALPHA_FNC1}");
        let expected = "(10)A";

        assertCorrectBinaryString(&data, expected);
    }

    #[test]
    fn testAnyAIDecoder646FNC1() {
        let data = format!(
            "{HEADER}{NUMERIC10}{NUMERIC2ALPHA}{ALPHA_A}{ISOIEC6462ALPHA}{I646_B}{I646_FNC1}"
        );
        let expected = "(10)AB";

        assertCorrectBinaryString(&data, expected);
    }
}
