package cn.vscoder.experiment_3.rent;

/*例3-5  用来处理图书租阅记录的实体类，设计了6个属性、2个构造方法、9个成员方法、1个内部类 */
import java.util.*;                     //加载工具类包的类，时间计算需要用到Calendar、Date
import cn.vscoder.experiment_3.book.RentBook;
import cn.vscoder.experiment_3.reader.VIPReader;
import cn.vscoder.experiment_3.common.DecF;            //自定义通用类，对double型值只保留2位小数

public class RentRecord        // 租书记录类
{
	private String bookNo;          //被租图书入库编号
	private int  readerID;          //读者编号
    private String rentDate="";     //租书日期，格式：20201015
    private String returnDate="";   //还书日期
    private  double rents;          //租金
    private int bonusPoints;        //积分

    public RentRecord(RentBook rb, VIPReader reader, String rentd)
    {
		this.bookNo = rb.getBookNo();
		this.readerID = reader.getReaderID();
		rentDate = rentd;
		returnDate = "";
		rents = 0;
		bonusPoints = 0;
	}

	public RentRecord(RentBook rb, VIPReader reader, String rentd, String returnd) //添加public修饰符
	{
		this(rb, reader, rentd);
		returnDate = returnd;
		bonusPoints = getBonusPoints();
	}

	public int getReaderID()          //获取读者编号
	{
		return readerID;
	}

	public String getBookNo()         //获取入库号
	{
		return bookNo;
	}

	public void setRentDate(String rentdate)    //设置租书日期
	{
		this.rentDate = rentdate;
	}

	public void setReturnDate(String returndate) //设置还书日期
	{
		this.returnDate = returndate;
	}

	public long sumRentdays()         //计算租阅总天数的成员方法
	{
		SumDays sd = new SumDays();   //创建内部类的对象
        return sd.setRentDays(rentDate, returnDate);  //调用内部类的方法计算租阅总天数
	}

	public void setRent(int deadTime, double nRent, double dRent, double pencent)   //计算租金
	{
		int rentDays = (int)sumRentdays();
		if(rentDays <= deadTime)
			rents = DecF.DecD(rentDays * nRent * pencent);  //在规定期限内按正常租阅费率计算租金
		else
			rents = DecF.DecD(((rentDays - deadTime) * dRent + deadTime * nRent) * pencent); //超期租金
	}

	public double getRent()              //获取租金
	{
		return rents;
	}

	public void setBonusPoints()        //计算积分
	{
		bonusPoints = bonusPoints + (int)sumRentdays(); //按照租阅天数累积会员积分，每天1分
	}

	public int getBonusPoints()        //获取积分
	{
		return bonusPoints;
	}

	public String toString()   //重写toString()方法
	{
		if(returnDate.length() == 0)   //借书时
			return " 入库号：" + getBookNo() + "  租借者：" + getReaderID() + " 租书日期：" + rentDate;
		else //还书时
			return " 入库号：" + getBookNo() + "  租借者：" + getReaderID() + " 租书日期：" + rentDate +
			       "  还书日期：" + returnDate + "  租阅天数：" + sumRentdays() + "  积分：" + getBonusPoints() +
			       "  租金：" + getRent();
	}

	/* 计算租阅总天数的内部类 */
	private class SumDays
	{
        Calendar c = Calendar.getInstance();

		public long setRentDays(String rentD, String sendD) //根据租书日期和还书日期计算租阅总天数
		{
			int y1 = Integer.parseInt(rentD.substring(0, 4));  //提取租书日期的年份
			int m1 = Integer.parseInt(rentD.substring(4, 6));  //提取租书日期的月份
			int d1 = Integer.parseInt(rentD.substring(6, 8));  //提取租书日期的日子
			c.set(y1, m1, d1);                                 //转化为日期型
			long getDate = c.getTimeInMillis();                //租书时间转化为毫秒数

			int y2 = Integer.parseInt(sendD.substring(0, 4));  //提取还书日期的年份
			int m2 = Integer.parseInt(sendD.substring(4, 6));  //提取还书日期的月份
			int d2 = Integer.parseInt(sendD.substring(6, 8));  //提取还书日期的日子
			c.set(y2, m2, d2);
			long sendDate = c.getTimeInMillis();               //还书时间转化为毫秒数

			long rentDays = (sendDate - getDate) / (1000 * 60 * 60 * 24); //计算租书和还书日期相差天数
			return rentDays;
	    }
	}
}