package cn.vscoder.experiment_2;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * * 任务4-3：定义顾客类
 * * 目标：设计一个顾客类，能够购买食品和玩具两类商品，并输出相关信息。
 * * 步骤：
 * * 1.声明顾客类Customer。
 * * 2.定义顾客属性，如姓名（String）、年龄（int）、联系方式（String）等。
 * * 3.提供构造方法初始化顾客信息。
 * * 4.实现购买商品的方法，接收商品列表和数量，计算总价值。
 * * 5.定义输出顾客信息、购买的商品信息、商品总价值的方法。
 * * 自定义反映商品折扣情况的方法，以及折扣后应付金额等信息的输出。
 */

public class Customer {
    private String name;

    private String age;

    private char sex;

    private String phone;

    private boolean isVip = false;

    private Map<Product, Integer> products = new HashMap<>();

    @Override
    public String toString() {
        return "Customer{" +
                "姓名='" + name + '\'' +
                ", 年龄='" + age + '\'' +
                ", 性别='" + sex + '\'' +
                ", 手机号='" + phone + '\'' +
                ", \n=====================商品列表=====================\n" +
                all_product() +
                "\n总金额：" + all_product_price() +
                "\n是否vip：" + (isVip ? "是\t享受优惠：整单8折" : "否") +
                "\n实际支付：" + payment() +
                "\n==================================================";
    }

    // 购买方法
    public double buy(Product product, int num) {

        add_product(product, num);

        // 返回该商品的总价格
        return product.getProduct_price() * num;
    }

    // 将商品加入商品列表
    public void add_product(Product product, int num) {
        // 判断商品是否存在列表中，不存在则创建 并 赋值，存在则累加
        if (!products.containsKey(product)) {
            products.put(product, num);
        } else {
            int lastNum = products.get(product);
            lastNum += num;
            this.products.put(product, lastNum);
        }
    }

    // 获取所有商品列表
    public String all_product() {
        // 获取到所有的商品key对象
        Set<Product> productSet = this.products.keySet();
        StringBuilder sb = new StringBuilder();
        // 遍历所有商品，输出商品信息
        for (Product product : productSet) {
            int num = this.products.get(product);
            sb.append("商品名：").append(product.getProduct_name())
                    .append("\t单价：").append(product.getProduct_price())
                    .append("\t购买数量：").append(num).append("\t金额：")
                    .append(String.format("%.2f", product.getProduct_price() * num)).append('\n');
        }
        return sb.toString();
    }

    // 获取商品价格
    public String all_product_price() {
        // 获取到所有的商品key对象
        Set<Product> productSet = this.products.keySet();
        double price = 0; // 设置价格进行累加
        // 遍历所有商品，取出单价 * 数量 并进行累加
        for (Product product : productSet) {
            int num = this.products.get(product);
            price += product.getProduct_price() * num;
        }
        return String.format("%.2f", price);
    }

    // 获取实际支付金额
    public String payment() {
        // 获取到总价格
        double price = Double.parseDouble(all_product_price());
        // 判断是否vip
        if (isVip) {
            price *= 0.8;
        }
        return String.format("%.2f", price);
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public boolean isVip() {
        return isVip;
    }

    public void setVip(boolean vip) {
        isVip = vip;
    }

    public Customer(String name, String age, char sex, String phone, boolean isVip) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.phone = phone;
        this.isVip = isVip;
    }

    public Customer() {
    }
}