/*
 * Copyright 2008 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.
 */

/*namespace com.google.zxing.qrcode.encoder {*/

import ErrorCorrectionLevel from './../decoder/ErrorCorrectionLevel';
import Mode from './../decoder/Mode';
import Version from './../decoder/Version';
import StringBuilder from './../../util/StringBuilder';
import ByteMatrix from './ByteMatrix';

/**
 * @author satorux@google.com (Satoru Takabayashi) - creator
 * @author dswitkin@google.com (Daniel Switkin) - ported from C++
 */
export default class QRCode {

    public static NUM_MASK_PATTERNS = 8;

    private mode: Mode;
    private ecLevel: ErrorCorrectionLevel;
    private version: Version;
    private maskPattern: number; /*int*/
    private matrix: ByteMatrix;

    public constructor() {
        this.maskPattern = -1;
    }

    public getMode(): Mode {
        return this.mode;
    }

    public getECLevel(): ErrorCorrectionLevel {
        return this.ecLevel;
    }

    public getVersion(): Version {
        return this.version;
    }

    public getMaskPattern(): number /*int*/ {
        return this.maskPattern;
    }

    public getMatrix(): ByteMatrix {
        return this.matrix;
    }

    /*@Override*/
    public toString(): string {
        const result = new StringBuilder(); // (200)
        result.append('<<\n');
        result.append(' mode: ');
        result.append(this.mode ? this.mode.toString() : 'null');
        result.append('\n ecLevel: ');
        result.append(this.ecLevel ? this.ecLevel.toString() : 'null');
        result.append('\n version: ');
        result.append(this.version ? this.version.toString() : 'null');
        result.append('\n maskPattern: ');
        result.append(this.maskPattern.toString());
        if (this.matrix) {
            result.append('\n matrix:\n');
            result.append(this.matrix.toString());
        } else {
            result.append('\n matrix: null\n');
        }
        result.append('>>\n');
        return result.toString();
    }

    public setMode(value: Mode): void {
        this.mode = value;
    }

    public setECLevel(value: ErrorCorrectionLevel): void {
        this.ecLevel = value;
    }

    public setVersion(version: Version): void {
        this.version = version;
    }

    public setMaskPattern(value: number /*int*/): void {
        this.maskPattern = value;
    }

    public setMatrix(value: ByteMatrix): void {
        this.matrix = value;
    }

    // Check if "mask_pattern" is valid.
    public static isValidMaskPattern(maskPattern: number /*int*/): boolean {
        return maskPattern >= 0 && maskPattern < QRCode.NUM_MASK_PATTERNS;
    }

}
