/*
         *  POST http://localhost:4338/api/SpreadSheet/payment/update
         *
         *  request:
         *  {
         *      "rowId": "1234",
         *      "invoice": "1234A",
         *      "status": "SUCCESS",
         *      "amount": 200
         *  }
         */
        public int UpdatePaymentData([FromBody] PaymentDataRequest request)
        {
            var service = SpreadSheetServiceFactory.Produce();

            var rowNumbers = SpreadSheetServiceHelper.FindRowNumbers(service, request.RowId);

            var values = new List <object> {
                request.Status, request.Invoice, request.Amount
            };

            var result = 0;

            foreach (var rowNumber in rowNumbers)
            {
                var apiUpdateRequest = service.Spreadsheets.Values.Update(new ValueRange
                {
                    MajorDimension = "ROWS", // COLUMNS/ ROWS
                    Values         = new List <IList <object> > {
                        values
                    }
                }, AppConfig.SpreadSheetId, string.Format("Sheet1!I{0}", rowNumber)); // I2 = starting point

                apiUpdateRequest.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.RAW;
                var apiUpdateResponse = apiUpdateRequest.Execute();
                result += apiUpdateResponse.UpdatedColumns.HasValue? apiUpdateResponse.UpdatedColumns.Value : 0;
            }

            return(result);
        }
        /*
         *  GET http://localhost:4338/api/SpreadSheet/34567/tickets
         *
         *  response:
         *  {
         *          "rowId": 31519,
         *          "ticketA": {
         *                  "count": 1,
         *                  "participants": [
         *                          {
         *                                  "rowId": 31519,
         *                                  "pId": 43239,
         *                                  "name": "-",
         *                                  "email": "-",
         *                                  "phone": "-",
         *                                  "jobTitle": "-",
         *                                  "company": "-",
         *                                  "ticket": "TicketA"
         *                          }
         *                  ]
         *          },
         *          "ticketB": {
         *                  "count": 2,
         *                  "participants": [
         *                          {
         *                                  "rowId": 31519,
         *                                  "pId": 24978,
         *                                  "name": "-",
         *                                  "email": "-",
         *                                  "phone": "-",
         *                                  "jobTitle": "-",
         *                                  "company": "-",
         *                                  "ticket": "TicketB"
         *                          }
         *                  ]
         *          },
         *          "ticketC": {
         *                  "count": 2,
         *                  "participants": [
         *                          {
         *                                  "rowId": 31519,
         *                                  "pId": 78304,
         *                                  "name": "-",
         *                                  "email": "-",
         *                                  "phone": "-",
         *                                  "jobTitle": "-",
         *                                  "company": "-",
         *                                  "ticket": "TicketC"
         *                          }
         *                  ]
         *          }
         *  }
         */
        public TicketsDataResponse GetTicketsData(int rowId)
        {
            var service = SpreadSheetServiceFactory.Produce();

            var rowsData = SpreadSheetServiceHelper.FindRows(service, rowId);

            if (rowsData == null)
            {
                return(null);
            }

            var response = new TicketsDataResponse {
                RowId   = rowId,
                TicketA = new TicketData(),
                TicketB = new TicketData(),
                TicketC = new TicketData()
            };

            foreach (var rowData in rowsData)
            {
                var participant = new ParticipantDataRequest
                {
                    RowId      = rowId,
                    pId        = Convert.ToInt32(rowData[11]),
                    Name       = rowData[12].ToString(),
                    Phone      = rowData[13].ToString(),
                    Email      = rowData[14].ToString(),
                    JobTitle   = rowData[15].ToString(),
                    Company    = rowData[16].ToString(),
                    TicketName = rowData[17].ToString()
                };

                switch (participant.TicketName.ToLower())
                {
                case "ticketa":
                    response.TicketA.Participants.Add(participant);
                    break;

                case "ticketb":
                    response.TicketB.Participants.Add(participant);
                    break;

                case "ticketc":
                    response.TicketC.Participants.Add(participant);
                    break;
                }
            }

            return(response);
        }
        /*
         *  POST http://localhost:4338/api/SpreadSheet/participant/update
         *
         *  request:
         *  {
         *      "rowId": 1234,
         *      "pId": 3344,
         *      "name": "Avi",
         *      "email" : "*****@*****.**",
         *      "phone":"054-5555555",
         *      "jobTitle": "Developer",
         *      "company": "Celcom",
         *      "ticket": "TicketA"
         *  }
         */
        public int UpdateParticipantData([FromBody] ParticipantDataRequest request)
        {
            var service = SpreadSheetServiceFactory.Produce();

            var rowNumber = SpreadSheetServiceHelper.FindParticipantRowNumber(service, request.RowId, request.pId);

            var values = new List <object> {
                request.Name, request.Phone, request.Email, request.JobTitle, request.Company
            };

            var apiUpdateRequest = service.Spreadsheets.Values.Update(new ValueRange
            {
                MajorDimension = "ROWS", // COLUMNS/ ROWS
                Values         = new List <IList <object> > {
                    values
                }
            }, AppConfig.SpreadSheetId, string.Format("Sheet1!M{0}", rowNumber)); // M2 = starting point

            apiUpdateRequest.ValueInputOption = SpreadsheetsResource.ValuesResource.UpdateRequest.ValueInputOptionEnum.RAW;
            var apiUpdateResponse = apiUpdateRequest.Execute();

            return(apiUpdateResponse.UpdatedColumns.HasValue ? apiUpdateResponse.UpdatedColumns.Value : 0);
        }
        /*
         *  POST http://localhost:4338/api/SpreadSheet/author/add
         *
         *  request:
         *  {
         *      "rowId": 1234,
         *      "name": "Roby",
         *      "email" : "*****@*****.**",
         *      "phone":"054-5555555",
         *      "ticketA": 2,
         *      "ticketB": 1,
         *      "ticketC": 1
         *  }
         */
        public int AddAuthorData([FromBody] AuthorDataRequest request)
        {
            var service = SpreadSheetServiceFactory.Produce();
            var values  = new List <IList <object> >();

            var timestamp = DateTime.Now;

            // generate participants rows
            Enumerable.Range(0, request.TicketA).ToList().ForEach((index) => {
                values.Add(new List <object> {
                    request.RowId,
                    timestamp,
                    request.Name,
                    request.Phone,
                    request.Email,
                    request.TicketA,
                    request.TicketB,
                    request.TicketC,
                    "",
                    "",
                    "",
                    Rnd.Next(100000),
                    "",
                    "",
                    "",
                    "",
                    "",
                    "TicketA"
                });
            });

            Enumerable.Range(0, request.TicketB).ToList().ForEach((index) => {
                values.Add(new List <object> {
                    request.RowId,
                    timestamp,
                    request.Name,
                    request.Phone,
                    request.Email,
                    request.TicketA,
                    request.TicketB,
                    request.TicketC,
                    "",
                    "",
                    "",
                    Rnd.Next(100000),
                    "",
                    "",
                    "",
                    "",
                    "",
                    "TicketB"
                });
            });

            Enumerable.Range(0, request.TicketC).ToList().ForEach((index) => {
                values.Add(new List <object> {
                    request.RowId,
                    timestamp,
                    request.Name,
                    request.Phone,
                    request.Email,
                    request.TicketA,
                    request.TicketB,
                    request.TicketC,
                    "",
                    "",
                    "",
                    Rnd.Next(100000),
                    "",
                    "",
                    "",
                    "",
                    "",
                    "TicketC"
                });
            });

            var apiAppendRequest = service.Spreadsheets.Values.Append(new ValueRange
            {
                MajorDimension = "ROWS", // COLUMNS/ ROWS
                Values         = values
            }, AppConfig.SpreadSheetId, "Sheet1");

            apiAppendRequest.ValueInputOption = SpreadsheetsResource.ValuesResource.AppendRequest.ValueInputOptionEnum.RAW;
            var apiAppendResponse = apiAppendRequest.Execute();

            return(apiAppendResponse.Updates.UpdatedRows.HasValue ? apiAppendResponse.Updates.UpdatedRows.Value : 0);
        }