/*
 * Copyright 2016-present Open Networking Laboratory
 *
 * 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.
 */

package org.onosproject.drivers.fujitsu;

import org.apache.commons.io.IOUtils;
import org.onlab.packet.IpAddress;
import org.onosproject.net.Annotations;
import org.onosproject.net.DefaultAnnotations;
import org.onosproject.net.behaviour.ControllerInfo;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import java.nio.charset.StandardCharsets;
import java.io.InputStream;

import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.onosproject.drivers.fujitsu.FujitsuVoltXmlUtilityMock.*;


/**
 * Unit tests for methods of FujitsuVoltControllerConfig.
 */
public class FujitsuVoltControllerConfigTest {

    private final FujitsuNetconfSessionListenerTest listener = new InternalSessionListenerTest();

    private static final String TEST_VOLT_OFCONFIG = "volt-ofconfig";
    private static final String TEST_OFCONFIG_ID = "ofconfig-id";
    private static final String TEST_END_LICENSE_HEADER = "-->";

    private static final String[] GET_CONTROLLERS = {
            "tcp:172.10.10.45:6633",
            "tcp:100.0.0.22:5555",
    };
    private static final String[] SET_CONTROLLERS = {
            "tcp:172.10.10.55:2222",
            "tcp:172.20.33.11:6633",
    };
    private static final String GET_CONTROLLERS_RSP_FILE = "/getcontrollers.xml";
    private static final String SET_CONTROLLERS_REQ_FILE = "/setcontrollers.xml";

    private Integer currentKey;
    private FujitsuNetconfControllerMock controller;
    private FujitsuDriverHandlerAdapter driverHandler;
    private FujitsuVoltControllerConfig voltConfig;

    @Before
    public void setUp() throws Exception {
        controller = new FujitsuNetconfControllerMock();
        driverHandler = controller.setUp(listener);
        voltConfig = new FujitsuVoltControllerConfig();
        voltConfig.setHandler(driverHandler);
    }

    /**
     * Run to verify handling of valid get operation.
     */
    @Test
    public void testGetControllers() throws Exception {
        List<ControllerInfo> controllers;
        List<ControllerInfo> expectedControllers = new ArrayList<>();

        for (int i = ZERO; i < GET_CONTROLLERS.length; i++) {
            String target = GET_CONTROLLERS[i];
            String[] data = target.split(TEST_COLON);
            currentKey = i + ONE;

            Annotations annotations = DefaultAnnotations
                                          .builder()
                                          .set(TEST_OFCONFIG_ID, currentKey.toString())
                                          .build();
            ControllerInfo controller = new ControllerInfo(
                    IpAddress.valueOf(data[SECOND_PART]),
                    Integer.parseInt(data[THIRD_PART]),
                        data[FIRST_PART], annotations);
            expectedControllers.add(controller);
        }

        controllers = voltConfig.getControllers();
        assertTrue("Incorrect response", controllers.equals(expectedControllers));
    }

    /**
     * Run to verify handling of valid set operation.
     */
    @Test
    public void testSetControllers() throws Exception {
        List<ControllerInfo> controllers = new ArrayList<>();

        for (int i = ZERO; i < SET_CONTROLLERS.length; i++) {
            String target = SET_CONTROLLERS[i];
            String[] data = target.split(TEST_COLON);
            currentKey = i + ONE;

            Annotations annotations = DefaultAnnotations
                                          .builder()
                                          .set(TEST_OFCONFIG_ID, currentKey.toString())
                                          .build();
            ControllerInfo controller = new ControllerInfo(
                    IpAddress.valueOf(data[SECOND_PART]),
                    Integer.parseInt(data[THIRD_PART]),
                        data[FIRST_PART], annotations);
            controllers.add(controller);
        }

        voltConfig.setControllers(controllers);
    }

    /**
     * Verifies XML request string by comparing with generated string.
     *
     * @param request XML string for set operation
     * @return true if XML string matches with generated
     */
    private boolean verifyGetRequest(String request) {
        StringBuilder rpc = new StringBuilder();
        rpc.append(TEST_VOLT_NE_OPEN + TEST_VOLT_NE_NAMESPACE);
        rpc.append(TEST_ANGLE_RIGHT + TEST_NEW_LINE);
        rpc.append(emptyTag(TEST_VOLT_OFCONFIG))
            .append(TEST_VOLT_NE_CLOSE);

        String testRequest = rpc.toString();
        boolean result = request.equals(testRequest);
        assertTrue("Does not match with generated string", result);
        return result;
    }

    /**
     * Verifies XML request string by comparing with generated string.
     *
     * @param request XML string for set operation
     * @return true if XML string matches with generated
     */
    private boolean verifyEditConfigRequest(String request) {
        String testRequest;

        try {
            InputStream fileStream = getClass().getResourceAsStream(
                        SET_CONTROLLERS_REQ_FILE);
            testRequest = IOUtils.toString(fileStream, StandardCharsets.UTF_8);
            testRequest = testRequest.substring(testRequest.indexOf(
                    TEST_END_LICENSE_HEADER) + TEST_END_LICENSE_HEADER.length());
        } catch (IOException e) {
            fail("IOException while reading: " + SET_CONTROLLERS_REQ_FILE);
            return false;
        }

        testRequest = testRequest.replaceAll(TEST_WHITESPACES_REGEX, TEST_EMPTY_STRING);
        request = request.replaceAll(TEST_WHITESPACES_REGEX, TEST_EMPTY_STRING);
        boolean result = request.equals(testRequest);
        assertTrue("Does not match with string in " + SET_CONTROLLERS_REQ_FILE, result);

        return result;
    }

    /**
     * Internal listener for device service events.
     */
    private class InternalSessionListenerTest implements FujitsuNetconfSessionListenerTest {
        @Override
        public boolean verifyEditConfig(String request) {
            boolean result;

            request = request.replaceAll(TEST_DUPLICATE_SPACES_REGEX, TEST_SPACE);
            assertTrue("Does not contain:" + TEST_VOLT_NAMESPACE,
                    request.contains(TEST_VOLT_NAMESPACE));

            result = verifyEditConfigRequest(request);
            assertTrue("XML verification failure", result);
            return result;
        }

        @Override
        public boolean verifyEditConfig(String target, String mode, String request) {
            return false;
        }

        @Override
        public boolean verifyGet(String filterSchema, String withDefaultsMode) {
            boolean result;

            assertTrue("Incorrect withDefaultsMode",
                    withDefaultsMode.equals(TEST_REPORT_ALL));
            filterSchema = filterSchema.replaceAll(TEST_DUPLICATE_SPACES_REGEX, TEST_SPACE);
            assertTrue("Does not contain:" + TEST_VOLT_NAMESPACE,
                    filterSchema.contains(TEST_VOLT_NAMESPACE));

            result = verifyGetRequest(filterSchema);
            assertTrue("XML verification failure", result);
            return result;
        }

        @Override
        public String buildGetReply() {
            try {
                InputStream fileStream = getClass().getResourceAsStream(
                        GET_CONTROLLERS_RSP_FILE);
                String reply = IOUtils.toString(fileStream, StandardCharsets.UTF_8);
                return (reply);
            } catch (IOException e) {
                return null;
            }
        }

        @Override
        public boolean verifyWrappedRpc(String request) {
            return false;
        }

        @Override
        public void verifyStartSubscription(String filterSchema) {
        }
    }

}
