/*
 * Copyright 2015 Red Hat, Inc. and/or its affiliates.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * 
 *      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.drools.games.pong;

import org.drools.games.GameConfiguration;

public class PongConfiguration extends GameConfiguration {
    private int padding;
    
    private int sideLineWidth;

    private int netWidth;
    private int netDash;
    private int netGap;
    
    private int ballWidth;
    private int ballStartingSpeed;
    
    private int batWidth;
    private int batHeight;
    private int batSpeed;

    public PongConfiguration() {
        setTableWidth( 700 );
        setTableHeight( 500 );
        setSideLineWidth( 10 );
        
        setBallWidth( 20 );
        setBallStartingSpeed( 1 );
        
        setBatWidth( 5 );
        setBatHeight( 80 );
        setBatSpeed( 2 );
        setPadding( 10 );
        setNet( 2, 20, 10 );
    }

    public int getTableWidth() {
        return getWindowWidth();
    }

    public void setTableWidth(int tableWidth) {
        validPongTableDimension(tableWidth );
        setWindowWidth(tableWidth);
    }

    public int getTableHeight() {
        return getWindowHeight();
    }

    public void setTableHeight(int tableHeight) {
        validPongTableDimension(tableHeight );
        setWindowHeight(tableHeight);
    }

    private void validPongTableDimension(int dimension) {
        if ( dimension % 20 != 0 ) {
            throw new IllegalArgumentException( "Table dimensions must be divisiable by 20" );
        }
    }

    public int getSideLineWidth() {
        return sideLineWidth;
    }

    public void setSideLineWidth(int sideLineWidth) {
        this.sideLineWidth = sideLineWidth;
    }    
    
    public int getBallWidth() {
        return ballWidth;
    }

    public void setBallWidth(int ballWidth) {
        this.ballWidth = ballWidth;
    }

    public int getBallStartingSpeed() {
        return ballStartingSpeed;
    }

    public void setBallStartingSpeed(int ballStartingSpeed) {
        this.ballStartingSpeed = ballStartingSpeed;
    }

    public int getBatWidth() {
        return batWidth;
    }

    public void setBatWidth(int batWidth) {
        this.batWidth = batWidth;
    }

    public int getBatHeight() {
        return batHeight;
    }

    public void setBatHeight(int batHeight) {
        this.batHeight = batHeight;
    }
    
    public int getBatSpeed() {
        return batSpeed;
    }

    public void setBatSpeed(int batSpeed) {
        this.batSpeed = batSpeed;
    }    

    public int getPadding() {
        return padding;
    }

    public void setPadding(int padding) {
        this.padding = padding;
    }

    public void setNet(int width,
                       int dash,
                       int gap) {
        if ( width % 2 != 0 ) {
            throw new IllegalArgumentException( "Fence Width must be divisiable by 2" );
        }
        this.netWidth = width;

        this.netDash = dash;
        this.netGap = gap;
    }

    public int getNetWidth() {
        return netWidth;
    }

    public int getNetDash() {
        return netDash;
    }

    public int getNetGap() {
        return netGap;
    }

    public int boundedRight() {
        return getTableWidth() - getPadding();
    }

    public int boundedLeft() {
        return getPadding();
    }

    public int boundedBottom() {
        return getTableHeight() - getPadding() - getSideLineWidth();
    }

    public int boundedTop() {
        return getPadding() + getSideLineWidth() ;
    }

}
