diff --git a/Team 16/PackDetail.java b/Team 16/PackDetail.java new file mode 100644 index 0000000..b179e74 --- /dev/null +++ b/Team 16/PackDetail.java @@ -0,0 +1,86 @@ +package com.travelsite.travelsite; + +import java.util.List; +import java.util.Map; + +public class PackDetail { + private int id; + private String packageName; + private int packageDuration; + + private Map> amenities ; + private Map> itinerary; + private Map> cities; + private String description; + private int stars; + private String validFrom; + private String validTo; + private Map> packageType; + private String imageURL; + + + public PackDetail(int id, String packageName, int packageDuration, Map> amenities, Map> itinerary ,Map> cities, String description, int stars, String validFrom, String validTo, Map> packageType,String imageURL ) { + this.id = id; + this.packageName = packageName; + this.packageDuration = packageDuration; + this.amenities = amenities; + this.itinerary = itinerary; + this.cities = cities; + this.description = description; + this.validFrom = validFrom; + this.validTo=validTo; + this.stars=stars; + this.packageType=packageType; + this.imageURL = imageURL; + + } + + public int getId() { + return id; + } + + public String getPackageName() { + return packageName; + } + + public int getPackageDuration() { + return packageDuration; + } + + public Map> getAmenities() { + return amenities; + } + + public Map> getItinerary() { + return itinerary; + } + + public Map> getCities() { + return cities; + } + + public String getDescription() { + return description; + } + + public Map> getPackageType() { + return packageType; + } + + + public int getStars() { + return stars; + } + + public String getValidFrom() { + return validFrom; + } + + public String getValidTo() { + return validTo; + } + + public String getImageURL() { + return imageURL; + } +} diff --git a/Team 16/PackageInfo.java b/Team 16/PackageInfo.java new file mode 100644 index 0000000..b86ce8f --- /dev/null +++ b/Team 16/PackageInfo.java @@ -0,0 +1,34 @@ +package com.travelsite.travelsite; + +public class PackageInfo { + private int packageId ; + private String packageName; + private String imageURL; + private String description; + + + public PackageInfo(int packageId, String packageName, String imageURL,String description) { + this.packageId = packageId; + this.packageName = packageName; + this.imageURL = imageURL; + this.description=description; + + } + + public int getPackageId() { + return packageId; + } + + public String getPackageName() { + return packageName; + } + + public String getImageURL() { + return imageURL; + } + + public String getDescription() { + return description; + } + +} diff --git a/Team 16/README.md b/Team 16/README.md new file mode 100644 index 0000000..607b592 --- /dev/null +++ b/Team 16/README.md @@ -0,0 +1,31 @@ +FY: __Team 16__ - Code Commandos + +__Problem Statement:__ +Many travelers in India struggle to find tailored travel experiences that match their unique preferences and needs. With countless options available they often face difficulty in finding curated packages that offer diverse experiences across the country. This lack of personalized solutions results in missed opportunities for unforgettable journeys, leaving travelers feeling unsatisfied with their travel experiences. + +__Solution:__ +Introducing Trippy - Your Gateway to Tailored Travel Experiences in India. Trippy offers curated packages catering to every wanderer's desires, including adventure in the hills, relaxation by the beach, spiritual retreats, and exploration of vibrant cities. + +With Trippy, travelers can choose from standard to premium options, ensuring that every journey is tailored to perfection. Our platform provides personalized solutions, empowering travelers to explore India like never before with every moment crafted to match their unique preferences and needs. + +Visit Trippy today and embark on unforgettable journeys across India, where every adventure is tailor-made just for you. + + +__Data Structures Used:__ HashMap, LinkedHashMap, TreeMap, ArrayList, LinkedList + +__Report 1-__ https://docs.google.com/document/d/1hd-DDxVGvolO9GJzl_5uDqD4mi6bbQvt/edit?usp=sharing&ouid=102255902690925028800&rtpof=true&sd=true + +__Report 2-__ https://docs.google.com/document/d/1kf4-KBvioeSn2uGnuTSov8fTQ66W4AyZ/edit?usp=sharing&ouid=102255902690925028800&rtpof=true&sd=true + +__Short video -__ https://drive.google.com/file/d/1gFDvigCXre05y7fk-6pzGk78APrJfrmm/view?usp=sharing + + + + + + + + + + + diff --git a/Team 16/Role.java b/Team 16/Role.java new file mode 100644 index 0000000..6ed4974 --- /dev/null +++ b/Team 16/Role.java @@ -0,0 +1,35 @@ +package com.travelsite.travelsite; + +import jakarta.persistence.*; + +@Entity +@Table(name="roles") +public class Role { + @Id + @GeneratedValue (strategy = GenerationType.IDENTITY) + private long id; + private String name; + + public Role() { + } + + public Role(String name) { + this.name = name; + } + + public long getId() { + return id; + } + + public String getName() { + return name; + } + + public void setId(long id) { + this.id = id; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/Team 16/TravelController.java b/Team 16/TravelController.java new file mode 100644 index 0000000..ab2a18e --- /dev/null +++ b/Team 16/TravelController.java @@ -0,0 +1,55 @@ +package com.travelsite.travelsite; + +import com.travelsite.travelsite.repository.RoleRepository; +import com.travelsite.travelsite.repository.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.GetMapping; + +import java.util.List; + +@RestController +@CrossOrigin("*") +public class TravelController { + @Autowired + TravelDao obj ; + @Autowired + UserRepository userRepository ; + @Autowired + RoleRepository roleRepository; + @GetMapping("/PackageData") + public String getAllPackage(){ + return obj.getSearchData(); + } + @GetMapping("/packagedetails") + public List getPackageDetails(){ + return obj.getPackageDetails(); + } + @GetMapping("/packagedetails/{id}") + public PackDetail getPackDetail(@PathVariable ("id") int id){ + return obj.getPackDetail(id); + + } + @GetMapping("/packagedetailbycityname/{cityname}") + public List getPackDetailByCityName(@PathVariable ("cityname") String cityname ){ + return obj.searchPackageByCity(cityname); + } + + @GetMapping("/packagedetailsort/{sorttype}") + public List getPackDetailSorted(@PathVariable ("sorttype") String sorttype){ + return obj.sortPackages(sorttype); + + } + @GetMapping("/register") + public void registerUser(){ + User obj = new User("sanika","sd","sanika@gmail.com","abc23"); + Role role = new Role ("admin"); + roleRepository.save(role); + //obj.setRoles(role); + + // userRepository.save(obj); + + } +} diff --git a/Team 16/TravelDao.java b/Team 16/TravelDao.java new file mode 100644 index 0000000..b0f6966 --- /dev/null +++ b/Team 16/TravelDao.java @@ -0,0 +1,429 @@ +package com.travelsite.travelsite; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import org.springframework.stereotype.Repository; + +import java.net.MalformedURLException; +import java.net.URL; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.*; + +import javax.sql.DataSource; +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +@Repository +public class TravelDao { + private final DataSource dataSource; + Map> detailsMap = new HashMap<>(); + Map> citiesMap = new HashMap<>(); + //pid+@@@+cityName + Map> itinerariesMap = new HashMap<>(); + //key=pid+day + Map> packageTypesMap = new HashMap<>(); + //key=pid+packageType + Map> amenitiesMap = new HashMap<>(); + //key=pid+packageType+amenity + Map> imagesMap = new HashMap<>(); + //key=pid + public TravelDao(DataSource dataSource) { + this.dataSource = dataSource; + executeQuery(); + + } + + public void executeQuery() { + String sql = "SELECT * FROM public.\"Packages\""; + try (Connection connection = dataSource.getConnection(); + Statement statement = connection.createStatement(); + ResultSet rs = statement.executeQuery(sql)) { + + while (rs.next()) { + int id = rs.getInt("Package_pid"); + String name = rs.getString("Package_name"); + String des = rs.getString("Description"); + int dur = rs.getInt("Duration"); + int stars = rs.getInt("Stars"); + String vf = rs.getString("valid_from"); + String vt = rs.getString("valid_to"); + + //Create ArrayList + List packageDetails = new ArrayList<>(); + + packageDetails.add(name); + packageDetails.add(des); + packageDetails.add(String.valueOf(dur)); + packageDetails.add(String.valueOf(stars)); + packageDetails.add(vf); + packageDetails.add(vt); + + //store details + detailsMap.put(id, packageDetails); + + System.out.println(detailsMap); + } + + String sql1 = "SELECT * FROM public.\"Cities\""; + ResultSet rs1 = statement.executeQuery(sql1); + + while (rs1.next()) { + int id = rs1.getInt("Package_pid"); + String city = rs1.getString("City"); + int no_of_days = rs1.getInt("No_Of_Days"); + + List citiesList = new ArrayList<>(); + citiesList.add(city); + citiesList.add(String.valueOf(no_of_days)); + + //creating key + String concat1 = String.valueOf(id).concat("@@@"); + String key_city = concat1.concat(city); + + //store details + citiesMap.put(key_city, citiesList); + } + + String sql2 = "SELECT * FROM public.\"Itineraries\""; + ResultSet rs2 = statement.executeQuery(sql2); + + while (rs2.next()) { + int id = rs2.getInt("Package_pid"); + String day = rs2.getString("Day"); + String description = rs2.getString("Description"); + + List itinerariesList = new ArrayList<>(); + itinerariesList.add(day); + itinerariesList.add(description); + + //creating key + String key_iti = String.valueOf(id).concat(day); + + //store details + itinerariesMap.put(key_iti, itinerariesList); + + } + + String sql3 = "SELECT * FROM public.\"Package_Type\""; + ResultSet rs3 = statement.executeQuery(sql3); + + while (rs3.next()) { + int id = rs3.getInt("Package_pid"); + String packageType = rs3.getString("Package_Type"); + int cost = rs3.getInt("Cost"); + String descrip = rs3.getString("Description"); + + List packageTypeList = new ArrayList<>(); + packageTypeList.add(packageType); + packageTypeList.add(String.valueOf(cost)); + packageTypeList.add(descrip); + + //creating key + String key_pt = String.valueOf(id).concat(packageType); + + //store details + packageTypesMap.put(key_pt, packageTypeList); + } + + String sql4 = "SELECT * FROM public.\"Amenities\""; + ResultSet rs4 = statement.executeQuery(sql4); + + while (rs4.next()) { + int id = rs4.getInt("Package_pid"); + String packageType = rs4.getString("Package_Type"); + String a = rs4.getString("Amenities"); + + List amenitiesList = new ArrayList<>(); + amenitiesList.add(a); + + //creating key + String c = String.valueOf(id).concat(packageType); + String key_a = c.concat(a); + + //store values + amenitiesMap.put(key_a, amenitiesList); + } + + String sql5 = "SELECT * FROM public.\"Images\""; + ResultSet rs5 = statement.executeQuery(sql5); + + while (rs5.next()) { + int id = rs5.getInt("Package_pid"); + String image = rs5.getString("Image"); + + // Convert string URL to URL object + URL imageUrl = new URL(image); + + List imagesURL = new ArrayList<>(); + imagesURL.add(imageUrl); + + //store details + imagesMap.put(id, imagesURL); + + } + } + catch(SQLException e){ + e.printStackTrace(); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } + + public static JsonArray search(String city, int packageId, int dur, String date, int noOfPpl, + Map> detailsMap, + Map> citiesMap, + Map> itinerariesMap, + Map> packageTypesMap, + Map> amenitiesMap, + Map> imagesMap) { + + JsonArray jsonArray = new JsonArray(); + + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate date_new = LocalDate.parse(date, formatter); + + // Flag + boolean found = false; + + // Check if packageId is provided + if (packageId != 0) { + // Iterate over the detailsMap to find the package with the given packageId + for (Map.Entry> entry : detailsMap.entrySet()) { + int id = entry.getKey(); + List details = entry.getValue(); + // Check if the current package matches the given packageId + if (id == packageId) { + // Create JSON object for the package + JsonObject packageJson = createPackageJsonObject(id, details, citiesMap, itinerariesMap, packageTypesMap, amenitiesMap, imagesMap); + jsonArray.add(packageJson); + found = true; + break; // Stop searching once a match is found + } + } + } else { + // No packageId provided, so we'll search by city and duration + for (Map.Entry> cityEntry : citiesMap.entrySet()) { + List cities = cityEntry.getValue(); + // Check if the city matches the provided city + if (cities.contains(city)) { + String packageIdStr = cityEntry.getKey().split("@@@")[0]; + int packageIdFromCity = Integer.parseInt(packageIdStr); + List packageDetails = detailsMap.get(packageIdFromCity); + // Check if the package duration matches the provided duration + if (packageDetails != null && Integer.parseInt(packageDetails.get(2)) >= dur) { + // Check if the date is within the package's validity period + LocalDate validFrom = LocalDate.parse(packageDetails.get(4), formatter); + LocalDate validTo = LocalDate.parse(packageDetails.get(5), formatter); + if (date_new.isAfter(validFrom) && date_new.isBefore(validTo)) { + // Create JSON object for the package + JsonObject packageJson = createPackageJsonObject(packageIdFromCity, packageDetails, citiesMap, itinerariesMap, packageTypesMap, amenitiesMap, imagesMap); + jsonArray.add(packageJson); + found = true; + } + } + } + } + } + + if (!found) { + // No packages found matching the search criteria + System.out.println("No packages found matching the search criteria."); + } + + return jsonArray; + } + + // Helper method to create JSON object for a package + private static JsonObject createPackageJsonObject(int packageId, List details, + Map> citiesMap, + Map> itinerariesMap, + Map> packageTypesMap, + Map> amenitiesMap, + Map> imagesMap) { + JsonObject packageJson = new JsonObject(); + packageJson.addProperty("PackageId", packageId); + packageJson.addProperty("PackageName", details.get(0)); + packageJson.addProperty("Description", details.get(1)); + packageJson.addProperty("Duration", details.get(2)); + packageJson.addProperty("Stars", details.get(3)); + packageJson.addProperty("ValidFrom", details.get(4)); + packageJson.addProperty("ValidTo", details.get(5)); + + // Get images for this package + JsonArray imagesArray = new JsonArray(); + List images = imagesMap.get(packageId); + if (images != null) { + for (URL imageUrl : images) { + JsonObject imageJson = new JsonObject(); + imageJson.addProperty("ImageUrl", imageUrl.toString()); + imagesArray.add(imageJson); + } + } + packageJson.add("Image", imagesArray); + + // Get cities for this package + JsonArray citiesArray = new JsonArray(); + for (Map.Entry> cityEntry : citiesMap.entrySet()) { + if (cityEntry.getKey().startsWith(Integer.toString(packageId))) { + JsonObject cityJson = new JsonObject(); + cityJson.addProperty("City", cityEntry.getValue().get(0)); + cityJson.addProperty("NoOfDays", cityEntry.getValue().get(1)); + citiesArray.add(cityJson); + } + } + packageJson.add("Cities", citiesArray); + + // Get itineraries for this package + JsonArray itinerariesArray = new JsonArray(); + for (Map.Entry> itiEntry : itinerariesMap.entrySet()) { + if (itiEntry.getKey().startsWith(Integer.toString(packageId))) { + JsonObject itineraryJson = new JsonObject(); + itineraryJson.addProperty("Day", itiEntry.getValue().get(0)); + itineraryJson.addProperty("Description", itiEntry.getValue().get(1)); + itinerariesArray.add(itineraryJson); + } + } + packageJson.add("Itineraries", itinerariesArray); + + // Get package types for this package + JsonArray packageTypesArray = new JsonArray(); + for (Map.Entry> typeEntry : packageTypesMap.entrySet()) { + if (typeEntry.getKey().startsWith(Integer.toString(packageId))) { + JsonObject packageTypeJson = new JsonObject(); + List packageType = typeEntry.getValue(); + packageTypeJson.addProperty("PackageType", packageType.get(0)); + packageTypeJson.addProperty("Cost", packageType.get(1)); + packageTypeJson.addProperty("PackageTypeDescription", packageType.get(2)); + + // Get amenities for this package + JsonArray amenitiesArray = new JsonArray(); + for (Map.Entry> amenityEntry : amenitiesMap.entrySet()) { + if (amenityEntry.getKey().contains(Integer.toString(packageId)) && amenityEntry.getKey().contains(packageType.get(0))) { + JsonObject amenityJson = new JsonObject(); + amenityJson.addProperty("Amenity", amenityEntry.getValue().get(0)); + amenitiesArray.add(amenityJson); + } + } + packageTypeJson.add("Amenities", amenitiesArray); + packageTypesArray.add(packageTypeJson); + } + } + packageJson.add("PackageTypes", packageTypesArray); + + + return packageJson; + } + public String getSearchData(){ + Gson gson = new Gson(); + JsonElement result1 = search("Manali", 0, 0, "2024-10-01", 4, detailsMap, citiesMap, itinerariesMap, packageTypesMap, amenitiesMap, imagesMap); + // Convert the result to JSON string + String jsonString1 = gson.toJson(result1); + // Print or further process the JSON string + System.out.println(jsonString1); + return jsonString1; + } + + public List getPackageDetails(){ + List packageInfo = new ArrayList<>(); + for ( int id : detailsMap.keySet() ){ + String packageName = detailsMap.get(id).get(0); + String imageURL = imagesMap.get(id).get(0).toString(); + String description=detailsMap.get(id).get(1); + PackageInfo packageInfo1 = new PackageInfo(id, packageName, imageURL,description); + packageInfo.add(packageInfo1); + } + return packageInfo; + } + + public PackDetail getPackDetail(int id){ + String packageName = detailsMap.get(id).get(0); + String imageURL = String.valueOf(imagesMap.get(id).get(0)); + int packageDuration =Integer.parseInt(detailsMap.get(id).get(2)); + Map> amenities = new HashMap<>(); + for( String aid : amenitiesMap.keySet()) { + + if( aid.contains(String.valueOf(id))){ + amenities.put(aid,amenitiesMap.get(aid)); + + } + } + Map> itinerary = new HashMap<>(); + for (String itkey : itinerariesMap.keySet()){ + if( itkey.startsWith(String.valueOf(id))){ + itinerary.put(itkey,itinerariesMap.get(itkey)); + + } + } + + Map> cities = new HashMap<>(); + for ( String ckey : citiesMap.keySet()){ + if( ckey.contains(String.valueOf(id))){ + cities.put(ckey, citiesMap.get(ckey)); + } + } + Map> packageType=new HashMap<>(); + + for ( String pkey : packageTypesMap.keySet()){ + if( pkey.contains(String.valueOf(id))){ + packageType.put(pkey,packageTypesMap.get(pkey)); + + } + } + String description = detailsMap.get(id).get(1); + int stars= Integer.parseInt(detailsMap.get(id).get(3)); + String validFrom = detailsMap.get(id).get(4); + String validTo = detailsMap.get(id).get(5); + + PackDetail packDetail = new PackDetail(id,packageName,packageDuration,amenities,itinerary,cities,description,stars,validFrom,validTo,packageType,imageURL); + return packDetail; + } + List allPackDetailsByCityName = new ArrayList<>(); + public List searchPackageByCity(String cityName){ + int id; + if(!allPackDetailsByCityName.isEmpty()){ + allPackDetailsByCityName.clear(); + } + for ( String ckey : citiesMap.keySet()){ + String city = citiesMap.get(ckey).get(0); + if( city.equalsIgnoreCase(cityName)){ + id= Integer.parseInt(ckey.substring(0,ckey.indexOf("@"))); + PackDetail packDetail = getPackDetail(id); + allPackDetailsByCityName.add(packDetail); + } + + } + return allPackDetailsByCityName; + } + + public List sortPackages(String sortby){ + int len = allPackDetailsByCityName.size(); + for( int i=0;i allPackDetailsByCityName.get(j+1).getPackageDuration()){ + PackDetail temp = allPackDetailsByCityName.get(j); + allPackDetailsByCityName.set(j,allPackDetailsByCityName.get(j+1)); + allPackDetailsByCityName.set(j+1,temp); + } + break; + case "stars": + if(allPackDetailsByCityName.get(j).getStars()> allPackDetailsByCityName.get(j+1).getStars()){ + PackDetail temp = allPackDetailsByCityName.get(j); + allPackDetailsByCityName.set(j,allPackDetailsByCityName.get(j+1)); + allPackDetailsByCityName.set(j+1,temp); + } + break; + + } + } + } + return allPackDetailsByCityName; + } + + + +} diff --git a/Team 16/TravelSiteApplication.java b/Team 16/TravelSiteApplication.java new file mode 100644 index 0000000..e44fe13 --- /dev/null +++ b/Team 16/TravelSiteApplication.java @@ -0,0 +1,13 @@ +package com.travelsite.travelsite; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class TravelSiteApplication { + + public static void main(String[] args) { + SpringApplication.run(TravelSiteApplication.class, args); + } + +} diff --git a/Team 16/User.java b/Team 16/User.java new file mode 100644 index 0000000..571339b --- /dev/null +++ b/Team 16/User.java @@ -0,0 +1,63 @@ +package com.travelsite.travelsite; + +import jakarta.persistence.*; + +import java.util.Set; + +@Entity +@Table(name="users") +public class User { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + private String name; + @Column (nullable = false , unique = true) + private String username; + @Column (nullable = false , unique = true) + private String email; + @Column (nullable = false) + private String password; + @ManyToMany(fetch = FetchType.EAGER , cascade = CascadeType.ALL) + @JoinTable (name = "user_roles" , joinColumns = @JoinColumn(name= "user_id", referencedColumnName = "id"), + inverseJoinColumns = @JoinColumn(name= "role_id", referencedColumnName = "id")) + private Set roles; + public User(String name, String username, String email, String password) { + this.name = name; + this.username = username; + this.email = email; + this.password = password; + } + + public User() { + + } + + public long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getUsername() { + return username; + } + + public String getEmail() { + return email; + } + + public String getPassword() { + return password; + } + + public void setRoles(Role role ) { + this.roles.add(role); + } + + public Set getRoles() { + return roles; + } + +} diff --git a/Team 16/elephantSQL_console.java b/Team 16/elephantSQL_console.java new file mode 100644 index 0000000..908850a --- /dev/null +++ b/Team 16/elephantSQL_console.java @@ -0,0 +1,629 @@ +import java.sql.*; +import java.util.*; +import java.net.URL; +import java.time.LocalDate; + +public class elephantSQL_console { + public static void main(String[] args) throws Exception { + + String url = "jdbc:postgresql://isabelle.db.elephantsql.com/yczrhgub"; + String username = "yczrhgub"; + String password = "xspSCM8b4pLLGkYTW088oIgK4fbyzOtC"; + Connection con = DriverManager.getConnection(url, username, password); + + Map> detailsMap = new HashMap<>(); + // Key=pid + TreeMap> citiesMap = new TreeMap<>(); + // Key=seq+&&&+pid+@@@+cityName + Map> itiMap = new HashMap<>(); + // Key=(id*100)+day + Map> packageTypesMap = new HashMap<>(); + // Key=pid+packageType + Map> amenitiesMap = new HashMap<>(); + // Key=pid+packageType+amenity + Map> imagesMap = new HashMap<>(); + // Key=pid + + Statement statement = con.createStatement(); + + String sql2 = "SELECT * FROM public.\"Itineraries\""; + ResultSet rs2 = statement.executeQuery(sql2); + + while (rs2.next()) { + int id = rs2.getInt("Package_pid"); + String day = rs2.getString("Day"); + String description = rs2.getString("Description"); + + List itinerariesList = new ArrayList<>(); + itinerariesList.add(day); + itinerariesList.add(description); + + // Creating key + int key_iti = (id * 100) + (Integer.parseInt(day.substring(4))); + + // Store details + itiMap.put(key_iti, itinerariesList); + } + Map> itinerariesMap = sortbykey(itiMap); + + String sql3 = "SELECT * FROM public.\"Package_Type\""; + ResultSet rs3 = statement.executeQuery(sql3); + + while (rs3.next()) { + int id = rs3.getInt("Package_pid"); + String packageType = rs3.getString("Package_Type"); + int cost = rs3.getInt("Cost"); + String descrip = rs3.getString("Description"); + + List packageTypeList = new ArrayList<>(); + packageTypeList.add(packageType); + packageTypeList.add(String.valueOf(cost)); + packageTypeList.add(descrip); + + // Creating key + String key_pt = String.valueOf(id).concat(packageType); + + // Store details + packageTypesMap.put(key_pt, packageTypeList); + } + + String sql = "SELECT * FROM public.\"Packages\""; + ResultSet rs = statement.executeQuery(sql); + + while (rs.next()) { + int id = rs.getInt("Package_pid"); + String name = rs.getString("Package_name"); + String des = rs.getString("Description"); + int dur = rs.getInt("Duration"); + int stars = rs.getInt("Stars"); + String vf = rs.getString("valid_from"); + String vt = rs.getString("valid_to"); + String cancellation = rs.getString("Cancellation_policy"); + String inc = rs.getString("Inclusions"); + String exc = rs.getString("Exclusions"); + + // Create ArrayList + List packageDetails = new ArrayList<>(); + + packageDetails.add(name); + packageDetails.add(des); + packageDetails.add(String.valueOf(dur)); + packageDetails.add(String.valueOf(stars)); + packageDetails.add(vf); + packageDetails.add(vt); + packageDetails.add(cancellation); + packageDetails.add(inc); + packageDetails.add(exc); + packageDetails.add(String.valueOf(getMinCost(String.valueOf(id), packageTypesMap))); + + // Store details + detailsMap.put(id, packageDetails); + } + + String sql4 = "SELECT * FROM public.\"Amenities\""; + ResultSet rs4 = statement.executeQuery(sql4); + + while (rs4.next()) { + int id = rs4.getInt("Package_pid"); + String packageType = rs4.getString("Package_Type"); + String a = rs4.getString("Amenities"); + + List amenitiesList = new ArrayList<>(); + amenitiesList.add(a); + + // Creating key + String c = String.valueOf(id).concat(packageType); + String key_a = c.concat(a); + + // Store values + amenitiesMap.put(key_a, amenitiesList); + } + + String sql5 = "SELECT * FROM public.\"Images\""; + ResultSet rs5 = statement.executeQuery(sql5); + + while (rs5.next()) { + int id = rs5.getInt("Package_pid"); + String image = rs5.getString("Image"); + + // Convert string URL to URL object + URL imageUrl = new URL(image); + + List imagesURL = new ArrayList<>(); + imagesURL.add(imageUrl); + + // Store details + imagesMap.put(id, imagesURL); + } + + Scanner sc = new Scanner(System.in); + + int choice; + do { + System.out.println("Choose an option:"); + System.out.println("1. View all packages"); + System.out.println("2. View packages by city"); + System.out.println("3. Exit"); + choice = sc.nextInt(); + Map> SortedDetailsMap = new HashMap<>(); + int sortOption = 1; + int sortOrder = 1; + + switch (choice) { + case 1: + SortedDetailsMap = sortPackagesByCost(detailsMap, sortOrder); + String sql1 = "SELECT * FROM public.\"Cities\""; + ResultSet rs1 = statement.executeQuery(sql1); + + while (rs1.next()) { + int id = rs1.getInt("Package_pid"); + String cities = rs1.getString("City"); + int no_of_days = rs1.getInt("No_Of_Days"); + + List citiesList = new ArrayList<>(); + citiesList.add(cities); + citiesList.add(String.valueOf(no_of_days)); + + // Get the sequence from the sorted details map based on the current package ID + List packageDetails = SortedDetailsMap.get(id); + String sequence = packageDetails != null ? packageDetails.get(packageDetails.size() - 1) : ""; + + // Creating key + String key_city = sequence + "&&&" + id + "@@@" + cities; + + // Store details + citiesMap.put(key_city, citiesList); + } + + viewAllPackages(detailsMap, citiesMap, itinerariesMap, imagesMap, packageTypesMap, amenitiesMap); + break; + + case 2: + do{ + System.out.println("Sort packages by-\n1-Cost\n2-Star rating\n3-Duration"); + sortOption = sc.nextInt(); + sc.nextLine(); + if (sortOption >= 1 && sortOption <= 3) { + + } else { + System.out.println("Invalid option chosen"); + } + } while (!(sortOption >= 1 && sortOption <= 3)); + + do { + System.out.println("Sort in:\n1-Ascending\n2-Descending"); + sortOrder = sc.nextInt(); + sc.nextLine(); + if (sortOrder == 1 || sortOrder == 2) { + + } else { + System.out.println("Invalid option chosen"); + } + }while (!(sortOrder>=1 && sortOrder<=2)); + + do{ + switch (sortOption) { + case 1: + SortedDetailsMap = sortPackagesByCost(detailsMap, sortOrder); + break; + case 2: + SortedDetailsMap = sortPackagesByStarRatings(detailsMap, sortOrder); + break; + case 3: + SortedDetailsMap = sortPackagesByDuration(detailsMap, sortOrder); + break; + default: + System.out.println("Invalid option chosen!!!"); + System.out.println("Sort packages by-\n1-Cost\n2-Star rating\n3-Duration"); + sortOption = sc.nextInt(); + sc.nextLine(); + } + } while (!(sortOption >= 1 && sortOption <= 3)); + + + String sql1_1 = "SELECT * FROM public.\"Cities\""; + ResultSet rs1_1 = statement.executeQuery(sql1_1); + + while (rs1_1.next()) { + int id = rs1_1.getInt("Package_pid"); + String cities = rs1_1.getString("City"); + int no_of_days = rs1_1.getInt("No_Of_Days"); + + List citiesList = new ArrayList<>(); + citiesList.add(cities); + citiesList.add(String.valueOf(no_of_days)); + + // Get the sequence from the sorted details map based on the current package ID + List packageDetails = SortedDetailsMap.get(id); + String sequence = packageDetails != null ? packageDetails.get(packageDetails.size() - 1) : ""; + + // Creating key + String key_city = sequence + "&&&" + id + "@@@" + cities; + + // Store details + citiesMap.put(key_city, citiesList); + } + viewPackagesByCity(detailsMap, citiesMap, itinerariesMap, imagesMap, packageTypesMap, amenitiesMap); + break; + case 3: + System.out.println("Exiting..."); + break; + default: + System.out.println("Invalid choice!"); + break; + } + + } while (choice != 3); + + sc.close(); + con.close(); + } + + public static void viewAllPackages(Map> detailsMap, + Map> citiesMap, + Map> itinerariesMap, + Map> imagesMap, + Map> packageTypesMap, + Map> amenitiesMap) { + Scanner scanner = new Scanner(System.in); + // Iterate through all packages and display details + for (Map.Entry> entry : detailsMap.entrySet()) { + int packageId = entry.getKey(); + List details = entry.getValue(); + + System.out.println("Package ID: " + packageId); + System.out.println("Package Name: " + details.get(0)); + System.out.println("Description: " + details.get(1)); + System.out.println("Duration: " + details.get(2) + " days"); + System.out.println("Stars: " + details.get(3)); + System.out.println("Valid From: " + details.get(4)); + System.out.println("Valid To: " + details.get(5)); + System.out.println(); + } + System.out.println("Enter the package ID you want to view details for:"); + int selectedPackageId = scanner.nextInt(); + viewAllInfo(selectedPackageId, detailsMap, citiesMap, itinerariesMap, imagesMap, packageTypesMap, amenitiesMap); + } + + public static void viewPackagesByCity(Map> detailsMap, + Map> citiesMap, + Map> itinerariesMap, + Map> imagesMap, + Map> packageTypesMap, + Map> amenitiesMap) { + Scanner scanner = new Scanner(System.in); + System.out.println("Enter city name:"); + String city = scanner.nextLine(); + + for (Map.Entry> cityEntry : citiesMap.entrySet()) { + List cities = cityEntry.getValue(); + if (cities.contains(city)) { + String[] parts = cityEntry.getKey().split("&&&"); // Split the key string using "&&&" delimiter + String packageIdStr = parts[1].split("@@@")[0]; // Extract the package ID part before "@@@" delimiter + int packageIdFromCity = Integer.parseInt(packageIdStr); + + for (Map.Entry> entry : detailsMap.entrySet()) { + int packageId = entry.getKey(); + List details = entry.getValue(); + + if (packageIdFromCity == packageId) { + System.out.println("Package ID: " + packageId); + System.out.println("Package Name: " + details.get(0)); + System.out.println("Description: " + details.get(1)); + System.out.println("Duration: " + details.get(2) + " days"); + System.out.println("Stars: " + details.get(3)); + System.out.println("Valid From: " + details.get(4)); + System.out.println("Valid To: " + details.get(5)); + System.out.println(); + } + } + } + } + System.out.println("Enter the package ID you want to view details for:"); + int selectedPackageId = scanner.nextInt(); + viewAllInfo(selectedPackageId, detailsMap, citiesMap, itinerariesMap, imagesMap, packageTypesMap, amenitiesMap); + } + + public static void viewAllInfo(int selectedPackageId, + Map> detailsMap, + Map> citiesMap, + Map> itinerariesMap, + Map> imagesMap, + Map> packageTypesMap, + Map> amenitiesMap) { + Scanner sc = new Scanner(System.in); + // Display details of the selected package + if (detailsMap.containsKey(selectedPackageId)) { + List selectedPackageDetails = detailsMap.get(selectedPackageId); + + // Display package details + System.out.println("Selected Package Details:"); + System.out.println("Package ID: " + selectedPackageId); + System.out.println("Package Name: " + selectedPackageDetails.get(0)); + System.out.println("Description: " + selectedPackageDetails.get(1)); + System.out.println("Duration: " + selectedPackageDetails.get(2) + " days"); + System.out.println("Stars: " + selectedPackageDetails.get(3)); + System.out.println("Valid From: " + selectedPackageDetails.get(4)); + System.out.println("Valid To: " + selectedPackageDetails.get(5)); + System.out.println(); + System.out.println(); + + // Display cities for the selected package + System.out.println("Cities:"); + for (Map.Entry> cityEntry : citiesMap.entrySet()) { + String[] parts = cityEntry.getKey().split("&&&"); // Split the key string using "&&&" delimiter + String packageIdStr = parts[1].split("@@@")[0]; // Extract the package ID part before "@@@" delimiter + int packageIdFromCity = Integer.parseInt(packageIdStr); + + if ((packageIdFromCity) == (selectedPackageId)) { + System.out.println("City: " + cityEntry.getValue().get(0)); + System.out.println("NoOfDays: " + cityEntry.getValue().get(1)); + } + } + System.out.println(); + System.out.println(); + + // Display itineraries for the selected package + System.out.println("Itineraries:"); + for (Map.Entry> itiEntry : itinerariesMap.entrySet()) { + if ((itiEntry.getKey()) / 100 == selectedPackageId) { + System.out.println("Day: " + itiEntry.getValue().get(0)); + System.out.println("Description: " + itiEntry.getValue().get(1)); + } + } + System.out.println(); + System.out.println(); + + // Display images for the selected package + System.out.println("Images:"); + List images = imagesMap.get(selectedPackageId); + if (images != null) { + for (URL imageUrl : images) { + System.out.println(imageUrl); + } + } + System.out.println(); + System.out.println(); + + // Display package types and amenities for the selected package + List packageTypeKeys = new ArrayList<>(); + for (Map.Entry> packageTypeEntry : packageTypesMap.entrySet()) { + if (packageTypeEntry.getKey().startsWith(Integer.toString(selectedPackageId))) { + List packageType = packageTypeEntry.getValue(); + System.out.println(); + System.out.println("Package Type: " + packageType.get(0)); + System.out.println("Cost: " + packageType.get(1)); + System.out.println("Description: " + packageType.get(2)); + System.out.println("Amenities:"); + + // Display amenities for this package type + for (Map.Entry> amenityEntry : amenitiesMap.entrySet()) { + if (amenityEntry.getKey().contains(Integer.toString(selectedPackageId)) && amenityEntry.getKey().contains(packageType.get(0))) { + List amenityDetails = amenityEntry.getValue(); + System.out.println("- " + amenityDetails.get(0)); + } + } + } + } + + System.out.println(); + System.out.println("Do you want to book this package?(Y/N)"); + String c = sc.nextLine(); + if (c.equalsIgnoreCase("Y")) { + // Prompt the user to select a package type + System.out.println("Package Types:"); + System.out.println(); + + for (Map.Entry> packageTypeEntry : packageTypesMap.entrySet()) { + if (packageTypeEntry.getKey().startsWith(Integer.toString(selectedPackageId))) { + List packageType = packageTypeEntry.getValue(); + System.out.println("Package Type: " + packageType.get(0)); + System.out.println("Cost: " + packageType.get(1)); + } + } + + System.out.println(); + System.out.println("Select package type"); + // Get user input for the package type + String selectedPackageType = sc.nextLine(); + + // Check if the selected package type is valid + if (packageTypesMap.containsKey((String.valueOf(selectedPackageId)).concat(selectedPackageType))) { + // Valid package type selected, proceed with booking + + System.out.println("Enter name of lead passenger"); + String name= sc.nextLine(); + + System.out.println("Enter no of people:"); + int ppl = sc.nextInt(); + sc.nextLine(); + + boolean isPhoneNumberValid, isEmailValid; + + do { + // Prompt user to enter phone number + System.out.print("Enter lead passenger phone number: "); + String phoneNumber = sc.nextLine(); + + // Validate phone number + isPhoneNumberValid = isValidPhoneNumber(phoneNumber); + if (isPhoneNumberValid) { + System.out.println("Phone number is valid."); + } else { + System.out.println("Invalid phone number."); + } + } while (!isPhoneNumberValid); + + do { + // Prompt user to enter email ID + System.out.print("Enter lead passenger email ID: "); + String email = sc.nextLine(); + + // Validate email ID + isEmailValid = isValidEmail(email); + if (isEmailValid) { + System.out.println("Email ID is valid."); + } else { + System.out.println("Invalid email ID."); + } + } while (!isEmailValid); + + double cost = Double.parseDouble(packageTypesMap.get((String.valueOf(selectedPackageId)).concat(selectedPackageType)).get(1)); + double totCost = (ppl * cost) + (0.12 * ppl * cost); + System.out.println(); + System.out.println("CONGRATULATIONS!!! YOUR PACKAGE IS SUCCESSFULLY BOOKED"); + System.out.println(); + int currentYear = LocalDate.now().getYear(); + + // Generate a random four-digit number + int randomFourDigitNumber = (int) (Math.random() * 10000); + + // Format the random number as a string with leading zeros if necessary + String formattedRandomNumber = String.format("%04d", randomFourDigitNumber); + + // Construct the booking reference number + String bookingReferenceNumber = "BKR-" + currentYear + "-" + formattedRandomNumber; + + // Print the booking reference number + System.out.println("Your Booking Reference Number is: " + bookingReferenceNumber); + System.out.println(); + System.out.println("*****Booking Details*****"); + System.out.println("Package ID: " + selectedPackageId); + System.out.println("Package Name: " + selectedPackageDetails.get(0)); + System.out.println("Description: " + selectedPackageDetails.get(1)); + System.out.println("Duration: " + selectedPackageDetails.get(2) + " days"); + System.out.println("Star Rating: " + selectedPackageDetails.get(3)); + System.out.println("Cancellation Policy: " + selectedPackageDetails.get(6)); + System.out.println("Package Type: " + selectedPackageType); + System.out.println("Number of People: " + ppl); + System.out.println("Base Cost per Person: Rs " + cost); + System.out.println("Tax (12%): Rs " + (0.12 * ppl * cost)); + System.out.println("-------------------------------"); + System.out.println("Final Total (Including Tax): Rs " + totCost); + System.out.println(); + } else { + System.out.println("Invalid package type!"); + System.out.println(); + } + } + } else { + System.out.println("Invalid package ID!"); + System.out.println(); + } + } + + public static Map> sortbykey(Map> map) { + // TreeMap sorts the keys automatically + TreeMap> sortedMap = new TreeMap<>(map); + return sortedMap; + } + + public static void bubbleSortPackageTypesByCost(Map> packageTypesMap) { + List>> list = new LinkedList<>(packageTypesMap.entrySet()); + int n = list.size(); + for (int i = 0; i < n - 1; i++) { + for (int j = 0; j < n - i - 1; j++) { + int cost1 = Integer.parseInt(list.get(j).getValue().get(1)); + int cost2 = Integer.parseInt(list.get(j + 1).getValue().get(1)); + if (cost1 > cost2) { + // Swap elements + Collections.swap(list, j, j + 1); + } + } + } + // Convert sorted list back to map + packageTypesMap.clear(); + for (Map.Entry> entry : list) { + packageTypesMap.put(entry.getKey(), entry.getValue()); + } + } + + + public static Map> sortPackagesByDuration(Map> detailsMap, int a) { + // Convert Map to List of entries + List>> list = new LinkedList<>(detailsMap.entrySet()); + + // Sort the list based on duration + list.sort((o1, o2) -> { + if (a == 1) { + return o1.getValue().get(2).compareTo(o2.getValue().get(2)); + } else { + return o2.getValue().get(2).compareTo(o1.getValue().get(2)); + } + }); + + // Convert sorted list back to Map + Map> sortedMap = new LinkedHashMap<>(); + for (Map.Entry> entry : list) { + sortedMap.put(entry.getKey(), entry.getValue()); + } + return sortedMap; + } + + public static Map> sortPackagesByStarRatings(Map> detailsMap, int a) { + // Convert Map to List of entries + List>> list = new LinkedList<>(detailsMap.entrySet()); + + // Sort the list based on star ratings + list.sort((o1, o2) -> { + if (a == 1) { + return o1.getValue().get(3).compareTo(o2.getValue().get(3)); + } else { + return o2.getValue().get(3).compareTo(o1.getValue().get(3)); + } + }); + + // Convert sorted list back to Map + Map> sortedMap = new LinkedHashMap<>(); + for (Map.Entry> entry : list) { + sortedMap.put(entry.getKey(), entry.getValue()); + } + return sortedMap; + } + + public static Map> sortPackagesByCost(Map> detailsMap, int a) { + // Convert Map to List of entries + List>> list = new LinkedList<>(detailsMap.entrySet()); + + // Sort the list based on cost + list.sort((o1, o2) -> { + if (a == 1) { + return o1.getValue().get(9).compareTo(o2.getValue().get(9)); + } else { + return o2.getValue().get(9).compareTo(o1.getValue().get(9)); + } + }); + + // Convert sorted list back to Map + Map> sortedMap = new LinkedHashMap<>(); + for (Map.Entry> entry : list) { + sortedMap.put(entry.getKey(), entry.getValue()); + } + return sortedMap; + } + + public static int getMinCost(String packageId, Map> packageTypesMap) { + int minCost = Integer.MAX_VALUE; + for (Map.Entry> entry : packageTypesMap.entrySet()) { + if (entry.getKey().startsWith(packageId)) { + int cost = Integer.parseInt(entry.getValue().get(1)); + if (cost < minCost) { + minCost = cost; + } + } + } + return minCost; + } + + // Method to validate phone number + private static boolean isValidPhoneNumber(String phoneNumber) { + // Check if phone number contains only digits and has 10 characters + return phoneNumber.matches("[0-9]+") && phoneNumber.length() == 10; + } + + // Method to validate email ID + private static boolean isValidEmail(String email) { + // Check if email contains '@' symbol + return email.contains("@"); + } +}