static void CreateSampleAnswer()
        {
            ChatItem item1 = new ChatItem();
            item1.Id = "Cortana";
            item1.ChatText = "Hi this is Cortana";

            ChatItem item2 = new ChatItem();
            item2.Id = "User";
            item2.ChatText = "Hi this is User";

            ChatItem item3 = new ChatItem();
            item3.Id = "Cortana";
            item3.ChatText = "Hi shall we complete the Task?";

            ChatWindow chatWindow = new ChatWindow();
            chatWindow.ChatList.Add(item1);
            chatWindow.ChatList.Add(item2);
            chatWindow.ChatList.Add(item3);

            TrainBookingState bookingState = new TrainBookingState();

            bookingState.Source = new Station();
            bookingState.Source.Name = "Hyderabad";
            bookingState.Source.Code = "SC";

            bookingState.Destination = new Station();
            bookingState.Destination.Name = "Chennai Central";
            bookingState.Destination.Code = "MAS";

            bookingState.DateOfJourney = DateTime.Now.AddDays(10);

            bookingState.TrainInfo = new TrainInfo();
            bookingState.TrainInfo.Name = "Chennai Express";
            bookingState.TrainInfo.Number = "12604";

            bookingState.CoachPreference = CoachType.SecondAC;
            bookingState.PhoneNumber = "1234567890";

            bookingState.NumberOfPassangers = 4;

            PassangerInfo pas1 = new PassangerInfo();
            pas1.Name = "BillGates";
            pas1.Age = 50;
            pas1.Gender = Gender.Male;
            pas1.BerthChoice = BerthChoice.SideLower;

            PassangerInfo pas2 = new PassangerInfo();
            pas2.Name = "Balmer";
            pas2.Age = 49;
            pas2.Gender = Gender.Male;
            pas2.BerthChoice = BerthChoice.SideUpper;

            PassangerInfo pas3 = new PassangerInfo();
            pas3.Name = "BillGates";
            pas3.Age = 45;
            pas3.Gender = Gender.Male;
            pas3.BerthChoice = BerthChoice.Lower;

            bookingState.PassangerInfoList = new List<PassangerInfo>();
            bookingState.PassangerInfoList.Add(pas1);
            bookingState.PassangerInfoList.Add(pas2);
            bookingState.PassangerInfoList.Add(pas3);


            TaskAnswer answer = new TaskAnswer();
            answer.Title = "Book Train Ticket Task";
            answer.TaskType = TaskType.Train;
            answer.ChatWindow = chatWindow;
            answer.TaskState = bookingState;


            string jsonString = JsonConvert.SerializeObject(answer);

            return;



        }
        private TaskAnswer PostStateAction(TaskAnswer answer, UserProfile profile, string query)
        {
            TrainBookingState taskState = answer.TaskState as TrainBookingState;
            if (taskState == null)
            {
                return null;
            }

            TaskStateCode nextState = GetNextState(answer);
            answer.CurrentState = nextState;

            string question;
            if (!_chatItemMap.TryGetValue(nextState, out question))
            {
                question = "Some Error. it shouldn't";
                return null;
            }
            ChatItem chatItem = new ChatItem();
            PassangerInfo passenger = taskState.PassangerInfoList.FirstOrDefault(x => x.Id == answer.CurrentPassengerId);
            if (passenger == null)
            {
                // Fixme; avoid dummy passenger
                PassangerInfo passanger = new PassangerInfo();
            }
            
            switch (nextState)
            {
                case TaskStateCode.InitState:
                    break;
                case TaskStateCode.SourceStationState:
                    break;
                case TaskStateCode.DestinationStationState:
                    break;
                case TaskStateCode.DateOfJourneyState:
                    break;
                case TaskStateCode.TrainSelectionState:
                    question = string.Format(question, taskState.Source.Code, taskState.Destination.Code);
                    FillTrainList(chatItem, taskState.Source.Code, taskState.Destination.Code);
                    break;
                case TaskStateCode.PreferredCoachState:
                    FillPreferredCoachList(chatItem);
                    break;
                case TaskStateCode.NumberOfPassangersState:
                    break;
                case TaskStateCode.PassengerNameState:
                    question = string.Format(question, answer.CurrentPassengerId);
                    break;
                case TaskStateCode.PassengerGenderState:
                    question = string.Format(question, passenger.Name);
                    break;
                case TaskStateCode.PassengerAgeState:
                    question = string.Format(question, (passenger.Gender.Equals(Gender.Male)) ? "his" : "her");
                    break;
                case TaskStateCode.PassengerSeatPreferenceState:
                    FillePreferredBerthList(chatItem);
                    break;
                case TaskStateCode.PassengerDetailsState:
                    break;
                case TaskStateCode.PhoneNumberState:
                    break;
                case TaskStateCode.BookTicketState:
                    break;
                case TaskStateCode.EndState:
                    profileHelper.UpdateUserProfile(taskState, profile);
                    break;
                default:
                    break;
            }

            chatItem.Id = "Cortana";
            chatItem.ChatText = question;
            answer.ChatWindow.ChatList.Add(chatItem);
            return answer;
        }
        private bool TryGetNextPassengerState(PassangerInfo passanger, out TaskStateCode nextState)
        {
            nextState = TaskStateCode.ExceptionState;
            if (string.IsNullOrEmpty(passanger.Name))
            {
                nextState = TaskStateCode.PassengerNameState;
                return true;
            }

            if (passanger.Gender.Equals(Gender.None))
            {
                nextState = TaskStateCode.PassengerGenderState;
                return true;
            }

            if (passanger.Age == 0)
            {
                nextState = TaskStateCode.PassengerAgeState;
                return true;
            }

            if (passanger.BerthChoice.Equals(BerthChoice.None))
            {
                nextState = TaskStateCode.PassengerSeatPreferenceState;
                return true;
            }
            return false;
        }
        public bool TryUpdateTaskState(TaskAnswer answer, UserProfile userProfile, string query)
        {
            TrainBookingState taskState = answer.TaskState as TrainBookingState;
            if (taskState == null)
            {
                return false;
            }

            TaskStateCode currentState = answer.CurrentState;
            bool updated = false;
            switch (currentState)
            {
                case TaskStateCode.SourceStationState:
                    Station sourceStation;
                    if (TryGetStation(query, out sourceStation))
                    {
                        taskState.Source = sourceStation;
                        updated = true;
                    }
                    break;

                case TaskStateCode.DestinationStationState:
                    Station destinationStation;
                    if (TryGetStation(query, out destinationStation))
                    {
                        taskState.Destination = destinationStation;
                        updated = true;
                    }
                    break;

                case TaskStateCode.DateOfJourneyState:
                    DateTime date;
                    if (DateTime.TryParse(query, out date))
                    {
                        taskState.DateOfJourney = date;
                        updated = true;
                    }
                    break;

                case TaskStateCode.TrainSelectionState:
                    TrainInfo trainInfo;
                    if (TryGetTrain(query, out trainInfo))
                    {
                        taskState.TrainInfo = trainInfo;
                        updated = true;
                    }
                    break;

                case TaskStateCode.PreferredCoachState:
                    CoachType coachType;
                    if (TryGetCoach(query, out coachType))
                    {
                        taskState.CoachPreference = coachType;
                        updated = true;
                    }
                    break;

                case TaskStateCode.NumberOfPassangersState:
                    uint number;
                    if (TryGetNumberOfPassengers(query, out number))
                    {
                        taskState.NumberOfPassangers = number;
                        updated = true;
                    }
                    break;

                case TaskStateCode.PassengerNameState:
                    string name;
                    if (TryGetPassengerName(query, out name))
                    {
                        uint iPassenger = answer.CurrentPassengerId;
                        var passengerList = taskState.PassangerInfoList;
                        var passenger = passengerList.FirstOrDefault(x => x.Id == iPassenger);
                        if (passenger == null)
                        {
                            passenger = new PassangerInfo();
                            passengerList.Add(passenger);
                            passenger.Id = (uint)passengerList.Count;
                            answer.CurrentPassengerId = passenger.Id;
                        }
                        passenger.Name = name;
                        updated = true;
                    }
                    break;

                case TaskStateCode.PassengerAgeState:
                    uint age;
                    if (TryGetPassengerAge(query, out age))
                    {
                        uint iPassenger = answer.CurrentPassengerId;
                        var passengerList = taskState.PassangerInfoList;
                        var passenger = passengerList.FirstOrDefault(x => x.Id == iPassenger);
                        if (passenger == null)
                        {
                            passenger = new PassangerInfo();
                            passengerList.Add(passenger);
                            passenger.Id = (uint)passengerList.Count;
                            answer.CurrentPassengerId = passenger.Id;
                        }
                        passenger.Age = age;
                        updated = true;
                    }
                    break;

                case TaskStateCode.PassengerGenderState:
                    Gender gender;
                    if (TryGetPassengerGender(query, out gender))
                    {
                        uint iPassenger = answer.CurrentPassengerId;
                        var passengerList = taskState.PassangerInfoList;
                        var passenger = passengerList.FirstOrDefault(x => x.Id == iPassenger);
                        if (passenger == null)
                        {
                            passenger = new PassangerInfo();
                            passengerList.Add(passenger);
                            passenger.Id = (uint)passengerList.Count;
                            answer.CurrentPassengerId = passenger.Id;
                        }
                        passenger.Gender = gender;
                        updated = true;
                    }
                    break;

                case TaskStateCode.PassengerSeatPreferenceState:
                    BerthChoice berthChoice;
                    if (TryGetPassengerSeatPreference(query, out berthChoice))
                    {
                        uint iPassenger = answer.CurrentPassengerId;
                        var passengerList = taskState.PassangerInfoList;
                        var passenger = passengerList.FirstOrDefault(x => x.Id == iPassenger);
                        if (passenger == null)
                        {
                            passenger = new PassangerInfo();
                            passengerList.Add(passenger);
                            passenger.Id = (uint)passengerList.Count;
                            answer.CurrentPassengerId = passenger.Id;
                        }
                        passenger.BerthChoice = berthChoice;
                        updated = true;
                    }
                    break;

                case TaskStateCode.PhoneNumberState:
                    string phoneNumber;
                    if (TryGetPhoneNumber(query, out phoneNumber))
                    {
                        taskState.PhoneNumber = phoneNumber;
                        updated = true;
                    }
                    break;

                case TaskStateCode.BookTicketState:
                    BookedState ticketBookedState;
                    if (TryGetConfirmation(query, out ticketBookedState))
                    {
                        answer.TicketBookedState = ticketBookedState;
                        updated = true;
                    }
                    break;
            }

            return updated;

        }