package fanch.multijeu.sudoku.data;

import java.util.Arrays;

import fanch.multijeu.common.utils.IntUtils;

public class SudokuValue{

    protected static final int ALL=0x1ff;
    protected int mValue=0;

    public SudokuValue(){

    }

    public SudokuValue(int n){
        add(n);
    }



    public boolean has(int x)
    {
        x--;
        return ((1<<x)&mValue)>0;
    }

    public void add(int x)
    {
        x--;
        mValue|=(1<<x);
    }

    public void remove(int x)
    {
        x--;
        mValue&= ~(1<<x);
    }

    public void set(int n)
    {
        mValue=1<<(n-1);
    }

    public void intersect(SudokuValue v)
    {
        mValue&=v.mValue;
    }

    public SudokuValue copy()
    {
        SudokuValue v = new  SudokuValue();
        v.mValue=mValue;
        return v;
    }

    public static SudokuValue filled()
    {
        SudokuValue v = new SudokuValue();
        v.mValue=ALL;
        return v;
    }

    public int hash()
    {
        return mValue;
    }

    public boolean equals(SudokuValue v)
    {
        return (hash()==v.hash());
    }

    public String toString()
    {
        int b[] = values();
        String s = "{";
        for(int i=0; i<b.length; i++)
        {
            s+=b[i];
            if(i<b.length-1)
                s+=",";
        }
        return  s+"}";
    }

    public int[] values()
    {
        int x[] = new int[9];
        int n=0;
        for(int i=0; i<9; i++)
            if(((1<<i)&mValue)>0)
                x[n++]=i+1;
        return Arrays.copyOfRange(x,0, n);
    }

    public int size()
    {
        int x=0;
        for(int i=0; i<9; i++)
            if( ((1<<i)&mValue)>0 )
                x++;

        return x;
    }

    public byte get(int n)
    {
        int i;
        for(i=0; i<9; i++)
            if( (mValue&(1<<i)) > 0 ) {
                if(n==0) return (byte) (i+1);
                n--;
            }
        return 0;
    }

    public byte get()
    {
        return get(0);
    }

    public byte rand()
    {
        final int x = size();
        return get(IntUtils.rand(0, x-1));
    }

}
/*
5    2 79
9  5  31
 7  49 6
618 2 7
4  68 2
 35 7   6
859436 27
1 4  86
763 51984
 */