package Manager;

import Database.Database;
import Virtual.Comunication;

import Encoding.vl64;

import java.sql.*;

public class Room {

    public Database DB;
    public Comunication TH;

    int maxuseroom = 500;

    public int[][] room = new int[maxuseroom][9];

    public Room(Database db, Comunication TH)
    {
        this.DB = db;
        this.TH = TH;
    }
    int usroom = 0;
    public int adduser(int idroom, int iduser)
    {
        int i; //RIGHE
        int j; //COLONNE //0 = ID ROOM //1 = ID USER //2 = ID USER IN ROOM //3 = X //4 = Y //6 Rotation
        int idusroom = 0;
        for(i=0; i <= usroom; i++)
        {
                if((room[i][0] == idroom) && (room[i][2] > idusroom)){
                   idusroom = room[i][2];
                } 
        }
        idusroom++;
        for(i=0; i <= usroom; i++)
        {
                if(room[i][0] == 0){
                   room[i][0] = idroom;
                   room[i][1] = iduser;
                   room[i][2] = idusroom;
                   usroom++;
                   DB.Update("UPDATE rooms SET users_active = users_active + 1 WHERE id = '"+idroom+"'");
                   break;
                }
        }

        DB.Update("UPDATE utenti SET room_id = '"+room[i][0]+"' WHERE id = '"+room[i][1]+"'");
        DB.Update("INSERT INTO rooms_chronology (room_id, user_id) VALUES ('" + room[i][0] + "', '" + room[i][1] + "')");
        
        return idusroom;
    }

    public int getidusroom(int iduser)
    {
        int i; //RIGHE
        int idus = 0;
        for(i=0; i <= usroom; i++)
        {
                if(room[i][1] == iduser){
                   idus = room[i][2];
                   break;
                }
        }
        return idus;
    }

    public void sendroom(int idroom, String message)
    {
        int i; //RIGHE

        for(i=0; i <= usroom; i++)
        {
                if(room[i][0] == idroom){
                  TH.SendPacketID(room[i][1], message);
                }
        }
    }

    public String generateuser(int idroom,int iduser)
    {
        try
        {
        ResultSet myroomuser = DB.Query("SELECT id,username,mission,figure FROM utenti WHERE id = '" + iduser + "' LIMIT 1");
        myroomuser.next();
        getposizione(myroomuser.getInt("id")); //APRE FUNZIONE TRIPLO RITORNO
        String myuser = "@\\" + "I" + vl64.Encode(myroomuser.getInt("id")) + myroomuser.getString("username") + (char)2 + myroomuser.getString("mission")  + (char)2 + myroomuser.getString("figure") + (char)2 + vl64.Encode(getidusroom(myroomuser.getInt("id"))) + vl64.Encode(getx()) + vl64.Encode(gety()) + "0.0" + (char)2 + "JIm" + (char)2 + "MMM" + (char)2;

        int i; //RIGHE
        int c = 0;
        StringBuffer mapuser = new StringBuffer();

        //ResultSet pets = DB.Query("SELECT * FROM user_pets");
        //while(pets.next()){
        //c++;
        //mapuser.append(vl64.Encode(pets.getInt("id")) + pets.getString("name") + (char)2 + (char)2 + pets.getString("color") + (char)2 + "H" + vl64.Encode(5) + vl64.Encode(10) + "0.0" + (char)2 + "JJI");
        //}

        for(i=0; i <= usroom; i++)
        {
                if(room[i][0] == idroom && room[i][1] != iduser){
                    c++;
                    ResultSet roomuser = DB.Query("SELECT id,username,mission,figure FROM utenti WHERE id = '" + room[i][1] + "' LIMIT 1");
                    roomuser.next();
                    getposizione(room[i][1]); //APRE FUNZIONE TRIPLO RITORNO
                    mapuser.append(vl64.Encode(roomuser.getInt("id")) + roomuser.getString("username") + (char)2 + roomuser.getString("mission") + (char)2 + roomuser.getString("figure") + (char)2 + vl64.Encode(getidusroom(roomuser.getInt("id"))) + vl64.Encode(getx()) + vl64.Encode(gety()) + "0.0" + (char)2 + "JIm" + (char)2 + "MMM" + (char)2);
                    TH.SendPacketID(room[i][1], myuser);
                }
        }
        if(c == 0){
            return vl64.Encode(0);
        }else{
            return vl64.Encode(c) + mapuser.toString();
        }

        }catch (Exception u)
        {
           u.printStackTrace();
           return "";
        }
    }

    public void deleteuseroom(int iduser)
    {
        int i; //RIGHE
        for(i=0; i <= usroom; i++)
        {
                if(room[i][1] == iduser){
                   sendroom(room[i][0], "@]" + room[i][2] + (char)2); //Elimina user dalla room
                   DB.Update("UPDATE rooms SET users_active = users_active - 1 WHERE id = '"+room[i][0]+"'");
                   room[i][0] = 0;
                   room[i][6] = 0;
                   room[i][7] = 0;
                   DB.Update("UPDATE utenti SET room_id = '0' WHERE id = '"+room[i][1]+"'");
                   break;
                }
        }
    }

    public void posizione(int iduser, int x, int y, int rotation)
    {
        int i; //RIGHE
        for(i=0; i <= usroom; i++)
        {
                if(room[i][1] == iduser){
                   room[i][3] = x;
                   room[i][4] = y;
                   room[i][5] = rotation;
                   break;
                }
        }
    }
    
    private int xmap;
    private int ymap;
    private int rotationmap;
    
    public void getposizione(int iduser)
    {
        int i; //RIGHE
        for(i=0; i <= usroom; i++)
        {
                if(room[i][1] == iduser){
                   this.xmap = room[i][3];
                   this.ymap = room[i][4];
                   this.rotationmap = room[i][5];
                   break;
                }
        }
    }
    public int getx(){
        return xmap;
    }
    public int gety(){
        return ymap;
    }
    public int getrotation(){
        return rotationmap;
    }

    public int[][] SendUserActions(int idroom){
        int k = 0;
        for(int a=0; a <= usroom; a++){ if(room[a][0] == idroom){ k++; } }
        int[][] usersact = new int[k][8];
        int j = 0;
        for(int i=0; i <= usroom; i++)
        {
                if(room[i][0] == idroom){
                    usersact[j][0] = room[i][2];
                    usersact[j][1] = room[i][6];
                    usersact[j][2] = room[i][7];
                    usersact[j][3] = room[i][3];
                    usersact[j][4] = room[i][4];
                    usersact[j][5] = room[i][5];
                    usersact[j][6] = room[i][1];
                    usersact[j][7] = room[i][8];
                    j++;
                }
        }
        return usersact;
    }

    public void addUserDance(int iduser, int dance){
        for(int i=0; i <= usroom; i++)
        {
                if(room[i][1] == iduser){
                   room[i][6] = dance;
                   break;
                }
        }
    }

    public void addUserVending(int iduser, int vending){
        for(int i=0; i <= usroom; i++)
        {
                if(room[i][1] == iduser){
                   room[i][8] = vending;
                   break;
                }
        }
    }

    public String getItemRoom(int idroom){
        try{
        StringBuffer furniroom = new StringBuffer();
        int i = 0;

        ResultSet furni = DB.Query("SELECT * FROM room_items WHERE room_id = '" + idroom + "'");
            while(furni.next()){
            if(furni.getString("wall_pos").equals("")){
            furniroom.append(vl64.Encode(furni.getInt("id")) + vl64.Encode(furni.getInt("base_item")) + vl64.Encode(furni.getInt("x")) + vl64.Encode(furni.getInt("y")) + vl64.Encode(furni.getInt("rot")) + furni.getString("z") + ".0" + (char)2 + "H" + furni.getString("extra_data") + (char)2 + "M");
            i++;
            }
            }
       
        return (vl64.Encode(i) + furniroom).toString();

        }catch (Exception u)
        {
           u.printStackTrace();
           return "H";
        }

    }
    public String getWallItemRoom(int idroom){
        try{
        StringBuffer furniroom = new StringBuffer();
        int i = 0;

        ResultSet furni = DB.Query("SELECT * FROM room_items WHERE room_id = '" + idroom + "'");
            while(furni.next()){
                if(furni.getString("wall_pos").length() > 0){
                    furniroom.append(furni.getString("id") + (char)2 + vl64.Encode(furni.getInt("base_item")) + furni.getString("wall_pos") + (char)2 + furni.getInt("extra_data") + (char)2);
                    i++;
                }
            }

        return (vl64.Encode(i) + furniroom).toString();

        }catch (Exception u)
        {
           u.printStackTrace();
           return "H";
        }

    }

    public String LoadVotes(int idroom, int iduser){
       try{
           ResultSet checkvotes = DB.Query("SELECT * FROM room_votes WHERE roomid = '" + idroom + "' AND userid = '"+iduser+"' LIMIT 1");
           if(checkvotes.next()){
                 ResultSet votes = DB.Query("SELECT vote FROM room_votes WHERE roomid = '" + idroom + "'");
                 int voti = 0;
                 while(votes.next()){
                 voti += votes.getInt("vote");
                 }

                 if(voti < 0){
                    voti = 0;
                 }

                return vl64.Encode(voti);
           }else{
               return "M";
           }
           
       }catch (Exception u)
        {
           u.printStackTrace();
           return "M";
        }
    }

    public String getUserItem(int iduser){
        StringBuilder packet = new StringBuilder();
        int j = 0;
        try{
            ResultSet items_count = DB.Query("SELECT COUNT(id) AS count FROM user_items");
            items_count.next();
            int count = items_count.getInt("count");
            String items[][] = new String[count][3];
            ResultSet user_items = DB.Query("SELECT * FROM user_items WHERE user_id = '" + iduser + "'");
            while(user_items.next()){
                items[j][0] = user_items.getString("id");
                items[j][1] = user_items.getString("base_item");
                items[j][2] = user_items.getString("extra_data");
                j++;
            }


            for(int i = 0; i < j; i++){
                    ResultSet item = DB.Query("SELECT * FROM furniture WHERE id = '" + items[i][1] + "'");
                    item.next();

                    packet.append(vl64.Encode(Integer.parseInt(items[i][0])));
                    packet.append(vl64.Encode(0));
                    packet.append(item.getString("type").toUpperCase());
                    packet.append((char)2);
                    packet.append(vl64.Encode(Integer.parseInt(items[i][1])));
                    packet.append(vl64.Encode(item.getInt("sprite_id")));

                    if(item.getString("item_name").contains("a2")){
                        packet.append(vl64.Encode(3));
                    }else if(item.getString("item_name").contains("wallpaper")){
                        packet.append(vl64.Encode(2));
                    }else if(item.getString("item_name").contains("landscape")){
                        packet.append(vl64.Encode(4));
                    }else{
                        packet.append(vl64.Encode(1));
                    }

                    packet.append(items[i][2]);
                    packet.append((char)2);
                    packet.append(vl64.Encode(item.getInt("allow_recycle")));
                    packet.append(vl64.Encode(item.getInt("allow_trade")));
                    packet.append(vl64.Encode(item.getInt("allow_inventory_stack")));
                    packet.append(vl64.Encode(item.getInt("allow_marketplace_sell")));
                    packet.append(vl64.Encode(-1));

                    if((item.getString("type").toLowerCase()).equals("s")){
                        packet.append((char)2);
                        packet.append(vl64.Encode(0));
                    }
            }
        }catch(Exception con){
            con.printStackTrace();
        }
        return vl64.Encode(j) + packet.toString();
    }

    public String getSingularItem(int item_id){
        StringBuilder packet = new StringBuilder();
        int j = 0;
        try{
            ResultSet user_items = DB.Query("SELECT * FROM user_items WHERE id = '" + item_id + "'");
            user_items.next();
            String furni_id = user_items.getString("base_item");
            String extra_data = user_items.getString("extra_data");

            ResultSet item = DB.Query("SELECT * FROM furniture WHERE id = '" + furni_id + "'");
            item.next();

            packet.append(vl64.Encode(item_id));
            packet.append(vl64.Encode(0));
            packet.append(item.getString("type").toUpperCase());
            packet.append((char)2);
            packet.append(vl64.Encode(Integer.parseInt(furni_id)));
            packet.append(vl64.Encode(item.getInt("sprite_id")));

            if(item.getString("item_name").contains("a2")){
                packet.append(vl64.Encode(3));
            }else if(item.getString("item_name").contains("wallpaper")){
                packet.append(vl64.Encode(2));
            }else if(item.getString("item_name").contains("landscape")){
                packet.append(vl64.Encode(4));
            }else{
                packet.append(vl64.Encode(1));
            }

            packet.append(extra_data);
            packet.append((char)2);
            packet.append(vl64.Encode(item.getInt("allow_recycle")));
            packet.append(vl64.Encode(item.getInt("allow_trade")));
            packet.append(vl64.Encode(item.getInt("allow_inventory_stack")));
            packet.append(vl64.Encode(item.getInt("allow_marketplace_sell")));
            packet.append(vl64.Encode(-1));

            if((item.getString("type").toLowerCase()).equals("s")){
                packet.append((char)2);
                packet.append(vl64.Encode(0));
            }
        }catch(Exception con){
            con.printStackTrace();
        }
        return packet.toString();
    }

}
