#include  <iostream>
#include <qpainter.h>
#include <string>
#include "Visualisation/CustomTracker/interface/TkSelection.h"

 TkSelection::TkSelection( TkSceneUpdate *par, QWidget *parent, const char *name)
        : QWidget( parent, name )
{
    tkm=par;
    setPalette( QPalette( QColor( 250, 250, 250) ) );
    xmin = -3.0; xmax = 3.0; ymin = -0.1; ymax =1.0;
   
     //pixel_barrel
     y[0]= 0.050; y[1]= 0.090; y[2]= 0.140;
     x[0]= 0.0325;x[1]= 0.0975; x[2]= 0.1625; x[3]= 0.2275;
     w=3; h=2; 

     //silicon_barrel
       //4 layer int
     y[3]= 0.25; y[7]= 0.23;//moduli doppi
     y[4]= 0.28; y[8]= 0.30;//moduli doppi
     y[5]= 0.35; y[9]= 0.33;
     y[6]= 0.38; y[10]= 0.40;
     x[4]= 0.01; x[5]=0.20; x[6]= 0.40;  x[7]= 0.10; x[8]= 0.30; x[9]=0.50;
     h1=2; w1=10;

       //6layer ext
     y[11]= 0.45; y[17]= 0.46;//doppio modulo
     y[12]= 0.52; y[18]= 0.53;//doppio modulo
     y[13]= 0.59; y[19]=0.60;
     y[14]= 0.66; y[20]= 0.67;
     y[15]=0.73; y[21]= 0.74;
     y[16]= 0.80; y[22]=0.81;
     w22=0.186134;
     x[10]=0.001; x[11]=2*w22; x[12]=4*w22;
     x[13]=w22; x[14]=3*w22; x[15]=5*w22;
     h2=2; w2=15;

     //silicon forward
     y[23]= 0.28;
     x[16]= 0.75; x[17]= 0.88; x[18]= 1.03; x[19]= 1.29; x[20]= 1.44; x[21]= 1.59;
     y[24]=0.34;
     x[22]= 0.78; x[23]= 0.91; x[24]= 1.06; x[25]= 1.32; x[26]= 1.47; x[27]= 1.63;
     x[28]= 1.78; x[29]= 1.93; x[30]= 2.10;
     y[25]=0.39;
     x[31]= 0.75; x[32]= 0.88; x[33]= 1.03; x[34]= 1.29; x[35]= 1.44; x[36]= 1.59;
     x[37]= 1.74; x[38]= 1.89; x[39]= 2.07;x[40]= 2.27; x[41]= 2.54;
     y[26]= 0.45;y[27]= 0.68;
     x[42]= 1.32; x[43]= 1.47; x[44]= 1.63; x[45]= 1.78; x[46]= 1.93; x[47]= 2.10;
     x[48]= 2.30;x[49]= 2.57;x[50]= 2.83;
     y[28]= 0.55; y[29]= 0.82;
     x[51]= 1.29; x[52]= 1.44; x[53]= 1.59; x[54]= 1.74; x[55]= 1.89; x[56]= 2.07;
     x[57]= 2.27; x[58]= 2.54;x[59]= 2.80;
     w3= 2; h3= 13; h6= 22; h7= 27;

     //pixel forward
     x[61]= 0.47;
     x[60]= 0.34;
y[30]=0.040; y[31]=0.060;y[32]=0.082;y[33]= 0.106;y[34]=0.128;y[35]=0.150; y[36]=0.170;
    // y[30]= 0.135; y[31]= 0.126; y[32]= 0.111; y[33]= 0.098;
    // y[34]= 0.083; y[35]=0.070; y[36]=0.059;
     wpf=2; hpf= 3;
      
     nelem=0; nlay=0;
     
connect( this, SIGNAL(myclicked(bool,int,int)), tkm,SLOT(updateRing(bool,int,int)) );
connect( this, SIGNAL(layer_clicked(bool,int)), tkm,SLOT(updateLayer(bool,int)) );
}

void  TkSelection::crea(){

 //pixel barrel
    for(int j=0;j<3;j++){       
      for(int i=0;i<4;i++){
        r[nelem]= QRect(xpixel(x[i]),ypixel(y[j]),w,h);
        layer[nelem]= 29+j;
	anello[nelem]= 5+i;
	cliccato[nelem]=false;
        nelem++;
	 r[nelem]= QRect(xpixel(-x[i]),ypixel(y[j]),w,h);
        layer[nelem]= 29+j;
	anello[nelem]= 4-i;
	cliccato[nelem]=false;
        nelem++;  
       }
       layer[nelem]= 29+j;
       qlay[nelem]= QRect(5, ypixel(y[j]), 5,5);
       layer_disk[nelem]= QRect(width()-10, ypixel(y[j]), 5,5);
       nelem++;
    }
    //silicon barrel int
    for(int j=3;j<7;j++){
       for(int i=4;i<7;i++){      
          r[nelem]= QRect(xpixel(x[i]),ypixel(y[j]),w1, h1);
         layer[nelem]= 29+j;
	 anello[nelem]= 2*i-1;	 
	 cliccato[nelem]=false;
	 //sim[nelem]=nelem+2;
         nelem++;
	  r[nelem]= QRect((xpixel(-x[i])-w1),ypixel(y[j]),w1, h1);
         layer[nelem]= 29+j;
	 anello[nelem]= 14-2*i;
	 cliccato[nelem]=false;
	 //sim[nelem]=nelem+2;
         nelem++;
	      
       }
       layer[nelem]= 29+j;
       qlay[nelem]= QRect(5, ypixel(y[j])-3, 5,5);
       layer_disk[nelem]= QRect(width()-10, ypixel(y[j])-3, 5,5);
       nelem++;
    }
    for(int j=7;j<11;j++){
       for(int i=7;i<10;i++){
          r[nelem]= QRect(xpixel(x[i]),ypixel(y[j]),w1, h1);
         layer[nelem]= 25+j;
	 anello[nelem]= 2*i-6;	 
	 cliccato[nelem]=false;
	 //sim[nelem]=nelem+2;
         nelem++;
	  r[nelem]= QRect((xpixel(-x[i])-w1),ypixel(y[j]),w1, h1);
         layer[nelem]= 25+j;
	 anello[nelem]= 19-2*i;		 
	 cliccato[nelem]=false;
	 //sim[nelem]=nelem+2;
         nelem++;
	 
      }
    }
    //silicon barrel ext
    for(int j=11;j<17;j++){
      for(int i=13;i<16;i++){
          r[nelem]= QRect(xpixel(x[i]),ypixel(y[j]),w2, h2);
         layer[nelem]= 25+j;
	 anello[nelem]= 2*i-18;	 
	 cliccato[nelem]=false;
	 //sim[nelem]=nelem+2;	 
         nelem++;
	  r[nelem]= QRect((xpixel(-x[i])-w2),ypixel(y[j]),w2, h2);
         layer[nelem]= 25+j;
	 anello[nelem]= 31-2*i;	 
	 cliccato[nelem]=false;
	 //sim[nelem]=nelem+2;
         nelem++;
	 
      } 
       layer[nelem]= 25+j;
      qlay[nelem]= QRect(5, ypixel(y[j])-3, 5,5);
      layer_disk[nelem]= QRect(width()-10, ypixel(y[j])-3, 5,5);
      nelem++;
    }
    for(int j=17;j<23;j++){
     for(int i=10;i<13;i++){
          r[nelem]= QRect(xpixel(x[i]),ypixel(y[j]),w2, h2);
         layer[nelem]= 19+j;
	 anello[nelem]= 2*i-13;	 
	 cliccato[nelem]=false;
	 //sim[nelem]=nelem+2;
         nelem++;
	  r[nelem]= QRect((xpixel(-x[i])-w2),ypixel(y[j]),w2, h2);
         layer[nelem]= 19+j;
	 anello[nelem]= 26-2*i;	 
	 cliccato[nelem]=false;
	 //sim[nelem]=nelem+2;
         nelem++;
	 
     }
     
    }
    //silicon forward
    for(int i=16;i<22;i++){
       r[nelem]= QRect(xpixel(x[i]),ypixel(y[23]),w3, h3);
      layer[nelem]= i+1;
      anello[nelem]= 1;	 
      cliccato[nelem]=false;
      //sim[nelem]=nelem+2;
      nelem++;
       r[nelem]= QRect(xpixel(-x[i]),ypixel(y[23]),w3, h3);
      layer[nelem]= 28-i;
      anello[nelem]= 1;	 
      cliccato[nelem]=false;
      //sim[nelem]=nelem+2;
      nelem++;
     
      }
    for(int i=22;i<31;i++){
        r[nelem]= QRect(xpixel(x[i]),ypixel(y[24]),w3, h3);
      layer[nelem]= i-5;
      anello[nelem]= 2;	 
      cliccato[nelem]=false;
      //sim[nelem]=nelem+2;
      nelem++;
       r[nelem]= QRect(xpixel(-x[i]),ypixel(y[24]),w3, h3);
      layer[nelem]= 34-i;
      anello[nelem]= 2;	 
      cliccato[nelem]=false;
      //sim[nelem]=nelem+2;
      nelem++;
    
    }
    for(int i=31;i<42;i++){
       r[nelem]= QRect(xpixel(x[i]),ypixel(y[25]),w3, h3);
      layer[nelem]= i-14;
      anello[nelem]= 3;	 
      cliccato[nelem]=false;
      //sim[nelem]=nelem+2;
      qlay[nelem]= QRect(xpixel(x[i]), 5, 5,5);
      layer_disk[nelem]= QRect(xpixel(x[i]), height()-10, 5,5);
      nelem++;
       r[nelem]= QRect(xpixel(-x[i]),ypixel(y[25]),w3, h3);
      layer[nelem]= 43-i;
      anello[nelem]= 3;	 
      cliccato[nelem]=false;
      //sim[nelem]=nelem+2;
      qlay[nelem]= QRect(xpixel(-x[i]), 5, 5,5);
      layer_disk[nelem]= QRect(xpixel(-x[i]), height()-10, 5,5);
      nelem++;
     
    } 
    layer[nelem]= 28;
    qlay[nelem]= QRect(xpixel(x[50]), 5, 5,5);
    layer_disk[nelem]= QRect(xpixel(x[50]), height()-10, 5,5);
    nelem++;
    layer[nelem]= 1;
    qlay[nelem]= QRect(xpixel(-x[50]), 5, 5,5);
    layer_disk[nelem]= QRect(xpixel(-x[50]), height()-10, 5,5);
    nelem++;
    for(int j=26;j<28;j++){
     for(int i=42;i<51;i++){
        int wg=w3;
        int hg=h3;
        if(j==27)hg=h7;
	 r[nelem]= QRect(xpixel(x[i]),ypixel(y[j]),wg, hg);
        layer[nelem]= i-22;
        anello[nelem]= 2*j-48;	 
        cliccato[nelem]=false;
	//sim[nelem]=nelem+2;
        nelem++;
	 r[nelem]= QRect(xpixel(-x[i]),ypixel(y[j]),wg, hg);
        layer[nelem]= 51-i;
        anello[nelem]= 2*j-48;	 
        cliccato[nelem]=false;
	//sim[nelem]=nelem+2;
        nelem++;
	
     }
    }
    for(int j=28;j<30;j++){
     for(int i=51;i<60;i++){
        int wg=w3;
        int hg=h6;
        if(j==29)hg=h7;
	    r[nelem]= QRect(xpixel(x[i]),ypixel(y[j]),wg, hg);
           layer[nelem]= i-31;
           anello[nelem]= 2*j-51;	 
           cliccato[nelem]=false;
	   //sim[nelem]=nelem+2;
           nelem++;
	    r[nelem]= QRect(xpixel(-x[i]),ypixel(y[j]),wg, hg);
           layer[nelem]= 60-i;
           anello[nelem]= 2*j-51;	 
           cliccato[nelem]=false;
	   //sim[nelem]=nelem+2;
           nelem++;
	   
     }
    }
    //pixel forward
    for(int i=60; i<62; i++){
        for(int j=30;j<37;j++){
            r[nelem]= QRect(xpixel(x[i]),ypixel(y[j]),wpf, hpf);
           layer[nelem]= i-45;
           anello[nelem]= j-29;	 
           cliccato[nelem]=false;
	   //sim[nelem]=nelem+2;
           nelem++;
	    r[nelem]= QRect(xpixel(-x[i]),ypixel(y[j]),wpf, hpf);
           layer[nelem]= 74-i;
           anello[nelem]= j-29;	 
           cliccato[nelem]=false;
	   //sim[nelem]=nelem+2;
           nelem++;	   
        }
        layer[nelem]= i-45;
        qlay[nelem]= QRect(xpixel(x[i]), 5, 5,5);
	layer_disk[nelem]= QRect(xpixel(x[i]), height()-10, 5,5);
        nelem++;
        layer[nelem]= 74-i;
        qlay[nelem]= QRect(xpixel(-x[i]), 5, 5,5);
	layer_disk[nelem]= QRect(xpixel(-x[i]), height()-10, 5,5);
        nelem++;
    }
}    

void  TkSelection::mousePressEvent( QMouseEvent *e )
{
   pt = e->pos();
   for(int ri=0; ri<nelem; ri++){
      if(r[ri].contains(e->pos())){
      //cout <<layer[ri]<<" "<< anello[ri]<< endl;
         for(int k=0;k<200;k++){
	     if(!cliccato[ri])TkSelectionSet::matrix[layer[ri]-1][anello[ri]-1][k]=true;
	     else TkSelectionSet::matrix[layer[ri]-1][anello[ri]-1][k]= false;
         }
	 if(cliccato[ri]){
	    cliccato[ri]=false;
	    emit myclicked(false,layer[ri],anello[ri]);
	 }   
	 else{ 
	   cliccato[ri]=true;
	   //cliccato[sim[ri]]=true;
	   emit myclicked(true,layer[ri],anello[ri]);
         }
	 repaint();
	 break;
      }
      if(qlay[ri].contains(e->pos())){
         nlay = layer[ri];
         ly = new TkLayerSelectionWindow(tkm,0,"layer",nlay);
         ly->show();
	 
        // cout<<nlay<<endl;
      }
      if(layer_disk[ri].contains(e->pos())){
      	 
	 if(cliccato[ri]){
	  for(int i=0; i<nelem; i++){
	   if(layer[ri]==layer[i])cliccato[i]=false; 
          }
	    cliccato[ri]=false;       
	    emit layer_clicked(false,layer[ri]);  
	 }   
	 else{
	  for(int i=0; i<nelem; i++){
	   if(layer[ri]==layer[i])cliccato[i]=true; 
          } 
	   cliccato[ri]=true;
	   emit layer_clicked(true,layer[ri]); 
         }
	 repaint();
	 break;
     
      }
   }
}

void  TkSelection::paintEvent( QPaintEvent * )
{
    QPainter p( this );
  
  for(int ri=0; ri<nelem; ri++){
       if(cliccato[ri]){
         p.setBrush(red);
	 p.setPen(red);
       }else{
            if(anello[ri]<3 & layer[ri]>16 & layer[ri]<28 ||  anello[ri]==5 & layer[ri]<29 || anello[ri]==5 & layer[ri]<10 || anello[ri]<3 & layer[ri]<13 || layer[ri]==32 || layer[ri]==33 || layer[ri]==36 || layer[ri]==37){
               p.setBrush(blue);
               p.setPen(blue);
            }
	    else{
                 p.setBrush(black);
	         p.setPen(black);
	    }
       }
       p.drawRect(r[ri]); 
     //draw green rect  
       p.setBrush(green);
       p.setPen(black);
       p.drawRect(qlay[ri]);
     //draw yellow rect
       if(cliccato[ri]){
       cout <<layer[ri]<<" "<<anello[ri]<<endl;
             p.setBrush(red);
	     p.setPen(red);
       }else{
            p.setBrush(yellow);
            p.setPen(black);
       }
       p.drawRect(layer_disk[ri]);
   } 
}


QSizePolicy  TkSelection::sizePolicy() const
{
    return QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );
}

