/*
 * Copyright (c) 2015 Justin White <jw@justinwhite.net>
 *  All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  1. Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *
 *  2. Redistributions in binary form must reproduce the above copyright notice,
 *   this list of conditions and the following disclaimer in the documentation
 *   and/or other materials provided with the distribution.
 *
 *  3. Neither the name of the copyright holder nor the names of its
 *  contributors may be used to endorse or promote products derived from this
 *  software without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 *  POSSIBILITY OF SUCH DAMAGE.
 */

package net.justinwhite.score_model.phase_10;

import net.justinwhite.score_model.Player;
import net.justinwhite.score_model.phase_10.Phase10Game.PhaseSet;

public class Phase10Player extends Player {
    public enum Phase {
        INACTIVE, ACTIVE, COMPLETED
    }

    private final Phase[] phases;
    private Integer currentPhase;

    public Phase10Player() {
        this("Player X");
    }

    public Phase10Player(String _name) {
        this(_name, PhaseSet.ALL);
    }

    public Phase10Player(String _name, PhaseSet phasePreset) {
        this(_name, Phase10Game.getPhasePreset(phasePreset));
    }

    public Phase10Player(String _name, Boolean[] _phases) {
        super(_name);
        phases = new Phase[Phase10Game.MAX_PHASE + 1];
        setPhases(_phases);
        currentPhase = 0;
    }

    @Override
    public String toString() {
        return String.format(
                "%s; Phase %d",
                super.toString(),
                currentPhaseNumber()
        );
    }

    public Integer currentPhaseNumber() {
        return currentPhase;
    }

    public Phase[] getPhases() {
        return phases;
    }

    public void completeCurrentPhase() {
        if (phases[currentPhase] == Phase.ACTIVE) {
            phases[currentPhase] = Phase.COMPLETED;
        }
        do {
            currentPhase++;
            if (currentPhase > Phase10Game.MAX_PHASE) {
                currentPhase = Phase10Game.MAX_PHASE;
                break;
            }
        } while (phases[currentPhase] != Phase.ACTIVE);
    }

    public void addScore(Integer _score) {
        setScore(getScore() + _score);
    }

    public void setPhases(Boolean[] _phases) {
        for (Integer i = 0; i <= Phase10Game.MAX_PHASE; i++) {
            if (_phases[i]) {
                phases[i] = Phase.ACTIVE;
            } else {
                phases[i] = Phase.INACTIVE;
            }
        }
    }
}

@@ -2607,32 +2607,310 @@
       );%0A    %7D%0A%0A
+    public void setPhases(Boolean%5B%5D _phases) %7B%0A        for (Integer i = 0; i %3C= Phase10Game.MAX_PHASE; i++) %7B%0A            if (_phases%5Bi%5D) %7B%0A                phases%5Bi%5D = Phase.ACTIVE;%0A            %7D else %7B%0A                phases%5Bi%5D = Phase.INACTIVE;%0A            %7D%0A        %7D%0A    %7D%0A%0A
     public Integ
@@ -3531,285 +3531,7 @@
    %7D
-%0A%0A    public void setPhases(Boolean%5B%5D _phases) %7B%0A        for (Integer i = 0; i %3C= Phase10Game.MAX_PHASE; i++) %7B%0A            if (_phases%5Bi%5D) %7B%0A                phases%5Bi%5D = Phase.ACTIVE;%0A            %7D else %7B%0A                phases%5Bi%5D = Phase.INACTIVE;%0A            %7D%0A        %7D%0A    %7D
 %0A%7D%0A

Rearrange methods